2015_лекции / Лекция №6_2015
.pdfОбщая схема отладки
while (TRUE) { WaitForDebugEvent(event, timeout);
switch (event->dwDebugEventCode) { case EXCEPTION_DEBUG_EVENT:
switch (event->u.Exception.ExceptionRecord.ExceptionCode)
{
case EXCEPTION_ACCESS_VIOLATION: case EXCEPTION_BREAKPOINT:
(...)
}
case LOAD_DLL_DEBUG_EVENT: (...)
}
Общая схема отладки: Context
Текущее состояние потока описывается с помощью структуры Context
Передается отладчику для отладки событий и обработчикам исключений
Содержит значения всех регистров и флагов
Зависит от типа ЦПУ
Общая схема отладки: TEB & PEB
TEB = Thread Environment Block
Контейнер для хранения определенных параметров потока (указатель на стек, указатель на список обработчиков исключений и т.д.)
Windows использует сегмент fs для его хранения (смещение 0x18 – указатель на себя)
mov eax, fs:[0x18]
PEB = Process Environment Block
Контейнер для хранения определенных параметров процесса (указатель на список загруженных модулей, статус отладчика, переменные окружения)
TEB есть указатель на структуру PEB по смещению 0x30
Структуры важны при анализе кода
Имеется список загруженных модулей (Peb.Ldr)
Есть проверка на использование отладчика (PEB.BeingDebugged)
Используется для установки обработчика исключений
(TEB.NtTib.ExceptionList)
Исключения
Исключения первого уровня
Исключения второго уровня
Обощенный механизм обработки исключений
Обработка программных исключений
Структурированная обработка исключений (SEH)
Механизм ОС для обработки исключений, генерируемых приложениями
в коде __try/__except/__finally
Исключения обрабатываются той же нитью, что и вызвала его
Может быть зарегистрировано большое число обработчиков
Векторная обработка исключений (VEH)
Расширяет SEH
Сначала вызываются VEH обработчики
Функция AddVectoredExceptionHandler() в MSDN
Развертка обработчиков структурированных исключений
Обобщенный механизм
обработки исключений
1. Некорректная обработка данных вызывает ошибку, которая обычно обрабатывается исключением (например, деление на ноль).
2. Исключение генерируется исследуемой программой в режиме пользователя
3. обработчик исключений ищет отладчик, работающий в режиме пользователя и передает ему исключение (исключение первого уровня, first-chance ” exception)
4.Отладчик получает уведомление об исключение (исключение первого уровня ), и если исследуемая программа имеет обработчик данного исключения, то управление передается ему.
5. Если отладчик не может обработать исключение, то управление передается вновь обработчику исключений.
6. Обработчик исключений, работающий в режиме пользователя, сначала осуществляет поиск векторных обработчиков исключений (vectored exception handlers, VEH) и вызывает их.
7. Если не было создано ни одного векторного обработчика прерывания, то начинается развертка обработчиков структурных исключение (SEH).
8. Если и в этом случае исключение не было обработано, то исключение передается обработчику уровню ядра.
9. Отладчик, работающий режим пользователя, получает исключение второго уровня (”second-chance” exception notification). => исследуемая программа аварийно завершилась.
Наиболее часто используемые исключения при отладке
INT 3 (точки останова) EXCEPTION_BREAKPOINT
пошаговое выполнения (TF =1 ) EXCEPTION_SINGLE_STEP
ошибка доступа к памяти (некорректная адресация, нарушения прав доступа)
EXCEPTION_ACCESS_VIOLATION, EXCEPTION_INT_DIVIDE_BY_ZERO
Отладчик OLLYDBG