为什么某些已知 DLL 中不存在的 DLL 不会从当前应用程序目录中加载

为什么某些已知 DLL 中不存在的 DLL 不会从当前应用程序目录中加载

据我所知,DLL 按以下顺序加载(简化):

  1. 存在于记忆中吗?
  2. 已知 DLL
  3. 当前应用程序目录
  4. System32目录
  5. 等等(不在问题范围内)

重现该行为的步骤:

  • 下载进程浏览器(Sysinternals)
  • 复制rsaenh.dllbcrypt.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 的视图)加载。

相关内容