如何确定哪个 Windows DLL 正在用于函数调用?

How can I determine which Windows DLL is being used for a function call?

我一直在研究 _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

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

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

  1. 如果是静态导入,您可以探索 IAT 并检查其导入的模块。
  2. 如果您是动态执行的(即:使用 GetProcAddress),您可以使用 VirtualQuery and GetModuleFileName to find out the module its from. There is also GetModuleBaseName 查找模块名称。
  3. 只需跟踪上面示例中成功 GetProcAddress 时使用的 HMODULE