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

时间:2015-01-05 06:52:55

标签: c++ windows dll msvcrt ntdll

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

为了实用,你有两个主要选项:

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