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

Posted

技术标签:

【中文标题】如何控制 DLL 的搜索顺序以避免劫持?【英文标题】:How can I control search order for DLLs to avoid hijacking? 【发布时间】:2020-01-20 07:28:58 【问题描述】:

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

管理员权限 访问 WinAPI DLL 能够在所有操作系统上运行:Win7-Win10

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

【问题讨论】:

为什么你觉得避免这种劫持是你的责任? 用户可能“信任”我的应用程序,我想确保它不能用来控制用户的机器。我不确定普通用户是否知道 DLL 劫持。 你认为谁会劫持 DLL?他们将如何获得对安装程序的程序文件夹的写入权限? 我的应用没有安装,这是个问题。我可以想象的情况: 1. 下载恶意 DLL(不小心) 2. 下载我的应用程序 3. 以管理员权限运行我的应用程序 您可以delay load DLL。然后,如果 SetDefaultDllDirectories 可通过 GetProcAddress 获得(至少 Windows Vista w/KB2533623),请在启动时设置 DLL 搜索路径以包括“%SystemRoot%\System32”(例如“C:\Windows\System32 "),并排除应用程序目录。这也排除了当前目录(“.”)、“%SystemRoot%”、“%SystemRoot%\System”和PATH 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

您可以尝试使用“已知 DLL”功能:如果 Windows“知道”该 DLL,则 Windows 不会搜索 dll 文件。已知功能描述成链接,你写的有问题。

【讨论】:

这是一个“已知”DLL 列表,我无法修改它或与之交互:( 你为什么需要修改这个列表。确定它包含所有系统 DLL? 不,它不包含所有这些。我想使用例如userenv.dll 或 cabinet.dll 有一些更改注册表的方法(互联网会帮助你)。一种奇怪的方法是从救援磁盘加载并从外部实用程序更改注册表值或安全性。抱歉,但你想要奇怪的东西,你可以用奇怪的方式来做。 @Evgeny:但它从“管理员”的角度解决了问题。我想从我的 exe 中解决它(防止从“不受信任”的位置加载 DLL)。

以上是关于如何控制 DLL 的搜索顺序以避免劫持?的主要内容,如果未能解决你的问题,请参考以下文章

如何判断一个dll是不是可以被劫持

使用Asp开发的网站,如何在用户登陆前后重置ASPSESSIONID,以避免SESSION被劫持造成安全隐患。

如何能彻底删除应用程序DLL劫持病毒?

【易语言】【OD】关于写dll劫持(也可叫做静态补丁)的方法

病毒劫持dll文件是啥意思?

36.浅谈DLL劫持