2011-02-01 30 views
0

次はデバッガクラスの一部です。私はdebugeeのプロセスを列挙するための次のコードを持っています。まず、既存のdebugeeのプロセスのハンドルを列挙し、配列にロードします。次に、特定のモジュールの特定の機能のアドレスを取得しようとしています。この場合、私はmsvcr100.dll、私はそれを動作させることはできませんいくつかの奇妙な理由で Python :: ctypes :: GetProcAddress()はエラーを返します


def enumerate_module(self,pid):

lphModule = (c_void_p * 1024)() 
    lpcbNeeded = c_ulong(0) 

    if psapi.EnumProcessModules(self.h_process,lphModule,sizeof(c_void_p)*1024, byref(lpcbNeeded)): 
     print "[*] EnumProcessModules: %d modules detected" % int(lpcbNeeded.value/sizeof(c_void_p)) 
     for i in range(int(lpcbNeeded.value/sizeof(c_void_p))): 
      FileName = "" 
      ReadBuffer = create_string_buffer(MAX_PATH) 
      psapi.GetModuleFileNameExA(self.h_process,lphModule[i],ReadBuffer,MAX_PATH) 
      FileName += ReadBuffer.value 
      print "[*] %d - 0x%08x - %s" % (i,lphModule[i],FileName) 
     address = kernel32.GetProcAddress(lphModule[3],"printf") 
     if address == False: 
      error = GetLastError() 
      print "[*] GetProcAddress() ERROR: %d - %s" % (error, FormatError(error))  
     print "[**] Getting printf() address is: 0x%008x" % address 
     return True 
    else: 
     error = GetLastError() 
     print "[*] GetModuleHandleA: %d - %s" % (error, FormatError(error)) 
     return False 

のうち、のprintf()のアドレスを取得しようとしています。 GetPorcAddressは()を返します。

 
ERROR: 126 - The specified module could not be found.

Any ideas???

PS. This might clarify my question a little: Script output

Enter the PID of the process to attach to: 2476 Opening process: 2476 [*] DebugActiveProcess: 0 - The operation completed successfully. [*] EnumProcessModules: 4 modules detected [*] 0 - 0x00400000 - printf.exe [*] 1 - 0x7c900000 - ntdll.dll [*] 2 - 0x7c800000 - kernel32.dll [*] 3 - 0x78aa0000 - MSVCR100.dll [*] GetProcAddress() ERROR: 126 - The specified module could not be found. [**] Getting printf() address is: 0x00000000 [*] Finished debugging. Exitng...

あなたはmsvcr100.dllが0x78aa0000にロードされて見ることができるように。私が理解する限り、 は、アドレス空間内にprintf()を持つべきです。ここでは、 のアドレスを取得できるはずです。さらに、私はOllyDbgにprintf.exeをロードしました。スクリプトの出力に表示されている のものが表示されました。 msvcr100.dllのエクスポートリストにprintf()があります。

答えて

2

GetProcAddressは、プロセスにロードされたDLL内の関数内の関数のアドレスを取得しますが、別のプロセスではありません。 Debug Help Libraryをチェックアウトする必要があります。 GetProcAddressについてのあなたの要求ごとに

、私の参照:
関数や変数を含むDLLモジュールのハンドル[中]

GetProcAddress

HMODULE。 LoadLibrary,LoadLibraryExまたはGetModuleHandle関数は、このハンドルを返します。

LoadLibrary

LoadLibraryEx

は、アドレス空間に指定されたモジュールをロードします....呼び出し元プロセスのアドレス空間に指定したモジュールをロードします呼び出しプロセスの....

GetModuleHandle

指定したモジュールのモジュールハンドルを取得します。モジュールは呼び出しプロセスによってロードされている必要があります。

+0

は、MSDNによると:「指定されたダイナミックリンクライブラリ(DLL)からエクスポートされた関数または変数のアドレスを取得します。」あなたのプロセスに読み込まれたことについて何も見つかりませんでした。あなたは参照を提供しますか?さらに、私は指定されたアドレス空間内のprintf.exeによって読み込まれたkernel32.dll関数にアクセスすることができます。 – PSS

+1

@PSSは、あなたは*すべての*プロセスのロードkernel32.dllのためkernel32.dllの機能をロードすることができます。上記の参考文献が追加されました。これでも依然として納得できない場合は、SysInternals Process Explorerを入手して、自分でロードされているDLLを確認してください。 –

+0

@PSS - それは、ドキュメントに明示的に綴られていないが、「のLoadLibrary、LoadLibraryEx、またはのGetModuleHandle関数は、このハンドルを返します」というフレーズは、手掛かりを与える必要があります。 – atzz

0

私はそれがあなたのシステムでその特定のDLLを見つけることができないと信じています。ここではprintfのアドレスを返します簡単な関数です:

from ctypes import * 

kernel32 = windll.kernel32 

def resolve_function(dll, func): 
    handle = kernel32.GetModuleHandleA(dll) 
    address = kernel32.GetProcAddress(handle, func) 
    kernel32.CloseHandle(handle) 
    return address 

address = resolve_function('msvcrt.dll','printf') 

print(address) 

が、私はまだだけでなく、このようなものを学んでいる、と私はmsvcrt.dllmsvcr100.dllとの差のかなりよく分かりません。しかし、あなたはmsvcrt.dllとリンクする必要があり、マイクロソフトはmsvcrXX.dllを見つけるためにいくつかの魔法を実行すると信じています。 http://msdn.microsoft.com/en-us/library/abx4dbyh

+0

返信ありがとうございますが、GetModuleHandleA()はデバッグ中のプロセスのプロシージャアドレスを解決しようとしている呼び出し元プロセスによって初期化されたモジュールでのみ機能するため、メソッドは機能しません。 msvcrt.dllとmsvcr100.dllの違いはここでは重要ではありません。私がmsvcr100.dllをlphModule [3]のアドレスでdebugeeによって読み込まれるように解決できることは何が重要なのですか? GetProcAddress()は、モジュール内で関数のアドレスを返す必要があります。しかし、それはしません。 – PSS

関連する問題