5

我刚刚偶然发现这样做GetModuleHandle("ntdll.dll")无需事先调用LoadLibrary("ntdll.dll").

这意味着ntdll.dll已经加载到我的进程中。

假设ntdll.dll将始终加载到 Win32 应用程序上是否安全,因此LoadLibrary不需要调用?

4

1 回答 1

9

来自MSDN on LoadLibrary()(强调我的):

系统在所有加载的模块上维护每个进程的引用计数。调用 LoadLibrary 会增加引用计数。调用 FreeLibrary 或 FreeLibraryAndExitThread 函数会减少引用计数。当模块的引用计数达到零或进程终止时(无论引用计数如何),系统都会卸载模块。

换句话说,继续调用 LoadLibrary() 并确保您的句柄ntdll.dll是安全的——但系统几乎肯定会碰撞引用计数,因为它应该已经加载。

至于“它真的总是加载吗?”,请参阅Image Loader 上的 Windows Internals(简短的回答是肯定的,ntdll.dll它是加载器本身的一部分并且始终存在)。

相关段落是:

图像加载器存在于用户模式系统 DLL Ntdll.dll中,而不是内核库中。因此,它的行为与作为 DLL 一部分的标准代码一样,并且在内存访问和安全权限方面受到相同的限制。该代码的特别之处在于它始终存在于正在运行的进程中(始终加载 Ntdll.dll),并且它是作为新应用程序的一部分在用户模式下运行的第一段代码。(当系统构建初始上下文时,程序计数器或指令指针被设置为 Ntdll.dll 中的初始化函数。)

于 2017-04-25T21:51:02.387 回答