Автоматизация отладки в windbg

28
Автоматизация отладки в windbg windbg scripts, использование python и расширение pykd, и многое другое

Transcript of Автоматизация отладки в windbg

Автоматизация отладки в windbg

windbg scripts, использование python и расширение pykd, и многое другое

Задачи автоматизированной отладки• Визуализация данных• Обработка аварийных дампов• Динамическое управление отладкой• Диагностика при автоматизированном тестировании

WinDBG – универсальный отладчик для Windows• Поддерживает все типы отладки: локальная ( usermode/kernel

mode), удаленная отладка ядра ( COM/1394/USB/NET ), отладка по сети ( клиент/сервер ), анализ дампов • Все Windows платформы x86/x64 • Поддержка native и managed • Распространяется как часть Windows Kits

Архитектура WindbgLocal Debugging Remote Debugging

Remote Kernel Mode Debugging

Dump Analysis

Debug Engine (dbgeng.dll )

DbgHelp (dbghelp.dll)

SymSrv SrcSrv DIA

Extensions

WinDBG scripts

Основные команды и конструкции

• Комментарии$$ это комментарий

• Форматированный вывод.printf “hello world %x”, 2

• Циклы и ветвления.if ( condition ){}.else{}

.while( condition ){ .break .continue}

.for ( loop init; loop condition; loop increment){}

• Контроль ошибок.catch { .leave}

• Алиасыустановка as, aS удаление adперечислить al${ } - интерпретатор алиасов

• Предустановленные алиасы$ntsym и др.

• Псевдорегистрыr $t1 = @$t2

• Автоматические псевдо регистры$ea $ip и др.

• Интерпретаторы@@C++() @@masm()

• Операторы MASMnot, hi, low, poi и др$iment, $spat, $vvalid

• Запуск скрпита

$$>< $$>a< аргументы: ${$argn}

Использование информации о типах• Проверить настройку символов: .sympath !sym noisy !chksym• dt – display type • r? Присвоение значение псевдорегистру с использованием

информации о типе• Используем ?? и @@C++

C++ макросы:#CONTAINING_RECORD#FIELD_OFFSET

#RTL_CONTAINS_FIELD

Полезные инструменты

• !list -t [Module!]Type.Field -x "Commands" -a “Arguments“ StartAddress • !for_each_module "Commands"

алисаы: @#Base, @#LoadedImageName и др

• !for_each_frame• !for_each_local• !for_each_process • !for_each_thread• .foreach

Условные брейкпойнты

• bp Address ".if (Condition) {OptionalCommands} .else {gc}«• Использование скриптов

bp Address"$$><script_file“• Пример: логер API ф

NTSTATUS NtCreateFile(PHANDLE FileHandle, ACCESS_MASK DesiredAccess,

POBJECT_ATTRIBUTES ObjectAttributes, // x64 - r8, x86 – [esp + 0xC]PIO_STATUS_BLOCK IoStatusBlock,PLARGE_INTEGER AllocationSize,ULONG FileAttributes, ULONG ShareAccess, ULONG CreateDisposition,ULONG CreateOptions,PVOID EaBuffer, ULONG EaLength );

+/- использования встроенных скриптов

Плюсы• Работают «из коробки»• Относительно просты в

использовании• «Заточены» на использование

в windbg

Минусы• Бедные инструментальные

средства• Отсутствуют какие-либо

библиотеки• Неудобно отлаживать• Скорость (???)

Дополнительные материалы

• Using Debugger Command Programs: https://msdn.microsoft.com/en-us/library/windows/hardware/ff560096(v=vs.85).aspx• Debugging toolbox

http://blogs.msdn.com/b/debuggingtoolbox/• Kernel Debugger Antirootkit:

http://kdar.codeplex.com

Pykd Python extension for windbg

Устройство pykd

• Pykd это модуль для CPython• Pykd это WinDBG extension• Pykd использует Boost.Python• Pykd использует kdlibcpp ( http://kdlibcpp.codeplex.com )

Инсталляция и использование pykd в WinDBG• Ручная установка• Установка через PyPI:

pip install pykd pip install –upgrade pykd

• Загрузка расширения: .load pykd

• Pykd bootstrapper !pykd.install

• !pykd.py - основная команда ( или просто !py )

Основные возможности pykd

• Доступ к регистрам: reg(name), cpu().regname• Доступ к памяти: ptrByte, ptrWord … loadBytes, loadWords, ….• Работа с модулями: class module()• Работа с типами: class typeInfo()• Типизированные переменные: class typedVar()

Пример: таблица экспортовIMAGE_DOS_HEADER e_lfanew

IMAGE_NT_HEADERS64

OptionalHeader

DataDirectory[16]

IMAGE_EXPORT_DIRECTORY …. +0x014 NumberOfFucntions +0x018 NumberOfNames +0x01C AddressOfFunctions +0x020 AddressOfNames +0x024 AddressOfNamesOrdinals

Динамическая отладка

• Условные точки остановкиsetBp( offset, callback )• Монитор отладочных событий

class eventHandleronBreakpointonLoadModule/onUnloadModuleonExceptiononExecutionStatusChangedonThreadStart/onThreadStop

Определение типов

• Производные типыtypeInfo.ptrTo() typeInfo.deref(), typeInfo.arrayOf()• Базовые типы:

baseTypes• Определение новых структур

createStruct, createUnion

Подводные камни при работе с pykd• Нормализованные адреса

использование ф. addr64()• Глобальный и локальный интерпретатор ( --global и –local )• Ограничения на длину вывода

Прикладное использование pykd

Стандартные скрипты pykd https://pykd.svn.codeplex.com/svn/branch/0.3.x/snippets• просмотр справки help.py• экспорты и импорты ( export.py, iat.py )• регистры CR ( cr0.py, cr4.py )• для разработчиков драйверов: ctlcode.py, findtag.py• для разработчиков сетевых драйверов: nbl.py

Pykd без windbg

• pykd.initialize()• pykd.startProcess()• pykd.loadDump()• pykd.killProcess()• pykd.closeDump()

Отладка скриптов

• pdb - стандартный консольный отладчик h(elp), s(tep), c(ontinue), r(return), p(rint), b(reak), w(here)• IDLE, Eclipse, PyTools, …. • karmadbg ( karmadbg.codeplex.com )

IPython

• Сайт проекта: http://ipython.org• Инсталляция: pip intsall ipython[notebook]• Запуск web сервера: ipython notebook [--ip=0.0.0.0]

Mona.pyExploit Development Swiss Army Knife

• https://github.com/corelanc0d3r• https://www.corelan.be/

VolatilityAn advanced memory forensics framework

• https://github.com/volatilityfoundation

ЗаключениеВсем спасибо!

Наши координаты:

• http://pykd.codeplex.com• http://karmadbg.codeplex.com• Twitter: @pykd_dev• E-mail: [email protected]