1. 什么是DLL
DLL又被称为动态链接库(Dynamic-Link-Library,缩写dll),是Windows操作系统中实现共享函数库概念的一种实现方式。
DLL的文件格式与EXE文件一样,也就是等同于32位的可执行文件PE和16位的NE(New Executable)。作为EXE格式,DLL可以包括源代码、数据和资源的多种组合。
与动态链接库相对的是静态库。静态库被链接后直接嵌入可执行文件中,好处是不需要外部函数支持、无环境依赖、兼容性好,但是坏处也很明显,容易浪费空间、不方便修复bug。
Linux:
静态库名字:libxxx.a
动态库名字:libxxx.so
Windows:
静态库名字:*.lib、 *.h
动态库名字:*.dll、 *.OCX(..etc)
2. DLL劫持原理
2.1 什么是DLL劫持
DLL劫持顾名思义,是去执行一个外部库(DLL)的代码,而不是执行一个可移植的可执行PE文件。通过DLL的搜索顺序,可以将代码植入二进制程序,让易受攻击的应用程序加载并执行。
2.2 DLL劫持漏洞产生原因
开发者在调用DLL时没有指定绝对路径,那么Windows就会按照特定顺序去查找DLL。因此,黑客如果能够优先将DLL置于有效目录,就能够欺骗系统加载恶意DLL,实现DLL劫持。
如上图所示,应用程序执行需调用LPK.dll,该DLL在C:\Windows\system32
目录下,但是由于系统优先搜索当前目录C:\Users\pc\Desktop
,所以如果当前目录存在恶意的DLL,程序会优先加载,从而导致漏洞产生。
2.3 Windows搜索DLL顺序
Windows XP SP2
之前,默认未启用DLL搜索模式,查找DLL目录及其顺序如下:
1 | The directory from which the application loaded. |
1 | 1. 程序的工作目录(ps:该程序是被从什么目录下被启动的。在代码中一般来说./代表着在程序的工作目录下) |
这样的加载顺序很容易导致一个系统dll被劫持,因为攻击者只要将目标文件和恶意dll放在一起即可。导致恶意dll先于系统dll加载,而系统dll是非常常见的。
为了减轻这个影响,从Windows XP Service Pack 2(SP2)
开始启用安全DLL搜索模式
1 | The directory from which the application loaded. |
1 | 1. 程序的工作目录 |
不过哪怕启用了安全DLL搜索模式,也还是会有问题。如果我们对程序安装的目录拥有替换权限,比如程序装在了非系统盘,那么我们同样可以利用加载顺序来劫持系统的dll。
从Windows7
之后,为了更进一步防御系统的DLL被劫持,微软将一些容易被劫持的DLL写进了一个注册表项中。凡是此项下的DLL文件均会被禁止从EXE自身所在的目录下调用,只能从系统目录下调用。
注册表路径:
1 | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs |
windows 10
的键值项如下所示
2.4 DLL劫持常规步骤
1 | 1. 启动应用程序 |
3. 微信DLL劫持
讲了这么多,不如我们来实操看下,我们该如何去劫持DLL。这里我们拿经典案例微信来举例子。
3.1 DLL选择
首先是我们的DLL选择。利用ProcessMonitor
来查看微信运行后调用DLL的情况
1 | 下载地址: |
打开后,过滤微信的进程名称,同时监控只留文件监控
因为我微信一直开着,导致数据有点多。就不去专门找DLL了,其实也可以取巧,直接找个带图标的微信进程名点开,选中Process属性也可以看到许多调用的DLL
存在劫持的漏洞一般有两个特征
1 | 不在注册表项HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs中 |
这里发现了有一个是符合条件的,ddraw.dll
,具体注册表不在截图。
3.2 脚本上线
编写劫持脚本分为两步
- 查看被劫持DLL的导出函数
- 编写实现劫持DLL向原DLL函数的转发,并在过程中插入恶意代码
至于如何生成脚本代码,我一般选用DLL_Hijacker
直接生成
1 | https://github.com/coca1ne/DLL_Hijacker |
下载好项目后,直接python2运行
1 | python DLL_hijacker.py c:\\Windows\\SysWOW64\\ddraw.dll |
生成代码后,使用visual studio
创建一个项目,修改项目属性的扩展名为.dll
,配置类型为动态库(.dll)
,MFC使用标准Windows库
配置好后将我们的代码贴到创建的cpp文件中,然后生成一个dll文件出来,并重命名为ddraw.dll
将我们重命名好的dll文件放入微信的安装目录,然后重启微信
运行微信后,直接弹出了一个弹框,成功劫持我们的微信。当然我们也可以换成别的,比如计算机、上马等
都到这了,那就上个CS看看喽。在执行时,需要创建线程并在主函数DLLMain
中运行
点击微信后,直接上线CS
3.3 防御思路
- 将应用程序和DLL安装在受保护的文件夹中,如
C:\Program Files
或C:\Windows
等 - 禁用远程DLL加载
- 应用程序白名单
- 调用第三方DLL时,使用绝对路径
- 调用API SetDllDirectory(L””)将当前目录从DLL加载顺序中移除
- 开发测试阶段,可以采用Process Monitor进行黑盒复测
4. 参考链接
1 | DLL劫持漏洞与思考 |
发布时间: 2023-07-18
最后更新: 2023-07-21
本文标题: DLL劫持-微信篇
本文链接: https://foxcookie.github.io/2023/07/18/DLL劫持-微信篇/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!