Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
156
Добавлен:
10.05.2015
Размер:
10.64 Mб
Скачать

Лекция 29 Базовые методы противодействия дизассемблированию по

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

Методы защиты ПО от дизассемблирования пытаются «обмануть» дизассемблера, заставить его сбиться, произвести дизассемблирование неверно, перепутать код и данные, выдать на своем выходе «мусор». В этом случае злоумышленник не сможет правильно исследовать логику работы ПО.

Рассмотрим несколько основных подходов к защите ПО от дизассемблирования.

1. Шифрование кода программы. Защищаемый участок кода шифруется каким-либо алгоритмом, а в программу добавляется модуль дешифрования, который в нужный момент дешифрует его и передаст ему управление. Защищаемый участок кода перед дизассемблером предстанет в зашифрованном виде и будет воспринят дизассемблером неверно, на выходе дизассемблера будет сформирован «мусор».

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

2. Сокрытие команд передачи управления. Реализация данного подхода к защите приводит к тому, что дизассемблер не может построить граф передачи управления, и, соответственно, человек должен будет сам вычислять адрес перехода. Например, можно модифицировать адреса переходов при выполнении программы. Если команда модификации и модифицируемая команда достаточно далеко разнесены друг от друга, то велика вероятность того, что человек упустит эту модификацию из виду.

Пример 3.

Mov word ptr cs:m[1],1234h;

модификация адреса перехода

……

m: jmp place;

вместо метки place ранее внесен другой адрес

……

Пример 4.

mov word ptr cs:m[1],es;

модификация адреса вызываемой подпрограммы

mov word ptr cs:m[3],5678h

……

m: CALL far 0000h;

данный адрес перехода был ранее модифицирован

……

3. Использование косвенной передачи управления.

Данный подход к защите можно проиллюстрировать следующим примером.

Пример 5

Movbx, 1234h

Jmpdwordptrcs:[bx]

4. Использование нестандартных способов передачи управления

Для затруднения изучения дизассемблированного кода могут использоваться нестандартные способы передачи управления, по каким либо адресам. Разработчик может, например, моделировать работу операторов JMP, CALL, INT… средствами других операторов, что затруднит понимание листинга на языке ассемблера. Примеры возможных альтернативных записей команд передачи управления приведены в таблице 8.1.

Табл. 8.1. Примеры возможных альтернативных записей команд передачи управления

Первичный код

Альтернативный код

Jmp m

m:

Mov ax, offset m

Push ax

Ret

m:

Call subr

m:

subr:

Ret

Mov ax, offset m

Push ax

Jmp subr

m:

subr:

Ret

int13h

pushf; флаги в стек

pushcs

movax,offsetm

pushax; занести в стек адрес возврата

xor ax,ax

mov es,ax

jmp dword ptr es:[13h*4]

m:

ret

pop bx

jmp bx

Iret

Movbp,sp

Jmpdwordptr[bp]; переход на точку возврата из прерывания

addsp, 4; точка возврата

popf

5. Осуществление короткого переходавперед, а между командой перехода и адресом перехода добавление «мусора». В данном случае, можно добиться совершенно неверного результата дизассемблирования, в особенности для автоматических дизассемблеров.

Пример 6

Seg000:0100addsi, 6; фрагмент кода

Seg000:0103jmpsi; фрагмент кода

Seg000:0105db0B9h; фрагмент данных

Seg000:0106movsi, 114h; фрагмент кода

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

Seg000:0000 add si,6;

Seg000:0003 jmp si;

Seg000:0005 mov cx, 14BEh;

Seg000:0008 add [di+5691h], bp

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