DLL劫持
概念
首先来理解DLL在Windows系统中的作用,DLL全称Dynamic Link Library,称为动态连接库,在Windows系统中,大多数程序并不是一个单独的可执行文件,而是有一些单独的存放动态链接库在系统中,当需要某些功能时,通过DLL执行相应的功能,即DLL调用。
那么既然程序执行某些功能时,可能会通过DLL调用,从利用角度来看,如果替换了这个DLL文件,或者导出了原DLL的导出函数并恶意构造,在原程序调用正常DLL前调用了我们预先构造好的恶意DLL,那么就达到了劫持的效果。
所以手法可以有多种,比如替换原DLL文件,黑DLL放置最先路径,DLL转发等。

DLL搜索顺序
- 进程对应的应用程序所在目录;
- 当前目录(Current Directory);
- 系统目录(通过 GetSystemDirectory 获取);
- 16 位的系统目录(即 Windows 目录中的 System 目录);
- Windows目录(通过 GetWindowsDirectory 获取);
- PATH环境变量中的各个目录;
例如:对于文件系统,如Doc文档打开会被应用程序Office打开,而Office运行的时候会加载系统的一个DLL文件,如果我们用恶意的DLL来替换系统的DLL文件,就是将DLL和Doc文档放在一起,运行的时候就会在当前目录中找到DLL,从而优先系统目录下的DLL而被执行。
更详细的参考文档可以在官方文档中查看:
https://docs.microsoft.com/zh-cn/windows/win32/dlls/dynamic-link-library-search-order
防御思路
- 调用第三方DLL时,使用绝对路径
- 调用API SetDllDirectory()将当前目录从DLL加载顺序中移除
- 在开发阶段,就使用工具对系统进行测试
DLL劫持漏洞的检测软件
文末查看软件下载地址
- Ratter
- ChkDllHijack
- Process Explorer
- DLL Hijack Auditor