0

これはおそらく質問とctypesいうよりもpydbg質問ですが、結果が一貫していない理由はまだわかりません。

私は次のような使用とそのクラスのexit_hookセットを持っています:LoadLibraryApydbgutils.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文字列に確実に変換して出力することです。

4

2 に答える 2

1

args[0]IIUC、整数であるメモリアドレスの文字列を読み取りたい。

この場合、string_at(またはwstring_at)関数が必要です。ただし、指定されたメモリアドレスに有効なNULで終了する文字列がない場合は、WindowsErrorが発生し、キャッチする必要があります。

于 2012-03-09T10:39:31.413 に答える
1

Thellerが述べたように、arg [0]は、ロードされるdllの名前(またはフルパス)である文字列への参照である可能性があります。したがって、それを行うための可能な方法として上記で述べたものとは別に、read_process_memory関数を使用して、次のようにansi / unicode文字列を取得することもできます:dataMem = dbg.read_process_memory(argu [0]、100)#assumingパス名は最大200バイトで、調整できます。fileName = dbg.get_unicode_string(dataMem)#これにより、文字列名がUnicodeとしてデコードされます。またはfileName=dbg.get_ascii_string(dataMem)#これにより、文字列名がASCIIとしてデコードされます。

于 2012-04-18T09:18:38.193 に答える