Универсальным методом противодействия дисассемблированию программы является шифрование. Очевидно, что дисассемблирование зашифрованного кода бесполезно.
Применяя шифрование кода программы для противодействия дисассемблированию, следует учитывать распространенные ошибки реализации данного метода. Напомним их. Во-первых, неэффективной является такая реализация, когда исполняемый код в полном объеме и однократно шифруется / дешифруется (так как легко найти момент после дешифрования). Во-вторых, необходимо осуществить выбор эффективного ключа и, если необходимо, надежно хранить ключ. И в-третьих, следует учесть, что для защиты программ от дисассемблирования, не рекомендуется использование симметричных криптографических алгоритмов.
Рекомендуется использовать шифрование с открытым ключом (алгоритм RSA, шифр Эль-Гамаля и др.). В этом случае возможная удачная попытка расшифровать код и понять логику работы защитного механизма не позволит внести изменения в защищенный код, так как для полноценной последующей работы программы эти изменения необходимо внедрить в код в зашифрованном виде. А нарушителю доступен лишь ключ для расшифровки. Возможная атака в данном случае - нахождение «секретного» ключа с помощью трудоемких математических вычислений в зависимости от используемого алгоритма шифрования.
|
|
Усиливает защиту динамическое шифрование и многопроходная расшифровка кода.
На практике неплохо зарекомендовали себя и методы, использующие вместе с шифрованием архивирование программного кода. К достоинствам данного метода относят и уменьшение размера исполняемого файла. Однако следует учитывать, что алгоритмы работы широко используемых архиваторов известны многим взломщикам.
Широко распространены на практике методы, основанные на динамическом изменении кода программы в процессе выполнения. Суть этих методов сводится к получению истинных исполнимых команд на этапе выполнения программы путем некоторого преобразования первоначальных кодов. Часто этот способ защиты называют самогенерируемыми, или самомодифицирующимися кодами. Авторы предлагают различные преобразования, например,
·перемещения участков кода;
· всевозможные функции от истинного кода (контрольной суммы истинного кода);
· или для генерации кода одного участка используют коды предыдущего (или какого-нибудь другого) участка программы (так называемая обратная связь).
Интересный прием защиты от дисассемблирования - использование нестандартной структуры программы. В этом случае дисассемблер «не поймет» нестандартную сегментацию программы.