我刚刚偶然发现这样做GetModuleHandle("ntdll.dll")
无需事先调用LoadLibrary("ntdll.dll")
.
这意味着ntdll.dll
已经加载到我的进程中。
假设ntdll.dll
将始终加载到 Win32 应用程序上是否安全,因此LoadLibrary
不需要调用?
我刚刚偶然发现这样做GetModuleHandle("ntdll.dll")
无需事先调用LoadLibrary("ntdll.dll")
.
这意味着ntdll.dll
已经加载到我的进程中。
假设ntdll.dll
将始终加载到 Win32 应用程序上是否安全,因此LoadLibrary
不需要调用?
来自MSDN on LoadLibrary()(强调我的):
系统在所有加载的模块上维护每个进程的引用计数。调用 LoadLibrary 会增加引用计数。调用 FreeLibrary 或 FreeLibraryAndExitThread 函数会减少引用计数。当模块的引用计数达到零或进程终止时(无论引用计数如何),系统都会卸载模块。
换句话说,继续调用 LoadLibrary() 并确保您的句柄ntdll.dll
是安全的——但系统几乎肯定会碰撞引用计数,因为它应该已经加载。
至于“它真的总是加载吗?”,请参阅Image Loader 上的 Windows Internals(简短的回答是肯定的,ntdll.dll
它是加载器本身的一部分并且始终存在)。
相关段落是:
图像加载器存在于用户模式系统 DLL Ntdll.dll中,而不是内核库中。因此,它的行为与作为 DLL 一部分的标准代码一样,并且在内存访问和安全权限方面受到相同的限制。该代码的特别之处在于它始终存在于正在运行的进程中(始终加载 Ntdll.dll),并且它是作为新应用程序的一部分在用户模式下运行的第一段代码。(当系统构建初始上下文时,程序计数器或指令指针被设置为 Ntdll.dll 中的初始化函数。)