Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






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

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

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

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

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

Трик 3

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

 

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

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

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






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.