【问题标题】:How can I determine which Windows DLL is being used for a function call?如何确定函数调用正在使用哪个 Windows DLL?
【发布时间】:2015-03-02 16:57:14
【问题描述】:

我一直在研究 _vsnprintf 并了解到它在 ntdll.dll 和 msvcrt.dll 中可用。

我可以使用GetModuleHandleGetProcAddress访问_vsnprintf,例如:

static int(__cdecl *p__vsnprintf)(char *str, size_t count, const char *format, va_list valist);

static void init(const char *dll)
{
    HMODULE hmod = GetModuleHandleA(dll);
    if (hmod)
    {
        printf("*** Testing %s ***\n", dll);

        p__vsnprintf = (void *)GetProcAddress(hmod, "_vsnprintf");
        if (p__vsnprintf) test__vsnprintf();
        else printf("_vsnprintf not found in %s.\n", dll);
    }
    else printf("*** Unable to load %s ***\n", dll);

    printf("\n");
}

int main(void)
{
    init("ntdll.dll"); /* ntdll _vsnprintf */
    init("msvcrt.dll"); /* msvcrt _vsnprintf */

    printf("*** Testing normal function call ***\n");
    test_vsnprintf(); /* _vsnprintf in ??? */

    return 0;
}

对于通用调用,我如何判断 Windows 使用的是来自 ntdll.dll 还是 msvcrt.dll 的_vsnprintf

【问题讨论】:

    标签: c++ windows dll msvcrt ntdll


    【解决方案1】:

    dumpbin /imports 会告诉你。另外,方便的depends utility

    【讨论】:

    • 感谢您指出dumpbin 程序。输出显示 _vsnprintf 仅从 msvcrt.dll 调用。我不得不将它与 VS2010 一起使用。 VS2013 可以用吗?
    • 如果你的意思是dumpbin 可用于 VS2013,答案是肯定的。 dumpbin 只是一个调用link /dump 的小包装程序。
    【解决方案2】:

    要务实地做到这一点,您有两个主要选项:

    1. 如果它是静态导入,您可以探索 IAT 并检查其导入来源的模块。
    2. 如果您是动态执行此操作(即:使用GetProcAddress),您可以使用VirtualQueryGetModuleFileName 来找出它来自的模块。还有GetModuleBaseName 用于查找模块名称。
    3. 在上面的示例中,当您有一个成功的 GetProcAddress 时,只需跟踪使用的 HMODULE

    【讨论】:

    • 感谢您的回答。我将检查您列出的 WinAPI 函数。对于第 3 点,这是对我使用的代码示例的建议吗?我不确定您跟踪 HMODULE 是什么意思。
    • @HughMcMaster:是的,这是对示例代码的建议。基本上,您有一个额外的全局变量以及函数指针,它保存用于(成功)获取函数指针的模块名称或模块句柄。
    猜你喜欢
    • 2019-04-14
    • 2023-01-07
    • 1970-01-01
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多