次はデバッガクラスの一部です。私は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()があります。
は、MSDNによると:「指定されたダイナミックリンクライブラリ(DLL)からエクスポートされた関数または変数のアドレスを取得します。」あなたのプロセスに読み込まれたことについて何も見つかりませんでした。あなたは参照を提供しますか?さらに、私は指定されたアドレス空間内のprintf.exeによって読み込まれたkernel32.dll関数にアクセスすることができます。 – PSS
@PSSは、あなたは*すべての*プロセスのロードkernel32.dllのためkernel32.dllの機能をロードすることができます。上記の参考文献が追加されました。これでも依然として納得できない場合は、SysInternals Process Explorerを入手して、自分でロードされているDLLを確認してください。 –
@PSS - それは、ドキュメントに明示的に綴られていないが、「のLoadLibrary、LoadLibraryEx、またはのGetModuleHandle関数は、このハンドルを返します」というフレーズは、手掛かりを与える必要があります。 – atzz