DLL劫持漏洞挖掘以及白+黑的实现
字数 1445 2025-08-26 22:11:35
DLL劫持漏洞挖掘与白+黑实现技术详解
一、DLL劫持漏洞概述
DLL劫持漏洞是一种Windows系统特有的安全漏洞,从厂商角度来看可能被忽略,但从权限维持角度来看非常实用。通过"白程序+黑DLL"的方式可以实现持久化攻击。
二、DLL劫持原理
1. 动态链接库工作机制
- DLL(Dynamic Link Library)是Windows系统中的动态链接库
- 程序执行功能时通过DLL调用实现
- 攻击者可替换或伪造DLL文件实现劫持
2. 劫持实现方式
- 替换原DLL文件
- 将黑DLL放置在优先加载路径
- DLL转发技术
三、DLL搜索顺序机制
1. 系统检查顺序
- 检查内存中是否已加载同名DLL
- 检查是否在KnownDLLs列表中
- 检查依赖项
2. Windows XP SP2前搜索顺序
- 应用程序所在目录
- 当前目录
- 系统目录
- 16位系统目录
- Windows目录
- PATH环境变量目录
3. Windows XP SP2后(SafeDllSearchMode启用)
- 应用程序目录
- 系统目录(%windir%\system32)
- 16位系统目录(%windir%\system)
- Windows目录(%windir%)
- 当前目录
- PATH环境变量目录
4. Windows 7及以后
- 使用KnowDLLs列表机制
- 注册表位置:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs
四、DLL劫持挖掘技术
1. 工具准备
- Procmon(进程监视器):观察DLL调用情况
- Dumpbin:查看DLL导出函数
- CFF Explorer:查看DLL架构(x86/x64)
2. 挖掘步骤
-
使用Procmon监控目标程序
- 设置Filter:Process Name为目标程序
- 观察Path路径下的文件调用
- 筛选.dll后缀文件
-
分析DLL调用
- 排除系统DLL(可能导致系统崩溃)
- 关注程序目录下的DLL
- 检查LoadLibrary调用堆栈
-
分析目标DLL
- 使用dumpbin /EXPORTS查看导出函数
- 识别真正的导出函数(排除乱码部分)
五、手动制作恶意DLL
1. 开发环境
- Visual Studio 2022
- 选择正确的架构(x86/x64)
- 运行库设置为MT
2. 实现步骤
- 创建动态链接库项目
- 在dllmain.cpp中添加代码
- 导出所有原DLL函数
- 通过弹窗测试调用顺序
- 在最先调用的函数中插入恶意代码
3. 注意事项
- 架构必须与原DLL一致
- 可隐藏DOS窗口
- 可插入shellcode实现上线
六、工具辅助制作DLL
1. 使用AheadLib工具
- 自动生成cpp文件
- 修改内容实现DLL转发
2. 实现步骤
- 将原DLL重命名为xxxORG.dll
- 使用工具生成同名恶意DLL
- 在DllMain入口函数添加恶意代码
- 实现函数转发到原DLL
3. 注意事项
- 工具生成可能触发死锁
- 手工劫持更稳定
- 权限维持场景可不关心主程序正常运行
七、防御建议
- 应用程序应指定DLL完整路径
- 使用DLL重定向或清单控制加载位置
- 检查KnownDLLs列表中的关键DLL
- 监控可疑的DLL加载行为
- 实施代码签名验证机制
八、总结
DLL劫持是一种有效的权限维持技术,通过理解Windows的DLL加载机制,结合工具分析和手工开发,可以实现稳定的"白+黑"攻击。防御方应从加载机制和监控两方面进行防护。