Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции ЗКИ.docx
Скачиваний:
0
Добавлен:
21.01.2020
Размер:
1.06 Mб
Скачать
      1. Базовые методы противодействия дизассемблированию по

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

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

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

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

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

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

Пример 9.3.

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

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

……

m: jmp place;

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

……

Пример 9.4.

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

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

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

……

m: CALL far 0000h;

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

……

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

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

Пример 9.5

Mov bx, 1234h

Jmp dword ptr cs:[bx]

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

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

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

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

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

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

int 13h

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

push cs

mov ax, offset m

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

xor ax,ax

mov es,ax

jmp dword ptr es:[13h*4]

m:

ret

pop bx

jmp bx

Iret

Mov bp,sp

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

add sp, 4; точка возврата

popf

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

Пример 9.6

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

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

Seg000:0105 db 0B9h; фрагмент данных

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

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

Seg000:0000 add si,6;

Seg000:0003 jmp si;

Seg000:0005 mov cx, 14BEh;

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