2012-03-08 3 views
0

これはpydbgの質問よりも、おそらく​​の質問ですが、結果が矛盾している理由はまだ分かりません。pydbg exit_hook(コールバック)の中で、どのようにしてスタック値を一致するPython型に変換できますか?

私はこのようなpydbgを使用してLoadLibraryAexit_hookセットとその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*(以降LoadLibraryWwchar_t*)に変換することですそれを出力するPython文字列。

答えて

1

IIUCの場合、整数のメモリアドレスargs[0]の文字列を読み取る必要があります。

この場合、string_at(またはwstring_at)機能が必要です。ただし、指定されたメモリアドレスに有効なNUL終了文字列がない場合は、捕捉したいWindowsErrorが発生します。

+0

ありがとうございます。私はそれを試してみると戻って報告する(と受け入れる:) – 0xC0000022L

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)#これは、文字列名をUnicodeとしてデコードします。 OR fileName = dbg.get_ascii_string(dataMem)#文字列名をASCII形式でデコードします。

+0

あなたの答えをありがとう。 – 0xC0000022L

関連する問題