以下是调试器类的一部分。我有以下代码用于枚举被调试者中的进程。首先,它枚举现有被调试者进程的句柄并将其加载到数组中。然后我试图获取特定模块中特定功能的地址。在这种情况下,我试图从msvcr100.dll中获取printf()的地址
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
出于某种奇怪的原因,我无法让它工作。GetPorcAddress() 返回:
错误:126 - 找不到指定的模块。有任何想法吗???
PS。 这可能会稍微澄清我的问题: 脚本输出
输入要附加到的进程的 PID:2476 开通流程:2476 [*] DebugActiveProcess: 0 - 操作成功完成。 [*] EnumProcessModules:检测到 4 个模块 [*] 0 - 0x00400000 - printf.exe [*] 1 - 0x7c900000 - ntdll.dll [*] 2 - 0x7c800000 - kernel32.dll [*] 3 - 0x78aa0000 - MSVCR100.dll [*] GetProcAddress() 错误:126 - 找不到指定的模块。 [**] 获取 printf() 地址为:0x00000000 [*] 完成调试。退出...
如您所见, msvcr100.dll 在0x78aa0000加载。据我了解,它的地址空间中应该有 printf() ,我应该能够在其中获得它的地址。此外,我在 OllyDbg 中加载了 printf.exe,它显示的内容与您在我的脚本输出中看到的内容相同,并且我能够在 msvcr100.dll 的导出列表中看到 printf()。