logo search
622231 / 622221с / очн 622221с / ПАЗИ 622221с / КЛ_ПАЗИ

Защита от отладки, основанная на особенностях конвейеризации процессора

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

Пример 7.

00000100: 810600010200 add word ptr [100], 01

00000106: B406 mov ah,06 – прямой ввод через консоль

00000108: B207 mov dl,07

0000010A: CD21 int 21h

0000010C: C3 Ret

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

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

Если команда cmd1 изменит «образ» команды cmd2, стоящей в очереди в конвейере, на «образ» cmd2`, то это никак не отразится на ходе выполнения программы на реальном процессоре, поскольку процессор перейдет к исполнению следующей команды из очереди (cmd2). В режиме же трассировки после выполнения команды cmd1 произойдет вызов трассировочного прерывания. При возврате из прерывания очередь команд сбрасывается и из памяти выбирается модифицированная команда cmd2', что изменяет логику работы программы.

Отладчик «увидит» пример 8.7 следующим образом:

0100 8106000102 Add word ptr [100], 01

0105 00B406B2 Add [si-4DFA],Dh

0109 07 pop es

010A CD21 int 21h

010C C3 ret

Аналогичный эффект демонстрировался в примере 8.8.

Пример 8.

...

mov byte ptr _cmd2,0F9h ; 0F9h -- код операции stc

_cmd2:

clc ; clc выполнится без отладчика, stc – под отладчиком

jc tracing

... ; код "нормального" режима

... ; выполнения программы

tracing:

... ; работа под отладчиком!

В данном примере команда mov byte ptr _cmd2, 0F9h (cmd1) осуществляет замену следующей команды clc (cmd2) на stc (cmd2'). При работе на реальном процессоре вместо команды stc будет выполнена «старая» команда clc, которая к этому моменту уже находится в очереди команд. При выполнении этого фрагмента под отладкой очередь команд будет сброшена и выполнится команда stc, что вызовет переход по метке tracing.