Читайте также:
|
|
Дизассемблирование машинного кода злоумышленником проблематично даже в том случае, когда противодействие ему не предусмотрено. Задача автоматической идентификации какого-то участка программы как данных или как кода довольно сложна и неоднозначна: программист может использовать код как данные или наоборот.
Методы защиты ПО от дизассемблирования пытаются «обмануть» дизассемблера, заставить его сбиться, произвести дизассемблирование неверно, перепутать код и данные, выдать на своем выходе «мусор». В этом случае злоумышленник не сможет правильно исследовать логику работы ПО.
Рассмотрим несколько основных подходов к защите программного обеспечения от дизассемблирования.
1. Шифрование кода программы.
Защищаемый участок кода шифруется каким-либо алгоритмом, а в программу добавляется модуль дешифрования, который в нужный момент дешифрует его и передаст ему управление. Защищаемый участок кода перед дизассемблером предстанет в зашифрованном виде и будет воспринят дизассемблером неверно, на выходе дизассемблера будет сформирован «мусор».
Данный метод при неправильном использовании достаточно уязвим ввиду того, что алгоритм расшифровки доступен взломщику, необходимо лишь найти его и произвести расшифровку. Поэтому шифрование должно производиться на секретном ключе, который доступен только легальному пользователю и никому другому.
2. Сокрытие команд передачи управления.
Реализация данного подхода к защите приводит к тому, что дизассемблер не может построить граф передачи управления, и, соответственно, человек должен будет сам вычислять адрес перехода. Например, можно модифицировать адреса переходов при выполнении программы. Если команда модификации и модифицируемая команда достаточно далеко разнесены друг от друга, то велика вероятность того, что человек упустит эту модификацию из виду.
Пример
Mov word ptr cs:m[1],1234h; | модификация адреса перехода |
… | |
m: jmp place; | вместо метки place ранее внесён другой адрес |
… |
3. Использование косвенной передачи управления.
Данный подход можно проиллюстрировать следующим примером.
Пример
Mov bx, 1234h
…
Jmp dword ptr cs:[bx]
4. Использование нестандартных способов передачи управления.
Для затруднения изучения дизассемблированного кода могут использоваться нестандартные способы передачи управления, по каким либо адресам. Разработчик может, например, моделировать работу операторов JMP, CALL, INT средствами других операторов, что затруднит понимание листинга на языке ассемблера. Примеры возможных альтернативных записей команд передачи управления приведены в таблице.
Табл. Примеры возможных альтернативных записей команд передачи управления
Первичный код | Альтернативный код |
… 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. Осуществление короткого перехода вперёд, а между командой перехода и адресом перехода добавление «мусора».
В данном случае, можно добиться совершенно неверного результата дизассемблирования, в особенности для автоматических дизассемблеров.
Пример
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
Дата добавления: 2015-07-08; просмотров: 387 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Базовые методы противодействия отладчикам | | | Шифрование кода программы как универсальный метод противодействия отладке и дизассемблированию |