понедельник, 18 апреля 2011 г.

Release 0.0.17

Представляем очередной релиз pykd: 0.0.17. И так что нового:

Документация

Прежде всего, мы сделали нечеловеческое усилие над собой и добавили документацию для всех функций и классов. Правда документация пока очень-очень-очень скупая, но мы обещаем над этим поработать. А чтобы продемонстрировать, как это работает, мы написали скрипт help.py ( его можно взять тут ) выводящий интерактивный хелп в windbg. Пробуем:
0. загружаем плагин .load pykd.pyd
1. нажимаем ctrl+N
2. в строке ввода набираем !py help
4. наслаждаемся.

Добавили в API несколько функций:

bool isDumpAnalyzing()
Позволяет определить, анализируется ли в данным момент дамп или производится отладка живой системы. Если в скрипте используются функции управления отладчиком ( go, управления точками останова и.т.д ), имеет смысл вставить данный вызов и уберечь пользователя от неизбежных ошибок при попытке исполнения скрипта во время анализа дампа

bool isWindbgExt()
Позволяет определить, исполняется ли скрипт внутри WinDbg или вызван процессом интерпретатором python. Ранее для этого использовался неявный метод и вызов isSesionStart. Теперь isSessionStart удалена, этот вызов следует заменить в коде на isWindbgExt.

string loadChars(address, number)
В стандартной библиотеке python существует ряд средств для работы с массивами "сырых" данных. Все они для представления буфера данных используют класс string. Для того, чтобы не заниматься преобразованием списка байт, которые возвращает функция loadBytes мы добавили функцию loadChars.
Ее удобно использовать, например, вместе с модулем struct:
>>> from struct import unpack
>>> shortField1, shortField2, longField = unpack('hhl', loadChars( addr, 8 ) )

Методы checksum() and timestamp() класса dbgModuleClass
Из названия методов должно быть ясно, их назначение. Если Вам придет в голову написать собственный загрузчик символов ( почему бы и нет? ), то они вам могут пригодится.

callbacks for bp class ( breakpoint )
Это, можно сказать, изюминка данного релиза. До сих пор, пользоваться точками останова ( breakpoint ) из pykd было не слишком удобно. Теперь при создании новой точки останова можно задать функцию обратного вызова и обрабатывать из в событийно-ориентированном стиле.

Пример:
from pykd import *

def bpCallback():

    if is64bitSystem():
        objAttr = typedVar( "ntdll", "_OBJECT_ATTRIBUTES", reg("r8") ) 
    else:
        objAttr = typedVar( "ntdll", "_OBJECT_ATTRIBUTES", ptrPtr(reg("esp") + 0xC) )  

    name = loadUnicodeString( objAttr.ObjectName )

    dprintln( "NtCreateFile: " + name )

    return DEBUG_STATUS_GO_HANDLED

if not isWindbgExt():
    startProcess("notepad.exe")

if not isDumpAnalyzing() and not isKernelDebugging():        
    nt = loadModule("ntdll")
    b1 = bp( nt.NtCreateFile, bpCallback )   
    # wait for user break, exceptions or process exit
    go()
    dprintln( "stopped" )    
else:
    dprintln( "The debugger must be connected to live usermode process" )

typedVarList
При работе со связанными списками в (ядре) Windows часто используется структура LIST_ENTRY. Изначально функция typedVarList была ориентирована на такие списки. Однако, гораздо чаще используется другой подход для создания связанных списков: когда структура содержит указатель ( Next ) на начало следующей структуры. Теперь, typedVarList поддерживает оба случая. Какой вариант связного списка использовать, определяется по типу поля-указателя на следующий элемент.

Новый инсталлятор

К релизу 0.0.17 мы существенно переработали инсталятор:
  • Новый дизайн
  • Добавили деинсталлятор ( вдруг кому-нибудь понадобится? )
  • Добавили примеры в комплект иснталлятора
  • Выбор дополнительных компонентов по желанию пользователя ( VCRedist, python, примеры )

Bug fixed

8470 ( python.exe crashes after first pykd call )
8614 ( go() works incorrectly while process is terminating )
8499 ( !py command crashs with wrong script's path )
8578 ( findModule returns None for WOW64 process )
8493 ( loadPtrs returns dict instead list )
8469 ( dprintln does not work in console mode )

Надеемся, релиз 0.0.17 сделает вашу работу с pykd более приятной и плодотворной!

Комментариев нет:

Отправить комментарий