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. 系统检查顺序

  1. 检查内存中是否已加载同名DLL
  2. 检查是否在KnownDLLs列表中
  3. 检查依赖项

2. Windows XP SP2前搜索顺序

  1. 应用程序所在目录
  2. 当前目录
  3. 系统目录
  4. 16位系统目录
  5. Windows目录
  6. PATH环境变量目录

3. Windows XP SP2后(SafeDllSearchMode启用)

  1. 应用程序目录
  2. 系统目录(%windir%\system32)
  3. 16位系统目录(%windir%\system)
  4. Windows目录(%windir%)
  5. 当前目录
  6. 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. 挖掘步骤

  1. 使用Procmon监控目标程序

    • 设置Filter:Process Name为目标程序
    • 观察Path路径下的文件调用
    • 筛选.dll后缀文件
  2. 分析DLL调用

    • 排除系统DLL(可能导致系统崩溃)
    • 关注程序目录下的DLL
    • 检查LoadLibrary调用堆栈
  3. 分析目标DLL

    • 使用dumpbin /EXPORTS查看导出函数
    • 识别真正的导出函数(排除乱码部分)

五、手动制作恶意DLL

1. 开发环境

  • Visual Studio 2022
  • 选择正确的架构(x86/x64)
  • 运行库设置为MT

2. 实现步骤

  1. 创建动态链接库项目
  2. 在dllmain.cpp中添加代码
  3. 导出所有原DLL函数
  4. 通过弹窗测试调用顺序
  5. 在最先调用的函数中插入恶意代码

3. 注意事项

  • 架构必须与原DLL一致
  • 可隐藏DOS窗口
  • 可插入shellcode实现上线

六、工具辅助制作DLL

1. 使用AheadLib工具

  • 自动生成cpp文件
  • 修改内容实现DLL转发

2. 实现步骤

  1. 将原DLL重命名为xxxORG.dll
  2. 使用工具生成同名恶意DLL
  3. 在DllMain入口函数添加恶意代码
  4. 实现函数转发到原DLL

3. 注意事项

  • 工具生成可能触发死锁
  • 手工劫持更稳定
  • 权限维持场景可不关心主程序正常运行

七、防御建议

  1. 应用程序应指定DLL完整路径
  2. 使用DLL重定向或清单控制加载位置
  3. 检查KnownDLLs列表中的关键DLL
  4. 监控可疑的DLL加载行为
  5. 实施代码签名验证机制

八、总结

DLL劫持是一种有效的权限维持技术,通过理解Windows的DLL加载机制,结合工具分析和手工开发,可以实现稳定的"白+黑"攻击。防御方应从加载机制和监控两方面进行防护。

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加载机制,结合工具分析和手工开发,可以实现稳定的"白+黑"攻击。防御方应从加载机制和监控两方面进行防护。