Гостевая статья MINDSHARE: введение в PYKD

В наших предыдущих блогах мы обсуждали способы поиска вариантов во время поиска ошибок. В этом блоге мы решили поговорить о чем-то немного другом, а именно о динамическом анализе. В частности, мы рассмотрим сценарии PyKD для решения определенных задач.

PyKD помогает в автоматизации задач отладки и анализа аварийных дампов с использованием python. Приятной особенностью PyKD является то, что он может использоваться в автономном скрипте или из WinDBG.

Установка PyKD

Установка PyKD проста - особенно если мы хотим использовать его из WinDBG. Для начала загрузите загрузчик с , затем извлеките библиотеку DLL для нужной архитектуры (x86 или x64) в winextкаталог вашей установки WinDBG.

После того, как вы скопировали его, вы можете проверить его правильность, загрузив pykd и выполнив «! Help»:

Picture1 (4).png


Вы также можете получить интерактивную консоль с помощью команды «! Py» в windbg:

Picture2 (4).png

0:008> !pip install pykd
Collecting pykd
Downloading 0f0fb3426ee39aa3fc0369ce36bcf0bff8d9/pykd-0.3.3.4-cp27-none-win32.whl (8.9MB)
Installing collected packages: pykd
Successfully installed pykd-0.3.3.4

Выполнение скриптов Python из WinDBG

PyKD имеет богатый API, который позволяет нам выполнять большинство функций, которые мы делаем из WinDBG, но из скрипта Python.
Одна из самых простых функций, с которой можно начать - это то dbgCommand, что мы можем выполнять команды windbg изнутри python.

Например:

Picture3 (4).png


Нечто более значимое

Давайте сделаем что-то более осмысленное, используя настоящий PyKD API. Для этого блога я напишу небольшой скрипт PyKD, который устанавливает точку останова и выводит исполняемый код Javascript.

Для решения этой задачи я буду использовать следующие API-интерфейсы PyKD:
pykd.module(mod_name): Принимает имя загруженного модуля в качестве аргумента. pykd.module(mod_name).begin()Возвращает базовый адрес загруженного модуля. pykd.setBp(addr,handler): Принимает два аргумента: адрес для установки точки останова и обработчик функции, который обрабатывает точку останова при получении. pykd.reg(register)Возвращает значение определенного регистра. pykd.loadPtrs(addr,num): Разыменовывает адрес и возвращает указатели в списке. pykd.loadWStr(addr): Загрузить строку в кодировке Юникод из адреса. pykd.go(): Продолжает выполнение. pykd.dprintln(str): Выводит строку в окне windbg.

Идея довольно проста. Установите точку останова для определенной функции и дамп JavaScript, который будет выполняться:

Picture4 (4).png


Обработчик точек останова разыменовывает один из адресов в стеке, а затем выводит выполняемый оператор JavaScript.

Picture5 (3).png

Вывод:

Picture6 (3).png



Вот и все на сегодня. В нашем следующем блоге MindshaRE, связанном с PyKD, мы углубимся в PyKD и покажем, как написать небольшой скрипт, который обнаруживает и записывает сбои для размытых целей.

Источник:
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!