2. Задачи автоматизированной отладки
• Визуализация данных
• Обработка аварийных дампов
• Динамическое управление отладкой
• Диагностика при автоматизированном тестировании
3. WinDBG – универсальный отладчик для
Windows
• Поддерживает все типы отладки: локальная ( usermode/kernel
mode), удаленная отладка ядра ( COM/1394/USB/NET ), отладка по
сети ( клиент/сервер ), анализ дампов
• Все Windows платформы x86/x64
• Поддержка native и managed
• Распространяется как часть Windows Kits
6. Основные команды и конструкции
• Комментарии
$$ это комментарий
• Форматированный вывод
.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()
• Операторы MASM
not, hi, low, poi и др
$iment, $spat, $vvalid
• Запуск скрпита
$$>< $$>a< аргументы: ${$argn}
7. Использование информации о типах
• Проверить настройку символов: .sympath !sym noisy !chksym
• dt – display type
• r? Присвоение значение псевдорегистру с использованием
информации о типе
• Используем ?? и @@C++
C++ макросы:
#CONTAINING_RECORD
#FIELD_OFFSET
#RTL_CONTAINS_FIELD
8. Полезные инструменты
• !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
10. +/- использования встроенных скриптов
Плюсы
• Работают «из коробки»
• Относительно просты в
использовании
• «Заточены» на использование
в windbg
Минусы
• Бедные инструментальные
средства
• Отсутствуют какие-либо
библиотеки
• Неудобно отлаживать
• Скорость (???)
11. Дополнительные материалы
• 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
13. Устройство pykd
• Pykd это модуль для CPython
• Pykd это WinDBG extension
• Pykd использует Boost.Python
• Pykd использует kdlibcpp ( http://kdlibcpp.codeplex.com )
14. Инсталляция и использование pykd в
WinDBG
• Ручная установка
• Установка через PyPI:
pip install pykd
pip install –upgrade pykd
• Загрузка расширения:
.load pykd
• Pykd bootstrapper
!pykd.install
• !pykd.py - основная команда ( или просто !py )
15. Основные возможности pykd
• Доступ к регистрам: reg(name), cpu().regname
• Доступ к памяти: ptrByte, ptrWord … loadBytes, loadWords, ….
• Работа с модулями: class module()
• Работа с типами: class typeInfo()
• Типизированные переменные: class typedVar()
17. Динамическая отладка
• Условные точки остановки
setBp( offset, callback )
• Монитор отладочных событий
class eventHandler
onBreakpoint
onLoadModule/onUnloadModule
onException
onExecutionStatusChanged
onThreadStart/onThreadStop
18. Определение типов
• Производные типы
typeInfo.ptrTo() typeInfo.deref(), typeInfo.arrayOf()
• Базовые типы:
baseTypes
• Определение новых структур
createStruct, createUnion
19. Подводные камни при работе с pykd
• Нормализованные адреса
использование ф. addr64()
• Глобальный и локальный интерпретатор ( --global и –local )
• Ограничения на длину вывода