АВТОМАТИЗАЦИЯ ОТЛАДКИ C/C++ ПРИЛОЖЕНИЙ С ПОМОЩЬЮ PYTHON PYKD – РАСШИРЕНИЕ ДЛЯ ОТЛАДЧИКА WINDBG Александр Тарасенко ст. разработчик
АВТОМАТИЗАЦИЯ ОТЛАДКИ C/C++ ПРИЛОЖЕНИЙ С ПОМОЩЬЮ PYTHONPYKD – РАСШИРЕНИЕ ДЛЯ ОТЛАДЧИКА WINDBG
Александр Тарасенкост. разработчик
КОМУ ЭТО БУДЕТ ИНТЕРЕСНО?
Вы:Разработчик приложений под WindowsПишите на С/C++Знакомы с отладчиком windbg Знаете Python или хотели бы с ним познакомится
Вы бы хотели узнать:Как автоматизировать рутинные операции при отладкеКак расширить функциональность WinDBG
РАЗРЕШИТЕ ПРЕДСТАВИТЬ:
PyKD – расширение для WinDBG интегрирующее Pythonhttp://pykd.codeplex.com
Факты о PyKD: Проект стартовал в 2010 Язык разработки: C++, MSVC Для интеграции с Python используется Boost.Python Текущая версия 0.3.0.37, поддерживает Python 2.7
ИНСТАЛЛЯЦИЯ И НАСТРОЙКА
Предустановленное ПО: windbg + python
http://pykd.codeplex.com/releases1. Установить через PyPI
- неудобно использовать внутри windbg
2. Использовать bootstrapper- при первом запуске нужно выполнить команду !pykd.install
3. Установить вручную- нужно задать для python пути к каталогу к pykd
“HELLO WORLD!”
PYKD “CHEAT SHEET”
dbgCommand(str) - выполнить любую команду windbgreg(str) – возвратить знaчение регистраptrByte, ptrWord, … - доступ к памятиloadBytes, loadWords, - доступ к регионам памятиclass module - информация о бинарном модулеclass typeInfo - информация о типеclass typedVar – доступ к памяти с учетом информации о типе
РАБОТА С ТИПАМИ: КЛАСС TYPEINFO
Конструктор:typeInfo( имя_типа )
Назначение:- интроспекция типов ( аналог команды dt )- конструирование объектов typedVar- динамическое определение типов
ИССЛЕДУЕМ СТРУКТУРУ
ТИПИЗИРОВАННЫЕ ПЕРЕМЕННЫЕ
Конструктор:typedVar( тип, адрес)typedVar( имя_типа, адрес)typedVar( имя_переменной)Назначение:доступ к памяти отлаживаемого приложения с учетом информации о типах, это позволяет сделать скрипт относительно независимым от версии отлаживаемого модуля
АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ С КЛАССАМИ PYKD
Классы могут использоваться в арифметический операцияхprint module(‘ntdll’) + 0x100print 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 возвращаются в виде исключений!!!
DbgExceptionMemoryExceptionSymbolExceptionTypeException
ДИНАМИЧЕСКАЯ ОТЛАДКА
Управление состоянием отладчикаgo(), trace(), step()
Условные точки остановаbp = setBp( myFunctionAddr, predicat )
Монитор отладочных событийclass eventHandler
ПОДВОДНЫЕ КАМНИ
Указатели всегда 64 битные ( даже на 32 битной платформе )при работе с адресами памяти необходимо использовать функцию addr64
Объекты в pykd не являются «живыми»после изменения состояния отладчика не гарантируется правильное состояние объекта -> объекты нужно пересоздавать
В pykd существует ограничение на длину вывода
При работе в windbg интерпретатор python может запускаться в «глобальном» и «лоакальном» режимахповедение можно явно задать с помощью ключей –global и –local
Есть ограничения на работу с несколькими потоками
ИСПОЛЬЗОВАНИЕ PYKD ВНЕ WINDBG
pykd.initialize()Функции управления отладкой:
startProcessattachProcessloadDump
killProcessdetachProcesscloseDump
ОТЛАДКА СКРИПТОВ С PYKD
Консольный отладчик pdb
Отладка с помощью визуальных отладчиков ( VS+PyTools, PyCharm, Eclipse, … )
KarmaDBG pip install karmadbg
ПРОЕКТЫ, ИСПОЛЬЗУЮЩИЕ PYKD
Mona.py https://github.com/corelan/monaVolatilityhttps://github.com/volatilityfoundation/volatilityFlare-dbghttps://github.com/fireeye/flare-dbgЕще >10 проектов на github
НАШИ КООРДИНАТЫ
https://pykd.codeplex.comTwitter: @pykd_devE-mail: [email protected]
LET'S TALK?Штаб-квартира «Лаборатории Касперского»Ленинградское ш. 39А с2-3
125212, МоскваТел: +7 (495) 797-8700www.kaspersky.ru