sbh
@sbh

Как реализовать проверку целостности программы?

Вопрос больше теоретический: каким образом программы реализуют проверку целостности самих себя?
1 момент - допустим мы посчитали хеш файла, но как только мы будем записывать константу в код - сумма файла изменится.

2 момент - почему нельзя просто занопить процедуру проверки суммы в такой программе и обойти проверку?
  • Вопрос задан
  • 2013 просмотров
Пригласить эксперта
Ответы на вопрос 4
usdglander
@usdglander
Yipee-ki-yay
1. Обычно считается контрольная сумма секции кода, а эталонная сумма храниться в секции данных.
2. Можно занопить, поэтому используют всякое шифрование кусков кода, а в момент исполнения - расшифровывают.
На самом деле стопроцентной защиты нет и быть не может. Просто стоимость взлома должна быть больше стоимости программы. Никто не будет тратить неделю на взлом программы, которая стоит 50 рублей.
Ответ написан
Neuroware
@Neuroware
Программист в свободное от работы время
Как уже сказал Никита Пустовалов 100% защиты нет, конкретный метод зависит от языка программирования, к примеру на C# можно сделать примерно так, все "важные" данные выносятся в отдельный модуль, в него же выносится функция для вычисления хэша и она в идеале нестандартная или состоит из нескольких стандартных (чтобы усложнить). После загрузки модуля в память из него вычитывается "тело", телом фактически является dll в памяти, от "тела" с помощью метода из модуля вычисляется хэш и сравнивается с эталонным(т.к. операция не очень дорогая можно делать хоть перед каждым вызовом). В таком случае модуль нужно защищать всеми возможными средствами, на остальное можно забить, т.к. все критичное в модуле. И да, если модуль смогут деобфусцировать и перекомпилировать изменив метод расчета хэша и эталон то защиту обошли, поэтому в любом случае придется думать как защитить от декомпиляции модуль. Просто так "занопить" тут уже не получится, а деобфускация с возможностью перекомпилировать модуль даже на .net не всегда простая задача.
Ответ написан
Комментировать
EvilsInterrupt
@EvilsInterrupt
System programming, Reversing Engineering, C++
Если бы все было так просто, то не было бы столько предолжений защит ПО типа Enigma, Themida и др. Если хотите окунуться с головой в эту область, то рекомендую проследовать на форум Wasm.ru и читать до просветления.

В целом решение "на коленке":
1. Подсчитать от куска кода хэш во время накладывания защиты и считать это эталонным хэшем. Подсчитывать в момент выполнения и сравнивать с эталонной.
2. Во время выполнения получать контекст, брать значения отладочных регистров и xor-ить с кодом. Если кто-то поставил бряк, то значит в отладочном регистре будет значение указателя, тем самым не нулевое значений, то попортит код.
3. Поиск окон с названием от regmon, ollydbg и др.
4. Все значимые строковые константы шифровать на этапе защиты и во время работы расшифровывать
5. Занулять описатели секций, т.е. массив из структур IMAGE_SECTION_HEADER находящийся в PE-заголовке
6. В заголовке найти DataDirectory[DEBUG_DIR_INDEX] и поставить на область в вашем приложение, в этой области сгенерировать мусор

Но повторюсь, это "на коленке"
Ответ написан
abs0lut
@abs0lut
1 момент - допустим мы посчитали хеш файла, но как только мы будем записывать константу в код - сумма файла изменится.


Хеш можно хранить отдельно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы