0

以下是调试器类的一部分。我有以下代码用于枚举被调试者中的进程。首先,它枚举现有被调试者进程的句柄并将其加载到数组中。然后我试图获取特定模块中特定功能的地址。在这种情况下,我试图从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()。

4

2 回答 2

2

GetProcAddress 获取在您的进程中加载​​的 DLL 中函数的地址,而不是在不同的进程中。您应该查看调试帮助库

根据您对 GetProcAddress 的要求,我的参考资料:

获取过程地址

hModule [in]
包含函数或变量的 DLL 模块的句柄。LoadLibraryLoadLibraryExGetModuleHandle函数返回此句柄。

加载库

将指定的模块加载到调用进程的地址空间中......

LoadLibraryEx

将指定的模块加载到调用进程的地址空间中......

获取模块句柄

检索指定模块的模块句柄。该模块必须已由调用进程加载。

于 2011-02-01T04:51:36.733 回答
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.dll区别msvcr100.dll。但是,我相信您需要链接,msvcrt.dll而不是微软做了一些魔术来找到msvcrXX.dll. 查看此页面了解更多信息:http: //msdn.microsoft.com/en-us/library/abx4dbyh

于 2011-02-01T03:29:20.053 回答