0

这可能更像是一个ctypes问题而不是一个pydbg问题,但我仍然不明白为什么结果与它们的方式不一致。

我有一个exit_hook关于LoadLibraryAusing的集合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*of LoadLibraryW)转换为 Python 字符串以输出它。

4

2 回答 2

1

正如 Theller 所提到的,arg[0] 可能是对正在加载的 dll 的名称(或完整路径)的字符串的引用。因此,除了上面提到的可能的方法之外,您还可以尝试使用 read_process_memory 函数,然后获取 ansi/unicode 字符串,如下所示: dataMem=dbg.read_process_memory(argu[0],100) #假设路径名最多占用 200 个字节,您可以对其进行调整。fileName=dbg.get_unicode_string(dataMem) # 这会将字符串名称解码为 un​​icode。OR fileName=dbg.get_ascii_string(dataMem) # 这会将字符串名称解码为 ascii。

于 2012-04-18T09:18:38.193 回答
1

IIUC,你想在内存地址读取字符串,args[0]它是一个整数。

在这种情况下,您需要string_at(or wstring_at) 函数。但是,如果在指定的内存地址没有有效的以 NUL 结尾的字符串,则会引发您可能想要捕获的 WindowsError。

于 2012-03-09T10:39:31.413 回答