Автоматизация отладки в windbg
TRANSCRIPT
Автоматизация отладки в 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
Основные команды и конструкции
• Комментарии$$ это комментарий
• Форматированный вывод.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
• 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 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]