首页 > 解决方案 > 如何控制 DLL 的搜索顺序以避免劫持?

问题描述

作为背景:我的应用程序需要:

通常,要使用 API,我可以链接所需的 *.lib 文件。但是它使用默认搜索顺序,这意味着(根据https://docs.microsoft.com/en-us/windows/win32/dlls/dynamic-link-library-search-order)它​​首先从“目录从中加载应用程序。” 因此,如果 DLL 存在于同一目录中,则通过双击运行我的应用程序也会加载该 DLL。我只想在系统目录中查找 DLL(类似于https://stackoverflow.com/a/46182665/9015013)。

我知道我可以尝试创建某种代理,例如

    BOOL WinAPIFunction(WinAPIType param) {
  return reinterpret_cast<decltype(&WinAPIFunction)>(
    reinterpret_cast<void*>(GetProcAddress(manually_loaded_module, "WinAPIFunction")))(param);
}

但是很难维护所有这些功能。有没有更好的方法来强制 Windows 只在 system32 中查看?我考虑过清单文件,但它需要每个 DLL 的版本,可以打破“能力”要求(DLL 对 Win7 和 Win10 有不同的版本)

标签: c++windowsvisual-studiodllimport

解决方案


该解决方案由@Eryk Sun 在上面的评论中发布。

将已知 dll 中未列出的所有 DLL 添加到延迟加载的库并调用 SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32) 就足够了;在 WinMain 的开头。谢谢


推荐阅读