В pydbg exit_hook (обратный вызов) как я могу преобразовать значение стека в соответствующий тип Python?
Это возможно больше 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 ответа
IIUC, вы хотите прочитать строку по адресу памяти args[0]
который является целым числом.
В этом случае вам нужно string_at
(или же wstring_at
) функция. Однако, если по указанному адресу памяти нет действительной строки с NUL-окончанием, будет сгенерировано WindowsError, которое вы, возможно, захотите перехватить.
Как упоминалось Theller, arg[0] может быть ссылкой на строку, которая является именем (или полным путем) загружаемой библиотеки DLL. Таким образом, помимо того, что упомянуто выше как возможный способ сделать это, вы также можете попробовать использовать функцию read_process_memory, а затем получить строку ansi / unicode следующим образом: dataMem = dbg.read_process_memory (arguments [0],100) #assuming имя пути займет не более 200 байтов, которые вы можете настроить. fileName=dbg.get_unicode_string(dataMem) # Это будет декодировать имя строки как Unicode. ИЛИ fileName=dbg.get_ascii_string(dataMem) # Это будет декодировать имя строки как ascii.