Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
622231 / 622231 / очн 622231 / ПАЗИ 622231 / КЛ_ПАЗИ.doc
Скачиваний:
155
Добавлен:
10.05.2015
Размер:
10.64 Mб
Скачать

Защита программ от трассировки

Защищая свои программы от несанкционированного копирования, не следует забывать о таких средствах «взлома», как пошаговые отладчики — Turbo Debugger, CodeView, Advanced Fullscreen Debug, AT86 и т. п.

Используя отладчики, искушенные в своем деле системные программисты рано или поздно смогут обнаружить и отключить (или обмануть) средства защиты от копирования.

Стандартный метод обнаружения средств защиты от копирования дизассемблирование программы установки или выполнение ее под управлением пошагового отладчика. Листинг, получаемый в процессе дизассемблирования, оказывает большую услугу при использовании отладчика, поэтому эти два средства — дизассемблирование и использование отладчика — обычно используются вместе.

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

Для затруднения дизассемблирования лучше всего подходит шифрование отдельных участков программ или всей программы целиком. После загрузки программу следует расшифровать в оперативной памяти и передать ей управление. Еще лучше выполнять динамическое расшифровывание программы по мере ее выполнения, когда участки программы расшифровываются непосредственно перед использованием и после использования сразу же уничтожаются.

При расшифровывании можно копировать участки программы в другое место оперативной памяти.

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

Задача второй части — перемещение третьей части программы на место уже использованной первой части и расшифровка ее там.

Третья часть, получив управление, может проверить свое расположение относительно префикса программного сегмента и, в случае правильного расположения (сразу вслед за PSP), начать загрузку сегментных регистров такими значениями, которые необходимы для выполнения четвертой (установочной) части программы.

Если попытаться дизассемблировать программу, составленную подобным образом, то из этого ничего не получится.

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

Лекция 27

1. Базовые методы нейтрализации систем защиты от несанкционированного использования

Нейтрализация системы защиты ПО от несанкционированного использования может вестись по двум направлениям.

1. Определение модели программно-аппаратной среды функционирования защищенной программы, которая описывает перечень идентифицирующих элементов среды, а также их параметров с целью воспроизведения копии среды. Атака в данном случае осуществляется на блок установки характеристик среды. Примером этого направления является воспроизведение копии ключевой дискеты, реализация эмулятора электронного ключа HASP, выяснение серийного номера, требуемого для регистрации продукта и т.д.

2. Определение модели алгоритма сравнения установленных значений характеристик программно-аппаратной среды с эталонными с целью искажения кода сравнения таким образом, чтобы результат сравнения всегда был истинным, т.е. чтобы система защиты всегда опознавала текущую копию как легальную. Атака в данном случае осуществляется на блок сравнения характеристик среды или блок ответной реакции.

Предпочтительность использования первого подхода для злоумышленника определяется более качественным взломом программного продукта без необходимости модификации кода, однако требует больших усилий от злоумышленника и при грамотно реализованной защите может вызвать большие трудности, либо невозможность реализации за приемлемое время. Реализация второго подхода может оказаться более простой для злоумышленника, однако в некоторых случаях сопряжена с рядом проблем: модификация кода может привести к его неработоспособности, кроме этого, сравнение установленных значений программно-аппаратной среды с эталонными может производиться много раз и быть распределено в коде программы, что затрудняет поиск данных участков кода злоумышленником.

Перед началом атаки злоумышленник, как правило, пытается выполнить программу несколько раз, чтобы определить особенности системы защиты.

Рассмотрим некоторые возможности злоумышленника при реализации второго подхода к нейтрализации защиты от несанкционированного использования.

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

0908:0140 CMP BYTE PTR [А76С],00

0908:0145 JNZ 014B

0908:0148 CALL OC50

0908:014B MOV AH, 18

Первая строка данного кода проверяет значение, содержащееся в ячейке памяти с адресом A76C. Если в памяти содержится значение 00, команда сравнения поставит флаг Z процессора в положение "включен", а если любое другое значение - в положение "выключен".

Во второй строке кода на основании результатов выполнения команды сравнения, команда условного перехода JNZ принимает решение, производить ли переход. Команда JNZ выполнит переход на четвертую строку кода, если флаг Z "выключен" Таким образом, вызов подпрограммы, которая выводит на экран предупреждения, в третьей строке будет обойден. Если же флаг Z "включен", переход не произойдет, и вызов будет выполнен.

Третья строка кода содержит вызов некоторой подпрограммы, который злоумышленник и собирается нейтрализовать.

Четвертая строка кода - некая следующая команда в программе

Таким образом, задача злоумышленника состоит в том, чтобы обойти вызов подпрограммы в третьей строке. Для этого существует несколько способов. Например, можно заменить команду условного перехода JNZ 014В на команду безусловного перехода JMP 014В. В этом случае вызов третьей строки будет обойден независимо от того, что содержится в памяти по адресу, на который ссылается первая строка кода. В этом случае модификация кода подсистемы защиты сведется к модификации одного единственного байта.

Можно также внести такие изменения, чтобы заменить команду JNZ 014В на инверсную ей - JZ 014В, т.е. переход будет сделан, когда в памяти содержится 00. Возможна замена CMP BYTE PTR [A76C],00 на команду JMP 014В. В последнем случае требуется дополнить команду JMP 014В командой NOP для выравнивания размера кода команды. Наконец, возможна замена вызова процедуры CALL OC50 в третьей строке на 3 команды NOP

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

Соседние файлы в папке ПАЗИ 622231