c++ - 如何控制 DLL 的搜索顺序以避免劫持?
问题描述
作为背景:我的应用程序需要:
- 管理员权限
- 访问 WinAPI DLL
- 能够在所有操作系统上运行:Win7-Win10
通常,要使用 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 有不同的版本)
解决方案
该解决方案由@Eryk Sun 在上面的评论中发布。
将已知 dll 中未列出的所有 DLL 添加到延迟加载的库并调用 SetDefaultDllDirectories(LOAD_LIBRARY_SEARCH_SYSTEM32) 就足够了;在 WinMain 的开头。谢谢
推荐阅读
- java - 无法在向导页面中重绘 SWT 组合
- swagger-ui - 使用客户端凭据通过 Swagger UI (.NET) 对 Auth0 进行身份验证
- javascript - javascript获取href.replace中间字符串
- android-studio - Android Studio:如何在文件更改时自动重新运行单元测试?
- asp.net - 无法将 css 应用到它说拒绝应用内联 css 的 asp.net mvc 登录页面,
- python - Python可视化2条形图按列和年份分组
- python - Django ORM查询嵌套模型
- shared-libraries - x86_64-w64-mingw32-g++ options -static-libgcc -static-libstdc++ 似乎在 g++ 中被破坏了
- python - 使用 def 无法搜索列表中的元素
- powershell - 安装失败时远程安装脚本并生成日志文件?