如何控制 DLL 的搜索顺序以避免劫持?

How can I control search order for DLLs to avoid hijacking?

作为背景:我的申请要求:

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

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

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

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

您可以尝试使用"Known DLLs"功能:如果Windows "knows"那个DLL,Windows不搜索dll文件。已知特征被描述成link,你写的有问题。

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

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