Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
622231 / 622231 / очн 622231 / ПАЗИ 622231 / КЛ_ПАЗИ.doc
Скачиваний:
155
Добавлен:
10.05.2015
Размер:
10.64 Mб
Скачать

Базовые методы противодействия отладчикам

Противодействие отладке затрудняет злоумышленнику трассировку ПО, а значит локализацию и исследование ПО и модуля защиты.

Методы борьбы с отладчиками можно подразделить на следующие группы [Error: Reference source not found].

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

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

  3. Использование недокументированных команд и недокументированных возможностей процессора.

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

Работа данных отладчиков построена на использовании двух аппаратных прерываний:

int 1, с помощью которого выполняется пошаговое исполнение программы, и

int 3, с помощью которого в код отлаживаемой программы внедряются точки останова (breakpoints).

При трассировке программы отладчиком задействуется регистр флагов, а именно флаг трассировки TF (восьмой бит регистра флагов при нумерации с нуля), однако, непосредственная его проверка внутри программы для обнаружения отладчика может оказаться безрезультатной, так как большинство отладчиков эмулируют «чистый» регистр отладки.

Основываясь на данных фактах, приведем примеры нескольких триков для отладчиков реального режима:

Трик 1

Данная ловушка помогает выяснить реальное содержимое трассировочного флага TF в условиях эмуляции его отладчиком. Ловушка основана на том, что вследствие аппаратной особенности реализации процессора INTEL после исполнения инструкции pop ss прерывание int 1 не может быть вызвано, и отладчик «не замечает» и пропускает следующую за данной командой инструкцию. Таким образом, следующая за pop ss инструкция исполняется на реальном процессоре, а не под отладкой. Выяснить действительное содержание трассировочного флага в данном случае можно следующим образом:

……

Push ss;

Pop ss;

Защита

Pushf;

Кладем в стек значение флагового регистра. Данную команду отладчик как бы «не замечает», она исполняется на реальном процессоре.

Pop ax;

Восстанавливаем ax из стека.

Test ax,100h;

Проверка флага TF на трассировку.

Jnz DebuggerDetected;

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

……

Трик 2

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

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

……

Xor dx,dx;

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

Mov ds,dx;

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

Mov ax, 2501h;

Int 21h;

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

……

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

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

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

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

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

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

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

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

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

Трик 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.

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

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

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

……

Lea ebx, continue;

Заносим в ebx адрес перехода

Mov dr0,ebx;

Записываем адрес перехода в DR0

Xor eax,ebx;

Исключаем вероятность совпадения eax и ebx

Mov eax, dr0;

Читаем адрес перехода из DR0

Jmp ax;

Переходим по данному адресу. Если доступ к регистру DR0 запрещен, то мы перейдем по неверному адресу и ход выполнения программы будет нарушен

……

Используя данную особенность защищенного режима можно прибегать к разнообразным трикам.

Трик 5. Шифрование кода программы с расшифровкой через отладочный регистр

……

Mov eax,11111111h;

Ключ, которым зашифрован код программы

Mov dr0,eax;

Сохраним ключ в отладочном регистре

Xor eax,0СВСВСВСВh;

Кладем мусор в eax

Mov eax,dr0;

Возвращаем из регистра отладки ключ в eax

Xor dword ptr cs:[hiddencode], eax;

Расшифровываем код

……

hiddencode:

[зашифрованный код]

Для противодействия отладчикам защищенного режима можно через определенные, достаточно малые интервалы времени производить чистку регистров DR0-DR7.

Трик 6.

Данный трик основан на том, что отладчики защищенного режима теряют одно трассировочное прерывание при установке регистров DRx. Использование данного трика аналогично трику 1 (потеря трассировочного прерывания по командеpop ss).

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

Пример 2.Определение наличия SoftIce в оперативной памяти из отлаживаемой программы

……

Mov bx,202h

Mov ax,1684h

Xor di,di

Int 21h;

Если функция не определена, то di останется неизменным

Or di,di

Jnz SoftIceDectected

У SoftIce данная функция занята

……

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

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

Соседние файлы в папке ПАЗИ 622231