如何确定哪个 Windows DLL 正在用于函数调用?
How can I determine which Windows DLL is being used for a function call?
我一直在研究 _vsnprintf
并了解到它在 ntdll.dll 和 msvcrt.dll 中可用。
我可以使用GetModuleHandle
和GetProcAddress
访问_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.
要务实地做到这一点,您有两个主要选项:
- 如果是静态导入,您可以探索 IAT 并检查其导入的模块。
- 如果您是动态执行的(即:使用
GetProcAddress
),您可以使用 VirtualQuery
and GetModuleFileName
to find out the module its from. There is also GetModuleBaseName
查找模块名称。
- 只需跟踪上面示例中成功
GetProcAddress
时使用的 HMODULE
。
我一直在研究 _vsnprintf
并了解到它在 ntdll.dll 和 msvcrt.dll 中可用。
我可以使用GetModuleHandle
和GetProcAddress
访问_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.
要务实地做到这一点,您有两个主要选项:
- 如果是静态导入,您可以探索 IAT 并检查其导入的模块。
- 如果您是动态执行的(即:使用
GetProcAddress
),您可以使用VirtualQuery
andGetModuleFileName
to find out the module its from. There is alsoGetModuleBaseName
查找模块名称。 - 只需跟踪上面示例中成功
GetProcAddress
时使用的HMODULE
。