logo search
PASOIB

2.1.1. Защита от отладчиков реального режима

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

Трик 1

Данная ловушка основана на том, что вследствие аппаратной особенности реализации процессора INTEL, после исполнения команды pop ss первое прерывание не может быть вызвано, и отладчик «не замечает» и пропускает следующую за данной командой инструкцию. Механизм защиты в данном случае может выглядеть следующим образом.

……

Push ss;

Pop ss;

Защита

Pushf;

Кладем в стек значение флагового регистра. Данную команду отладчик не замечает и не исполняет

Pop ax;

Восстанавливаем ax из стека. В случае наличия отладчика в памяти, мы извлечем не флаговый регистр

Test ax,100h;

Проверка флага на трассировку. Подразумевается, что если мы под отладчиком, то проверка не пройдет

Jnz DebuggerDetected;

Переход на процедуру завершения работы

……

Трик 2

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

Механизм защиты может выглядеть в данном случае следующим образом.

……

Xor dx,dx;

Обнуляем регистр dx

Mov ds,dx;

Обнуляем регистр ds

Mov ax, 2501h;

Int 21h;

Функция 25, подфункция 1. Вектор обработчика первого прерывания устанавливается на адрес 0000:0000

……

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

Точка останова используются отладчиком следующим образом.

В код программы вставляется вместо данной точки код 0xCC, а значение памяти, которое находилось по его адресу, запоминается отладчиком.

Когда программа встречает команду с кодом 0xCC, она вызывает исключительную ситуацию 0x3h. При этом в стеке запоминается регистр флагов, указатель текущего кодового сегмента (CS), указатель команд IP, запрещаются прерывания (очищается флаг FI) и сбрасывается флаг трассировки.

После выполнение действий п.2, программа поступает в монопольное распоряжение процессора.

Обычно, при входе в отладчик, он сохраняет текущие значения всех регистров программы, а потом обращается к ним через стек, либо присваивает своим локальным переменным.

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

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

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

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

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

Трик 3 Аппаратное запрещение прерываний

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

Способ 1

……

In al, 21h

Or al, 00000010b

Out 21h,al

Способ 2

In al, 61

Or al, 10000000b

Out 61h, al

Способ 3

Mov al, 0Adh

Out 64h,al

Трик 4. Перепрограммирование видеоадаптера

Многие отладчики реального режима перестают корректно работать, если запретить видеовывод через прерывание int 10h.