KEMBAR78
Александр Тарасенко, Использование python для автоматизации отладки С/C++ кода в Windows | PPTX
АВТОМАТИЗАЦИЯ ОТЛАДКИ
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

Александр Тарасенко, Использование python для автоматизации отладки С/C++ кода в Windows

  • 1.
    АВТОМАТИЗАЦИЯ ОТЛАДКИ C/C++ ПРИЛОЖЕНИЙС ПОМОЩЬЮ PYTHON PYKD – РАСШИРЕНИЕ ДЛЯ ОТЛАДЧИКА WINDBG Александр Тарасенко ст. разработчик
  • 2.
    КОМУ ЭТО БУДЕТИНТЕРЕСНО? Вы: Разработчик приложений под Windows Пишите на С/C++ Знакомы с отладчиком windbg Знаете Python или хотели бы с ним познакомится Вы бы хотели узнать: Как автоматизировать рутинные операции при отладке Как расширить функциональность WinDBG
  • 3.
    РАЗРЕШИТЕ ПРЕДСТАВИТЬ: PyKD –расширение для WinDBG интегрирующее Python http://pykd.codeplex.com Факты о PyKD:  Проект стартовал в 2010  Язык разработки: C++, MSVC  Для интеграции с Python используется Boost.Python  Текущая версия 0.3.0.37, поддерживает Python 2.7
  • 4.
    ИНСТАЛЛЯЦИЯ И НАСТРОЙКА ПредустановленноеПО: windbg + python http://pykd.codeplex.com/releases 1. Установить через PyPI - неудобно использовать внутри windbg 2. Использовать bootstrapper - при первом запуске нужно выполнить команду !pykd.install 3. Установить вручную - нужно задать для python пути к каталогу к pykd
  • 5.
  • 6.
    PYKD “CHEAT SHEET” dbgCommand(str)- выполнить любую команду windbg reg(str) – возвратить знaчение регистра ptrByte, ptrWord, … - доступ к памяти loadBytes, loadWords, - доступ к регионам памяти class module - информация о бинарном модуле class typeInfo - информация о типе class typedVar – доступ к памяти с учетом информации о типе
  • 7.
    РАБОТА С ТИПАМИ:КЛАСС TYPEINFO Конструктор: typeInfo( имя_типа ) Назначение: - интроспекция типов ( аналог команды dt ) - конструирование объектов typedVar - динамическое определение типов
  • 8.
  • 9.
    ТИПИЗИРОВАННЫЕ ПЕРЕМЕННЫЕ Конструктор: typedVar( тип,адрес) typedVar( имя_типа, адрес) typedVar( имя_переменной) Назначение: доступ к памяти отлаживаемого приложения с учетом информации о типах, это позволяет сделать скрипт относительно независимым от версии отлаживаемого модуля
  • 10.
    АРИФМЕТИЧЕСКИЕ ОПЕРАЦИИ СКЛАССАМИ 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 ] Внимание: «арифметика указателей» не поддерживается
  • 11.
    ПРИМЕР: СПИСОК КРИТИЧЕСКИХСЕКЦИЙ (!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 )
  • 12.
    ОБРАБОТКА ОШИБОК Все ошибкив pykd возвращаются в виде исключений!!! DbgException MemoryException SymbolException TypeException
  • 13.
    ДИНАМИЧЕСКАЯ ОТЛАДКА Управление состояниемотладчика go(), trace(), step() Условные точки останова bp = setBp( myFunctionAddr, predicat ) Монитор отладочных событий class eventHandler
  • 14.
    ПОДВОДНЫЕ КАМНИ Указатели всегда64 битные ( даже на 32 битной платформе ) при работе с адресами памяти необходимо использовать функцию addr64 Объекты в pykd не являются «живыми» после изменения состояния отладчика не гарантируется правильное состояние объекта -> объекты нужно пересоздавать В pykd существует ограничение на длину вывода При работе в windbg интерпретатор python может запускаться в «глобальном» и «лоакальном» режимах поведение можно явно задать с помощью ключей –global и –local Есть ограничения на работу с несколькими потоками
  • 15.
    ИСПОЛЬЗОВАНИЕ PYKD ВНЕWINDBG pykd.initialize() Функции управления отладкой: startProcess attachProcess loadDump killProcess detachProcess closeDump
  • 16.
    ОТЛАДКА СКРИПТОВ СPYKD Консольный отладчик pdb Отладка с помощью визуальных отладчиков ( VS+PyTools, PyCharm, Eclipse, … ) KarmaDBG pip install karmadbg
  • 17.
  • 18.
  • 19.
    LET'S TALK? Штаб-квартира «ЛабораторииКасперского» Ленинградское ш. 39А с2-3 125212, Москва Тел: +7 (495) 797-8700 www.kaspersky.ru

Editor's Notes

  • #2 В рамках данного вебинара я расскажу об одном проекте Лаборатории Касперского, не связанном напрямую с антивирусами.
  • #3 Что известно про Лабораторию Касперского,…. Однако, это далеко не все. Лаборатория постоянно инвестирует в новые решения и создает новые продукты. Об одном из направлений ее деятельности я сфокусируюсь в своей презентации.
  • #5 Сейчас в мире набирает обороты тема защиты индустриальных объектов или как их еще называют критически важных объектов.
  • #7 To add Dividing slide use Add section, or select from Structure drop down list. When a new Dividing slide is inserted, Content slide will be automatically updated. Please mind the size of text areas.
  • #12 To add Dividing slide use Add section, or select from Structure drop down list. When a new Dividing slide is inserted, Content slide will be automatically updated. Please mind the size of text areas.
  • #22 To add Dividing slide use Add section, or select from Structure drop down list. When a new Dividing slide is inserted, Content slide will be automatically updated. Please mind the size of text areas.
  • #25 The best way to finish your presentation is to place call to action text or contacts. Try to initiate feedback and further communication. Please mind the size of text areas.