2015_лекции / Лекция №6_2015
.pdfОсновные механизмы реализации отладки (x86 процессоры)
Использование флага отладки (TF= 1, регистр
EFLAGS)
Использование прерывний (int 3 (0xcc))
Использование отладочных регистров (DR0-DR7)
Использование отладочного API ОС
Основные типы антиотладочных приемов
Цель : затруднение отладки программы
Затруднить отладчику подключение к отлаживаемому процессу
Обнаружить присоединенный отладчик и
Завершить программу аварийно или нет
Реализовывать другую функциональность
Затруднение отладки путем
удаления брейкпоинтов,
передачи управление в середину «тела» экспортируемой функции для того, чтобы избежать срабатывания брейкпоинтов,
генерации исключений и т.д.Антиотладочные приемы основаны на:
Обнаружение поведенческих особенностей отладчиков
Обнаружение присутствие отладчиков в системе
Использование поведенческих особенностей отладчиков
Расчѐт контрольных сумм (CRC, MD5)
Сканирование кода на наличие 0xCC
Изменение содержимого регистров DR0-DR7
Проверка состояния стека во время выполнения кода.
Использование поведенческих особенностей отладчиков: Пример 1
Сканирование кода на наличие точек останова call $+5
pop edi sub edi, 5
mov ecx, 400h mov eax, 0CCh repne scasb
jz DebuggerDetected
Использование поведенческих особенностей отладчиков: Пример 2
Проверка состояния стека
mov |
EBP , ESP |
; (т.е. BP=SP) получили указатель на стек |
push |
EAX |
; запишем значение EAX в стек |
pop |
EAX |
; вытащим это значение из стека |
cmp word ptr [EBP-2], EAX ; сравним эти значения, |
||
jne |
DEBAG |
; если они оказались не равны → перейти на |
|
|
; дебагер |
|
|
|
Использование поведенческих особенностей отладчиков: Пример 4
Изменение содержимого отладочных регистров
push offset handler push dword ptr fs:[0] mov fs:[0],esp
xor eax, eax
div eax ;generate exception pop fs:[0]
add esp, 4 ;continue execution ;...
handler:
mov ecx, [esp+0Ch] ;skip div
add dword ptr [ecx+0B8h], 2 ;skip div mov dword ptr [ecx+04h], 0 ;clean dr0 mov dword ptr [ecx+08h], 0 ;clean dr1 mov dword ptr [ecx+0Ch], 0 ;clean dr2 mov dword ptr [ecx+10h], 0 ;clean dr3 mov dword ptr [ecx+14h], 0 ;clean dr6 mov dword ptr [ecx+18h], 0 ;clean dr7 xor eax, eax
ret
Использование поведенческих особенностей отладчиков
Использование временных меток
Записать временную метку T1
Выполнить набор операций/вызвать прерыванию и его обработку
Записать временную метку T2
Сравнить T1 и T2
Реализация:
rtdsc (0x0F31) (число тиков после последней перезагрузки системы, результат записывается
EDX:EAX)
GetTickCount
QueryPerformanceCounter (число операций выполненных
процессов)
Использование поведенческих особенностей отладчиков: Пример 3
Использование инструкции rdtsc
rdtsc |
|
|
|
xor |
ecx, ecx |
|
|
add |
ecx, eax |
|
|
rdtsc |
|
|
|
sub |
eax, ecx |
|
|
cmp |
eax, 0xFFF |
(1) |
|
jb |
NoDebuggerDetected |
||
rdtsc |
|
|
|
push |
eax |
(2) |
|
ret |
|
|
|
Обнаружение присутствия отладчика в системе
Использование специальных функций ОС
IsDebuggerPresent()
CheckRemoteDebuggerPresent()
NtQueryInformationProcess()
OutputDebugString()
Проверка наличия отладчика с помощью получения списка драйверов
Сканирование памяти на наличие процесса отладчика
Проверка на наличие объектов, создаваемых отладчиком
Файлы
Устройства
Окна
Значение ключей в реестре
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
Шифрование с использованием регистров, указателей на стек SP, ESP
Обнаружение присутствия отладчика в системе
•Интересные флаги структуры PEB
•PEB!BeingDebugged (PEB + ox2 байта)
push dword ptr fs:[30h]
pop edx
cmp byte ptr [edx+2], 1
je DebuggerDetected
•PEB!NTGlobalFlag (PEB + 0x68 байт)
•PEB!ProcessHeapFlag (PEB+ox18 байт)
• ForceFlag и Flags