我编写了一个 32 位 C++ Hello World 程序。然后我通过 SysInternal 的 Procmon 观察了它的执行情况。令我惊讶的是,我有 5 个“加载图像”类型的事件。加载了以下内容:
- 动态链接库
- 内核32库
- 内核库
- 应用程序帮助文件
- msvcrt.dll
msvcrt.dll 和 kernel32.dll 是我的 Hello World 程序导入的 DLL。因此预计会加载。
根据我的研究,Windows 将 apphelp.dll 作为应用程序兼容性的一部分加载到我的进程中。
我想知道:
- 为什么Windows也加载ntdll.dll?
- 为什么Windows还会加载KernelBase.dll?
- 将未经请求的 DLL 加载到进程中的过程称为 DLL 挂钩 (DLL Hooking) 吗?
附言:我正在使用最新的 Windows 10 版本。
答案1
根据您从其他库导入的功能,它们可能依次导入其他库。
例如Kernel32
实际上导入了许多功能KernelBase
并且没有什么可以阻止KernelBase
从中导入函数来ntdll
执行程序所需的基本任务。