1

我一直在研究_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 使用_vsnprintf的是 ntdll.dll 还是 msvcrt.dll?

4

2 回答 2

2

dumpbin /imports会告诉你。此外,方便的depends实用程序.

于 2015-01-05T06:57:25.393 回答
1

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

  1. 如果它是静态导入,您可以探索 IAT 并检查其导入的模块。
  2. 如果您正在动态地执行此操作(即: Using GetProcAddress),您可以使用VirtualQueryandGetModuleFileName找出它来自的模块。还有GetModuleBaseName用于查找模块名称。
  3. HMODULE当您在上面的示例中取得成功时,只需跟踪使用过的GetProcAddress
于 2015-01-05T07:04:02.807 回答