Защита программ от дисассемблирования

Универсальным методом противодействия дисассемблированию программы является шифрование. Очевидно, что дисассемблирование зашифрованного кода бесполезно.

Применяя шифрование кода программы для противодействия дисассемблированию, следует учитывать распространенные ошибки реализации данного метода. Напомним их. Во-первых, неэффективной является такая реализация, когда исполняемый код в полном объеме и однократно шифруется / дешифруется (так как легко найти момент после дешифрования). Во-вторых, необходимо осуществить выбор эффективного ключа и, если необходимо, надежно хранить ключ. И в-третьих, следует учесть, что для защиты программ от дисассемблирования, не рекомендуется использование симметричных криптографических алгоритмов.

Рекомендуется использовать шифрование с открытым ключом (алгоритм RSA, шифр Эль-Гамаля и др.). В этом случае возможная удачная попытка расшифровать код и понять логику работы защитного механизма не позволит внести изменения в защищенный код, так как для полноценной последующей работы программы эти изменения необходимо внедрить в код в зашифрованном виде. А нарушителю доступен лишь ключ для расшифровки. Возможная атака в данном случае - нахождение «секретного» ключа с помощью трудоемких математических вычислений в зависимости от используемого алгоритма шифрования.

Усиливает защиту динамическое шифрование и многопроходная расшифровка кода.

На практике неплохо зарекомендовали себя и методы, использующие вместе с шифрованием архивирование программного кода. К достоинствам данного метода относят и уменьшение размера исполняемого файла. Однако следует учитывать, что алгоритмы работы широко используемых архиваторов известны многим взломщикам.

Широко распространены на практике методы, основанные на динамическом изменении кода программы в процессе выполнения. Суть этих методов сводится к получению истинных исполнимых команд на этапе выполнения программы путем некоторого преобразования первоначальных кодов. Часто этот способ защиты называют самогенерируемыми, или самомодифицирующимися кодами. Авторы предлагают различные преобразования, например,

·перемещения участков кода;

· всевозможные функции от истинного кода (контрольной суммы истинного кода);

· или для генерации кода одного участка используют коды предыдущего (или какого-нибудь другого) участка программы (так называемая обратная связь).

Интересный прием защиты от дисассемблирования - использование нестандартной структуры программы. В этом случае дисассемблер «не поймет» нестандартную сегментацию программы.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: