我想使用GetProcAddressto获得一组API Native'm。在GetModuleHandle首先使用的方法得到了考虑的DLLHandle然后是我想要的API地址,由GetProcAddress采用。它适用于ntdll中的函数,但对于user32和advapi32,GetModuleHandle函数返回null值。为了解决这个问题,你的建议是什么?
enter code here
HANDLE Proc = GetCurrentProcess();
HMODULE hNtdll = GetModuleHandle(TEXT("ntdll.dll"));
FARPROC function_address = GetProcAddress(hNtdll, function_name);
答案 0 :(得分:3)
GetModuleHandle()
要求已加载DLL:
检索指定模块的模块句柄。 调用过程必须已加载模块。
ntdll.dll 将始终加载,但默认情况下不一定会加载 user32.dll 和 advapi32.dll 。根据您的描述,听起来好像代码首先调用GetModuleHandle()
,如果DLL尚未加载则会失败(如果失败则检查GetLastError()
的值)。
对默认情况下未加载的DLL使用LoadLibrary()
。但是,在LoadLibrary()
失败的情况下使用GetModuleHandle()
是一种危险的策略,因为进程中的其他某个线程可能FreeLibrary()
已通过GetModuleHandle()
获取句柄的DLL (意味着您通过该句柄获取的任何函数地址都是无效的,因为DLL不再在内存中)。将LoadLibrary()
与后续FreeLibrary()
一起使用是一种更安全的方法,因为它可以确保在您FreeLibrary()
之前不会卸载DLL。