Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПАЗИ.docx
Скачиваний:
14
Добавлен:
25.04.2019
Размер:
147.65 Кб
Скачать

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

Защита программ от дизассемблирования. Существует несколько методов противодействия дизассемблированию: • архивация; • шифрование; • использование самогенерирующих кодов; • усложнение структуры программы. Архивацию можно рассматривать как простейшее шифрование. Причем архивация может быть объединена с шифрованием. Комбинация таких методов позволяет получать надежно закрытые компактные программы. Зашифрованную программу невозможно дизассемблировать без расшифрования. Зашифрование (расшифрование) программ может осуществляться аппаратными средствами или отдельными программами. Такое шифрование используется перед передачей программы по каналам связи или при хранении ее на ВЗУ. Дизассемблирование программ в этом случае возможно только при получении доступа к расшифрованной программе, находящейся в ОП перед ее выполнением (если считается, что преодолеть криптографическую защиту невозможно). Соответственно, требуются специальные приемы программирования для борьбы с дизассемблером и защиты от отладчиков. Для затруднения дизассемблирования лучше всего подходит шифрование отдельных участков программ или всей программы целиком. После загрузки программу следует расшифровать в оперативной памяти и передать ей управление. Еще лучше выполнять динамическое расшифровывание программы по мере ее выполнения, когда участки программы расшифровываются непосредственно перед использованием и после использования сразу же уничтожаются. При расшифровывании можно копировать участки программы в другое место оперативной памяти. Пусть, например, программа состоит из нескольких частей. После ее загрузки в оперативную память управление передается первой части программы. Эта часть предназначена для расшифровки второй части, которая находится в памяти вслед за первой. Задача второй части - перемещение третьей части программы на место уже использованной первой части и расшифровка ее там. Третья часть, получив управление, может проверить свое расположение относительно префикса программного сегмента и, в случае правильного расположения (сразу вслед за PSP), начать загрузку сегментных регистров такими значениями, которые необходимы для выполнения четвертой (установочной) части программы. Если попытаться дизассемблировать программу, составленную подобным образом, то из этого ничего не получится. Сущность метода, основанного на использовании самогенерируемых кодов, заключается в том, что исполняемые коды программы получаются самой программой в процессе ее выполнения. Самогенерируемые коды получаются в результате определенных действий над специально выбранным массивом данных. В качестве исходных данных могут использоваться исполняемые коды самой программы или специально подготовленный массив данных. Данный метод показал свою высокую эффективность, но он сложен в реализации. Второй способ борьбы с дизассемблером является, по своей сути, борьбой с человеком, занимающимся дизассемблированием. Он заключается в увеличении размера загрузочного модуля программы до сотни-другой Кбайт и в усложнении структуры программы. Объем листинга, получающегося при дизассемблировании программы размером в 30 - 40 Кбайт, достигает 1 - 1,5 Мбайт. Поэтому большие размеры установочной программы могут сильно увеличить время обнаружения средств защиты. Усложнение структуры программы может включать в себя обращения к одной и той же области памяти, содержащей многочисленные переменные, разные сегментные адреса. Поэтому очень трудно сразу догадаться, что на самом деле программа работает с одной и той же областью памяти. "Обман" дизассемблера осуществляется несколькими способами: • нестандартная структура программы; • скрытые переходы, вызовы процедур, возвраты из них и из прерываний; • переходы и вызовы подпрограмм по динамически изменяемым адресам; • модификация исполняемых кодов. Для дезориентации дизассемблера часто используются скрытые переходы, вызовы и возвраты за счет применения нестандартных возможностей команд. Маскировка скрытых действий часто осуществляется с применением стеков.