В pydbg exit_hook (обратный вызов) как я могу преобразовать значение стека в соответствующий тип Python? - PullRequest
0 голосов
/ 08 марта 2012

Возможно, это скорее вопрос ctypes, чем вопрос pydbg, но я до сих пор не понимаю, почему результаты несовместимы с тем, как они есть.

У меня есть exit_hookустановите на LoadLibraryA, используя pydbg и его класс utils.hook_container, например:

def exit_LoadLibraryA(dbg, args, ret):
    libname = c_char_p(args[0])
    # or: libname = ctypes.cast(args[0], ctypes.c_char_p)
    print "LoadLibraryA(%s) -> %08X" % (str(libname), ret)
    return DBG_CONTINUE

, к сожалению, выходные данные противоречивы.В то время как некоторые значения преобразуются в (и отображаются в виде) строк, некоторые другие отображаются в виде чисел, подобных этому:

LoadLibraryA(c_char_p(2007516492)) -> 7C800000
LoadLibraryA(c_char_p(17426164)) -> 77DD0000
LoadLibraryA(c_char_p(17426164)) -> 76C30000
LoadLibraryA(c_char_p('UxTheme.dll')) -> 5AD70000
LoadLibraryA(c_char_p('IMM32.dll')) -> 76390000
LoadLibraryA(c_char_p('COMCTL32.dll')) -> 773D0000
LoadLibraryA(c_char_p('Secur32.dll')) -> 77FE0000
LoadLibraryA(c_char_p(1033757216)) -> 7C9C0000

я хотел бы надежно преобразовать char* (а затем wchar_t* из LoadLibraryW) в строку Python для ее вывода.

Ответы [ 2 ]

1 голос
/ 18 апреля 2012

Как упомянуто Theller, arg [0] может быть ссылкой на строку, которая является именем (или полным путем) загружаемой библиотеки DLL. Таким образом, помимо того, что упоминалось выше как возможный способ сделать это, вы также можете попробовать использовать функцию read_process_memory, а затем получить строку ansi / unicode следующим образом: dataMem = dbg.read_process_memory (аргумент [0], 100) # предполагая, что имя пути займет не более 200 байтов, которые вы можете настроить. fileName = dbg.get_unicode_string (dataMem) # Это будет декодировать имя строки как Unicode. ИЛИ fileName = dbg.get_ascii_string (dataMem) # Это будет декодировать имя строки как ascii.

1 голос
/ 09 марта 2012

IIUC, вы хотите прочитать строку по адресу памяти args[0], который является целым числом.

В этом случае вам нужна функция string_at (или wstring_at). Однако, если по указанному адресу памяти нет действительной строки с NUL-завершением, будет сгенерировано сообщение об ошибке WindowsEr, которое вы можете захотеть перехватить.

...