По-русски English

Pykd API

Разделы

Функции

Типы

Вывод текста в отладочную консоль

dprint( str )

Выводит текст в отладочную консоль

dprintln( str )

Выводит тест в отладочную консоль и переводит строку
  dprint("Hello\n")
  dprintln("Hello")

Управление сессиями

createSession

isSessionStart

loadDump

Пример

from pykd import *

if not isSessionStart():
   createSession()
   loadDump( "C:\\1.dmp" )
   dprintln( "work as python extension" )
else:
   dprintln( "work as windbg extension" )

Выполнение команд расширений для windbg

Для загрузки расширений windbg служит класс dbgExtensionClass
ext = dbgExtensionClass( "C:\\Program Files (x86)\\Debugging Tools for Windows (x86)\\winext\\ext.dll" )
dprintln( ext.call( "chkimg", "nt" ) )

Работа с 64 битными адресами

is64bitSystem()

Ввозвращает true, если целевая платформа поддерживат 64 битную адресацию

addr64( addr )

Приводит адрес в 64 битный формат. Обратите внимание, даже если целевая платофрма - 32 битная, все адреса должны приводится к этому формату, так как все функции, раб отающие с виртуальными адресами принимают и возвращат адркес именно в этом формате
  if is64bitSystem() :
     dprintln( "all address has 64 bits width" )
  else:
     dprintln( "address must be cast to 64 bit form" )
     addr = addr64 ( CallFuncReturnAddr() )

Управление отладчиком

dbgCommand( str )

выполняет команду отладчика, перехватывает вывод в консоль и возвращает его в виде строки

Примеры

dbgCommand( "dt nt!DEVICEOBJECT" )

expr()

Вычисляет выражение в формате windbg

go()

Переводит отладчик в режим выполнения. Не работает при отладке дампов.

step()

Выполняет в отладчике один шаг. Вызовы процедур пропускаются

trace()

Выполняет в отладчике один шаг. Заходит внутрь процедур.

class bp

Служит для управления точками остановки отладчика

Методы
  • init( addr )
  • set
  • remove

Память и регистры

reg( str )

возвращает значение указанного регистра

compareMemory( addr1, addr2, length )

сравнивает два буфера памяти

Примеры

  eax = reg( "eax" )
  ebx = reg( "ebx" )
  edx = reg ( "edx" )
  if compareMemory( eax, ebx, edx ):
       dprinln( "array is identical" )

Чтение значений из памяти ( разыменование указателя ): ptrByte, ptrSignByte, ptrWord, ptrSignWord, ptrDWord, ptrSignDWord, ptrQWord, ptrSignQWord, ptrPtr

Считывает значение указанного типа расположенного по адресу. ptrPtr - работает с учетом разрядности, для x86 адрес дополняется до 64 битного.

Чтение массивов из памяти: loadBytes, loadSignBytes, loadWords, loadSignWords, loadDWords, loadSignDWords, loadQWords, loadSignQWords, loadPtrs

Считывает указанное количество байт, слов, двойных слов, четверных слов из памяти. Функции loadSignXXX трактуют считанные целые числа как знаковые. loadPtrs - считывает массив указателей ( с учетом разрядности платформы ), для x86 адрес дополняется до 64 битного.

Чтение строк из памяти: loadUnicodeString, loadAnsiString

Считывает строку из структуры типа UNICODE_STRING или ANSI_STRING

Чтение нуль-терминированных строк ( C-строк ) из памяти: loadCStr, loadWStr

сабж

Типизированные переменные

класс typedVarClass

Представляет переменную сложного типа ( структуры ). Поля структуры представляются соответствующими свойствами класса
Методы:
  • getAddress() - возращает адрес структуры в памяти

typedVar( moduleName, typeName, addr )

Создает экземпляр типа typedVarClass, добавляет в него поля, одноименные с полями указанного типа и инциализирует их значением, которые считываются начиная с указанного адреса в соответствии с описанием типа

containingRecord( adress, moduleName, typeName, fieldName )

аналог С макроса CONTAINING_RECORD. Возвращает экземпляр типа typedVarClass с инициализированными полями

typedVarList( adress, moduleName, typeName, listFieldName )

возвращает список объектов типа moduleName!typeName которые в паямти представлены в виде связанного списка с началом по адресу address

Примеры:

  a = loadTypedVar( "nt", "_DRIVER_OBJECT", ebx )
  majorCreate = a.MajorFunction[0]
  b = containingRecord( listEntry, "nt", "_KTHREAD", "ThreadListEntry" )

Модули и символы

findSymbol( address )

Возвращает символьное имя, соответствующее данному адресу. Возвращаемое значение может быть в следующих формах: модуль!символ - если найденно точное соответствие; _module+смещение - если адрес принадлежит модулю, для которого отсутствует сивольная информация; еслли адрес не принадлежит ни одному модулю, возвращается сам адрес.

getOffset( moduleName, symbolName )

Возвращает виртуальный адрес, соответствующий данному символу

Примеры:

  KiInterruptDispatch = getOffset( "nt", "KiInterruptDispatch" )          
  dprintln( findSymbol( KiInterruptDispatch ) )

getPdbFile( moduleBase )

Возвращает полный путь к файлу с символьной информацией для указанного модуля

reloadSymbols( имя модуля )

загружает символы для указанного модуля. Аналог команды .reload /f имя_модуля

Процессы и потоки

getCurrentStack()

Возвращает коллекцию объектов типа dbgStackFrameClass.
    # print current stack
    stackFrames = getCurrentStack()
    [ dprintln( findSymbol( f.instructionOffset ) + "  (%x)" % f.instructionOffset )  for f in stackFrames ]

getImplicitThread()

Возвращает адрес структуры, описывающий теущий поток ( KTHREAD или TEB )

setImplicitThread( threadAddress )

Меняет текущий контекст.

dbgStackFrameClass

Описывает фрейм стека

Поля:
  • instructionOffset
  • returnOffset
  • frameOffset
  • stackOffset
  • frameNumber

Last edited Feb 16, 2011 at 11:00 AM by EreTIk, version 26

Comments

No comments yet.