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

2.2. Методы противодействия дизассемблированию программного обеспечения

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

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

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

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

2. Самомодификация кода программой. В данном случае, средства статического исследования ПО также не смогут верно воспринять участки кода, модифицируемые в процессе работы программы, ей самой. Следует отметить, что самомодифицироваться программы могут только при работе процессора реальном режиме (не в защищенном).

3. Различные ходы, приводящие к обману дизассемблера. Этот способ заключается в том, чтобы с помощью различных «хитрых» ходов запутать дизассемблер, подсунув данные вместо кода, или дизориентировать его логику, повести его по ложному следу. В качестве примеров такой защиты можно привести следующие участки кода.

Пример 2.1.

00000000: B83534 Mov ax, 03435; “45”

00000000: EBFC jmps 00000001

……дальнейший код.

После выполнения данных инструкций, дальнейший код программы, воспринятый дизассемблером будет совершенно неверен., так как программа перейдет на инструкцию 3534EB, что соответствует команде xor ax, 0EB34h. На самом же деле программой выполняется следующий код.

Mov ax,03435

Xor ax,0EB34 <- инструкция дизассемблером пропущена.

…… дальнейший код.

Пример 2.2.

Labellone:

Mov ax, 0CEBh

Jmp labellone+1

Db 1,2,3,4,5,6,7,8,9,0

Mov ax,1234h

Ret

Данная защита аналогична примеру 2.1.

Существуют и чисто психологические способы защиты, которые сбивают с толку не дизассемблер, а человека, анализирующего текст программы после дизассемблирования. Например, обмен векторов прерываний 21h и 10h, или обращение к порту 378h как к 8378h.

4. Сокрытие команд передачи управления.

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

Пример 2.3.

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

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

……

m: jmp place

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

……

Пример 2.4.

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

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

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

……

m: CALL far 0000h

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

……

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

5. Использование методики косвенной передачи управления также затрудняет анализ дизассемблированного кода.

Mov bx,1234h

Jmp dword ptr cs:[bx]

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

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

Таблица 2.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

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

7. Использование ссылок вида [EAX+0ffffff64h] (в качестве эквивалента [EAX-9Ch]) с целью затруднения анализа дизассемблированных текстов человеком.

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]