SlideShare a Scribd company logo
АВТОМАТИЗАЦИЯ ОТЛАДКИ
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

More Related Content

PDF
Павел Довгалюк, Обратная отладка
PDF
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
PPTX
Александр Фокин, Рефлексия в C++
PDF
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
PDF
Антон Полухин, Немного о Boost
PDF
Для чего мы делали свой акторный фреймворк и что из этого вышло?
PPTX
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
PPTX
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков
Павел Довгалюк, Обратная отладка
Дмитрий Кашицын, Троллейбус из буханки: алиасинг и векторизация в LLVM
Александр Фокин, Рефлексия в C++
Юрий Ефимочев, Компилируемые в реальном времени DSL для С++
Антон Полухин, Немного о Boost
Для чего мы делали свой акторный фреймворк и что из этого вышло?
Евгений Рыжков, Андрей Карпов Как потратить 10 лет на разработку анализатора ...
Никита Глушков, К вопросу о реализации кроссплатформенных фреймворков

What's hot (20)

PDF
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
PPTX
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
PPTX
Евгений Зуев, С++ в России: Стандарт языка и его реализация
PPTX
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
PPTX
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
PPTX
Современный статический анализ кода: что умеет он, чего не умели линтеры
PDF
Борис Сазонов, RAII потоки и CancellationToken в C++
PDF
Цена ошибки
PDF
Андрей Карпов, Приватные байки от разработчиков анализатора кода
PDF
Шишки, набитые за 15 лет использования акторов в C++
PDF
C++ refelection and cats
PPTX
Асинхронность и сопрограммы
PDF
Parallel STL
PDF
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
PPTX
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
PDF
хитрости выведения типов
PPTX
C++ Core Guidelines
PDF
Объектно-ориентированное программирование. Лекция 5 и 6
PDF
Использование юнит-тестов для повышения качества разработки
PDF
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Полухин Антон, Как делать не надо: C++ велосипедостроение для профессионалов
Сергей Шамбир, Адаптация Promise/A+ для взаимодействия между C++ и Javascript
Евгений Зуев, С++ в России: Стандарт языка и его реализация
Некоторые паттерны реализации полиморфного поведения в C++ – Дмитрий Леванов,...
Использование шаблонов и RTTI для конфигурации симулятора флеш-накопителя - Г...
Современный статический анализ кода: что умеет он, чего не умели линтеры
Борис Сазонов, RAII потоки и CancellationToken в C++
Цена ошибки
Андрей Карпов, Приватные байки от разработчиков анализатора кода
Шишки, набитые за 15 лет использования акторов в C++
C++ refelection and cats
Асинхронность и сопрограммы
Parallel STL
Объектно-Ориентированное Программирование на C++, Лекции 1 и 2
SWIG — cоздание мультиязыковых интерфейсов для C/C++ библиотек
хитрости выведения типов
C++ Core Guidelines
Объектно-ориентированное программирование. Лекция 5 и 6
Использование юнит-тестов для повышения качества разработки
Объектно-Ориентированное Программирование на C++, Лекции 3 и 4
Ad

Viewers also liked (15)

PDF
Антон Нонко, Классические строки в C++
PPTX
Михаил Матросов, Повседневный С++: boost и STL
PDF
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
PDF
Concepts lite
PDF
Антон Бикинеев, Reflection in C++Next
PPTX
Григорий Демченко, Универсальный адаптер
PDF
Clang tidy
PPTX
Алексей Кутумов, C++ без исключений, часть 3
PDF
Догнать и перегнать boost::lexical_cast
PPTX
Фитнес для вашего кода: как держать его в форме
PPTX
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
PPTX
Quality assurance of large c++ projects
PDF
Fuzzing: The New Unit Testing
PPTX
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
PDF
Василий Сорокин, Простой REST сервер на Qt с рефлексией
Антон Нонко, Классические строки в C++
Михаил Матросов, Повседневный С++: boost и STL
Александр Гранин, Функциональная 'Жизнь': параллельные клеточные автоматы и к...
Concepts lite
Антон Бикинеев, Reflection in C++Next
Григорий Демченко, Универсальный адаптер
Clang tidy
Алексей Кутумов, C++ без исключений, часть 3
Догнать и перегнать boost::lexical_cast
Фитнес для вашего кода: как держать его в форме
Evgeniy Muralev, Mark Vince, Working with the compiler, not against it
Quality assurance of large c++ projects
Fuzzing: The New Unit Testing
Повседневный С++: алгоритмы и итераторы @ C++ Russia 2017
Василий Сорокин, Простой REST сервер на Qt с рефлексией
Ad

More from Sergey Platonov (15)

PPTX
Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага
PDF
Антон Бикинеев, Writing good std::future&lt; C++ >
PDF
Павел Филонов, Разделяй и управляй вместе с Conan.io
PPTX
Григорий Демченко, Асинхронность и неблокирующая синхронизация
ODP
Антон Полухин. C++17
PPTX
Павел Беликов, Как избежать ошибок, используя современный C++
PDF
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
PDF
Алексей Кутумов, Coroutines everywhere
PPTX
Дмитрий Нестерук, Паттерны проектирования в XXI веке
PPTX
Dori Exterman, Considerations for choosing the parallel computing strategy th...
PPTX
Алексей Кутумов, Вектор с нуля
PDF
Kirk Shoop, Reactive programming in C++
PPTX
Дмитрий Демчук. Кроссплатформенный краш-репорт
PPTX
Илья Шишков, Принципы создания тестируемого кода
PDF
Антон Наумович, Система автоматической крэш-аналитики своими средствами
Лев Казаркин, Удивительные приключения регистров SSE или в поисках одного бага
Антон Бикинеев, Writing good std::future&lt; C++ >
Павел Филонов, Разделяй и управляй вместе с Conan.io
Григорий Демченко, Асинхронность и неблокирующая синхронизация
Антон Полухин. C++17
Павел Беликов, Как избежать ошибок, используя современный C++
Денис Кандров, Пушкова Евгения, QSpec: тестирование графических приложений на Qt
Алексей Кутумов, Coroutines everywhere
Дмитрий Нестерук, Паттерны проектирования в XXI веке
Dori Exterman, Considerations for choosing the parallel computing strategy th...
Алексей Кутумов, Вектор с нуля
Kirk Shoop, Reactive programming in C++
Дмитрий Демчук. Кроссплатформенный краш-репорт
Илья Шишков, Принципы создания тестируемого кода
Антон Наумович, Система автоматической крэш-аналитики своими средствами

Александр Тарасенко, Использование 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
  • 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 - динамическое определение типов
  • 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
  • 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.