【问题标题】:How can one obtain the "name" of a process start address as done in Process Explorer?如何像在 Process Explorer 中那样获得进程起始地址的“名称”?
【发布时间】:2011-05-23 20:31:33
【问题描述】:

好的,我正在编写一个旨在枚举给定进程中的线程的应用程序,就像 Process Explorer 所做的那样。我很清楚这可能会在不同的 Windows 版本之间中断,因为它依赖于像 NtQuerySystemInformation 这样的“非官方”API,我对此非常满意。

我已经有了获取给定线程基地址的代码。我现在想把它变成类似于进程资源管理器所做的事情,即“ntdll.dll!EtwDeliverDataBlock+0x453”。我实际上不需要函数名或偏移量,只需要模块名。

我该怎么做?

【问题讨论】:

    标签: c++ windows process kernel


    【解决方案1】:

    如果您只需要模块名称,最简单的方法是使用EnumProcessModules 获取所有已加载模块的列表,然后在每个模块上使用GetModuleInformationGetModuleInformation 返回的其中一件事是加载该模块的基地址。从技术上讲,HMODULE 本身的整数值与基地址相同,但这对我来说似乎有点脆弱......

    那么只需找到基地址刚好低于线程当前(或起始)地址的模块。

    哦,要获得模块的实际名称,GetModuleBaseName

    【讨论】:

    • 嗯..这可能有效。有什么办法可以让我不必实际打开目标进程的句柄? (例如,不能对系统进程这样做)
    • @Billy:我不确定。我相信 Process Explorer 实际上使用内核模式驱动程序来实现它的某些功能,所以也许这是其中之一......?
    • 通过使用 SystemModuleInformation 类调用 NtQuerySystemInformation 来解决它——我会尽快回复你。
    【解决方案2】:

    您可以使用GetModuleHandleExGET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS 标志来获取给定地址的模块的句柄。然后您可以使用GetModuleBaseName 来获取模块的名称。

    编辑:您可能还想使用GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT 标志,这样就不会增加模块的引用计数。

    【讨论】:

    • GetModuleHandleEx 不适用于远程进程。因此,您使用 UNCHANGED_REFCOUNT 标志的建议也无关紧要......
    【解决方案3】:

    您可以使用该代码获取模块句柄(它比GetModuleHandleEx 更快)然后调用GetModuleBaseName

    HMODULE GetCallingModule( LPCVOID pCaller ) const
    {
        HMODULE hModule = NULL;
        MEMORY_BASIC_INFORMATION mbi;
        if ( VirtualQuery(pCaller, &mbi, sizeof(MEMORY_BASIC_INFORMATION)) == sizeof(MEMORY_BASIC_INFORMATION) )
        {
            // the allocation base is the beginning of a PE file 
            hModule = (HMODULE) mbi.AllocationBase;
        }
        return hModule;
    }
    

    【讨论】:

    • @KindDragon:它需要VirtualQueryEx 才能跨进程工作,甚至需要相应的进程句柄。不过,通过在您自己的进程中查找静态变量的MEMORY_BASIC_INFORMATION::AllocationBase 来获得HINSTANCE hInstance 是一个巧妙的技巧。但这只有在您避免使用样板 CRT 代码时才需要……
    猜你喜欢
    • 2012-07-18
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    相关资源
    最近更新 更多