АВТОМАТИЗАЦИЯ ОТЛАДКИ
C/C++ ПРИЛОЖЕНИЙ С ПОМОЩЬЮ PYTHON
PYKD – РАСШИРЕНИЕ ДЛЯ ОТЛАДЧИКА WINDBG
Александр Тарасенко
ст. разработчик
КОМУ ЭТО БУДЕТ ИНТЕРЕСНО?
Вы:
Разработчик приложений под Windows
Пишите на С/C++
Знакомы с отладчиком windbg
Знаете Python или хотели бы с ним
познакомится
Вы бы хотели узнать:
Как автоматизировать рутинные операции
при отладке
Как расширить функциональность
WinDBG
РАЗРЕШИТЕ ПРЕДСТАВИТЬ:
PyKD – расширение для WinDBG
интегрирующее Python
http://pykd.codeplex.com
Факты о PyKD:
 Проект стартовал в 2010
 Язык разработки: C++, MSVC
 Для интеграции с Python используется Boost.Python
 Текущая версия 0.3.0.37, поддерживает Python 2.7
ИНСТАЛЛЯЦИЯ И НАСТРОЙКА
Предустановленное ПО: windbg + python
http://pykd.codeplex.com/releases
1. Установить через PyPI
- неудобно использовать внутри windbg
2. Использовать bootstrapper
- при первом запуске нужно выполнить команду !pykd.install
3. Установить вручную
- нужно задать для python пути к каталогу к pykd
“HELLO WORLD!”
PYKD “CHEAT SHEET”
dbgCommand(str) - выполнить любую команду windbg
reg(str) – возвратить знaчение регистра
ptrByte, ptrWord, … - доступ к памяти
loadBytes, loadWords, - доступ к регионам памяти
class module - информация о бинарном модуле
class typeInfo - информация о типе
class typedVar – доступ к памяти с учетом информации о типе
РАБОТА С ТИПАМИ: КЛАСС TYPEINFO
Конструктор:
typeInfo( имя_типа )
Назначение:
- интроспекция типов ( аналог команды dt )
- конструирование объектов typedVar
- динамическое определение типов
ИССЛЕДУЕМ СТРУКТУРУ
ТИПИЗИРОВАННЫЕ ПЕРЕМЕННЫЕ
Конструктор:
typedVar( тип, адрес)
typedVar( имя_типа, адрес)
typedVar( имя_переменной)
Назначение:
доступ к памяти отлаживаемого приложения с учетом информации о типах, это позволяет
сделать скрипт относительно независимым от версии отлаживаемого модуля
АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ С КЛАССАМИ PYKD
Классы могут использоваться в арифметический операциях
print module(‘ntdll’) + 0x100
print typedVar(my_var) & 0xFF00
Классы могут использоваться в операциях сравнения
assert( typedVar(my_test_var) < 100 )
Классы могут выступать в качестве целочисленных аргументов функций
typedVar(“MyType”, g_var.field1)
Классы могут использоваться в качестве индексов
listOfVars[ typedVar(my_test_var ]
Внимание: «арифметика указателей» не поддерживается
ПРИМЕР: СПИСОК КРИТИЧЕСКИХ СЕКЦИЙ
(!LOCKS -V)
def listCritSections():
ntdll = module("ntdll")
dbglst = ntdll.typedVarList( ntdll.RtlCriticalSectionList, "_RTL_CRITICAL_SECTION_DEBUG",
"ProcessLocksList" )
crtlst = [ ntdll.typedVar( "_RTL_CRITICAL_SECTION", critDbg.CriticalSection ) for critDbg in
dbglst ]
for crtsec in crtlst:
dprintln("")
dprintln( "CRITICAL SECTION address = %#x ( %s ) " % ( crtsec, findSymbol( crtsec ) ) )
dprintln( " Owning thread = %x" % crtsec.OwningThread )
dprintln( " Lock count = %d" % crtsec.LockCount )
ОБРАБОТКА ОШИБОК
Все ошибки в pykd
возвращаются в виде
исключений!!!
DbgException
MemoryException
SymbolException
TypeException
ДИНАМИЧЕСКАЯ ОТЛАДКА
Управление состоянием отладчика
go(), trace(), step()
Условные точки останова
bp = setBp( myFunctionAddr, predicat )
Монитор отладочных событий
class eventHandler
ПОДВОДНЫЕ КАМНИ
Указатели всегда 64 битные ( даже на 32 битной платформе )
при работе с адресами памяти необходимо использовать функцию addr64
Объекты в pykd не являются «живыми»
после изменения состояния отладчика не гарантируется правильное состояние
объекта -> объекты нужно пересоздавать
В pykd существует ограничение на длину вывода
При работе в windbg интерпретатор python может запускаться в «глобальном» и
«лоакальном» режимах
поведение можно явно задать с помощью ключей –global и –local
Есть ограничения на работу с несколькими потоками
ИСПОЛЬЗОВАНИЕ PYKD ВНЕ WINDBG
pykd.initialize()
Функции управления отладкой:
startProcess
attachProcess
loadDump
killProcess
detachProcess
closeDump
ОТЛАДКА СКРИПТОВ С PYKD
Консольный отладчик pdb
Отладка с помощью визуальных
отладчиков ( VS+PyTools, PyCharm,
Eclipse, … )
KarmaDBG
pip install karmadbg
ПРОЕКТЫ, ИСПОЛЬЗУЮЩИЕ PYKD
Mona.py
https://github.com/corelan/mona
Volatility
https://github.com/volatilityfoundation/volatility
Flare-dbg
https://github.com/fireeye/flare-dbg
Еще >10 проектов на github
НАШИ КООРДИНАТЫ
https://pykd.codeplex.com
Twitter: @pykd_dev
E-mail: pykd.codeplex@hotmail.com
LET'S TALK?
Штаб-квартира «Лаборатории Касперского»
Ленинградское ш. 39А с2-3
125212, Москва
Тел: +7 (495) 797-8700
www.kaspersky.ru