据我所知,DLL 按以下顺序加载(简化):
- 存在于记忆中吗?
- 已知 DLL
- 当前应用程序目录
System32
目录- 等等(不在问题范围内)
重现该行为的步骤:
- 下载进程浏览器(Sysinternals)
- 复制
rsaenh.dll
并bcrypt.dll
(从C:\Windows\System32
)至C:\Users\<username>\AppData\Local\Temp
- 启动进程资源管理器,在 procexp64 上按 Ctrl+D 并查找 DLL
-> 请参阅 是rsaenh.dll
从 加载的System32
,而 是bcrypt.dll
从文件夹加载的Temp
。
那么,既然两个 dll 都没有在 KnowDLLs 中被阻止,为什么会出现不同的行为呢?
答案1
操作系统为应用程序提供了几种不同的搜索策略选择,请参阅https://learn.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order
当然,应用程序也可以实现自己的搜索并将绝对路径传递给LoadLibrary
,从而绕过任何操作系统搜索。
除此之外,一些 DLL 被作为进程内 COM 服务器加载,在这种情况下,HKEY_CLASSES_ROOT
当应用程序要求创建对象时,路径信息从注册表(下方,它是合并 HKLM 和 HKCU 的视图)加载。