水洞+1,功德+N

admin 2026-03-27 13:15:41 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文系统地介绍了DLL劫持技术,这是一种利用Windows系统DLL默认搜索机制的攻击方式。文章详细解释了其工作原理、攻击流程、成功前提,并通过一个具体案例演示了如何利用该技术在不影响程序正常运行的情况下弹出计算器。最后,总结了相应的防御建议,如使用绝对路径加载DLL和进行数字签名校验等。 综合评分: 85 文章分类: 二进制安全,WEB安全,恶意软件,安全开发,渗透测试


cover_image

水洞+1,功德+N

原创

liudehong liudehong

十月的进阶之路

2026年3月21日 21:21 重庆

1. 基础知识

1.1 什么是 DLL 劫持

DLL 劫持是利用 Windows 系统 DLL 默认搜索机制的特性,将恶意 DLL 伪装成程序需要加载的合法 DLL,诱导程序启动时错误加载并执行恶意代码的攻击技术。

攻击原理:利用 Windows DLL 搜索顺序缺陷,诱导程序加载恶意 DLL 而非正版 DLL。

1.2 攻击流程

  1. 程序启动时:按固定搜索路径查找依赖的 DLL
  2. 攻击者操作:将同名恶意 DLL 放置到优先级更高的目录
  3. 程序行为:优先加载恶意 DLL 而非正版 DLL

1.3 Windows DLL 默认搜索路径(优先级从高到低)

| 优先级 | 路径类型 | 描述 | | — | — | — | | 1 | 进程所在的可执行目录 | EXE 文件所在目录,优先级最高 | | 2 | 系统目录(System32/SysWOW64) | 系统核心 DLL 存放目录 • 32 位 Windows:C:\Windows\System32 • 64 位 Windows:C:\Windows\System32(64 位 DLL) • 64 位系统运行 32 位程序:C:\Windows\SysWOW64(32 位 DLL) | | 3 | 16 位系统目录 | 兼容旧版 16 位程序的目录 C:\Windows\System(极少使用) | | 4 | Windows 目录 | C:\Windows 存放系统基础组件和通用 DLL | | 5 | 当前工作目录 | 进程运行时的”当前操作目录” 不等于程序(EXE)所在目录,是操作系统分配的”默认文件夹” 程序如果不指定完整路径,读写文件/加载 DLL 时会优先查找此目录 | | 6 | 环境变量 PATH 指定的目录 | 优先级最低,包含系统预设和用户自定义的路径 |

1.4 劫持的核心操作

1.4.1 伪装恶意 DLL

  • 分析目标进程依赖的合法 DLL 名称
  • 将恶意 DLL 的文件名修改为合法名称
  • 确保文件名完全一致(包括大小写)

1.4.2 放置到高优先级路径

  • 将伪装后的恶意 DLL 复制到目标程序的”可执行文件所在目录”
  • 利用优先级最高的搜索路径实现劫持

1.5 劫持的前提条件

  1. 目标程序存在 DLL 依赖
  • 程序必须明确调用某个外部 DLL(静态依赖或动态依赖)
  • 才会触发 DLL 搜索流程
  1. 未使用绝对路径加载
  • 程序加载 DLL 时只使用文件名,不使用完整路径
  • 才会触发系统按搜索路径查找
  1. 未进行签名校验
  • 程序未对 DLL 进行数字签名校验
  • 无法识别 DLL 是否为官方正版,从而加载恶意 DLL
  1. 权限可访问目标目录
  • 具备向目标程序所在目录的写入权限

2. 案例

2.1 目标与准备

目标:保障程序正常运行的同时能够弹出计算器。

准备工作:

  1. 在程序目录下选择一个 DLL 尝试进行修改
  2. 检验该 DLL 是否存在完整性校验
  3. 建议选择程序自带的 DLL,而不是系统自带的 DLL
  4. 本案例选择 ffmpeg.dll

程序目录结构

2.2 识别可利用的 DLL

工具:使用 ZeroEye 在目标文件夹下挖掘可利用的 DLL 文件

  • 带 + 号表示存在签名校验
  • 不带 + 号表示可利用

ZeroEye 工具界面

2.3 分析目标 DLL

工具:使用 IDA Pro 进行二进制分析

操作步骤:

  1. 用 IDA Pro 打开目标 DLL
  2. 选择视图 → 打开子视图 → 十六进制转储
  3. 查看二进制文件的原始十六进制字节数据和对应 ASCII 字符
  4. 点击编辑 → 修补程序 → 更改字节
  5. 完成修改后,再次点击编辑 → 修补程序 → 应用补丁到输入函数

IDA Pro 分析界面

2.4 验证完整性校验

验证方法:

  1. 替换原来的 DLL
  2. 运行 EXE 程序查看是否成功
  3. 替换后成功运行说明没有完整性校验
  4. 此时可以进行 DLL 劫持

验证完整性校验

2.5 反编译目标 DLL

工具:使用 AheadLib 对 ffmpeg.dll 进行反编译

输出:得到源代码文件

AheadLib 反编译界面

2.6 创建 Visual Studio 项目

步骤:

  1. 打开 Visual Studio
  2. 使用动态链接库模板创建一个新项目

创建 VS 项目

2.7 配置项目文件

操作:

  1. 新项目在源文件中会生成 dllmain.cpp 文件
  2. 将之前生成的 ffmpeg.cpp 内容复制到 dllmain.cpp 中

复制源代码

2.8 添加汇编文件

步骤:

  1. 将工具生成的 ffmpeg_jump.asm 文件复制到 VS 项目目录
  2. 在解决方案管理器中右键点击”源文件”
  3. 选择”添加” → “现有项”
  4. 选择 ffmpeg_jump.asm 文件添加

添加汇编文件

2.9 配置汇编文件属性

操作:

  1. 添加完现有项后,根据 ffmpeg_jump.asm 内容进行配置
  2. 选择此文件,右键点击”属性”进行配置

配置汇编文件属性

2.10 设置自定义生成工具

步骤:

  1. 选择应用后,在配置属性中会出现”自定义生成工具”
  2. 将 ffmpeg_jump.asm 的内容填入相应位置

2.11 修改源代码

配置完成后,回到 dllmain.cpp 中修改代码:

  1. 取消第一个红框代码的注释
  2. 注释掉第二个红框代码
  3. 第三个红框处修改为原始 DLL 修改后的名字

代码修改示意图

2.12 关键代码解释// 让程序优先加载该目录下的恶意文件,动态获取程序当前目录(关键) GetModuleFileName(NULL, tzPath, MAX_PATH); PathRemoveFileSpec(tzPath);

作用:动态获取程序当前目录,确保恶意 DLL 被优先加载。

关键代码位置

2.13 修改宿主进程名

同时修改下面的宿主进程名配置:

修改宿主进程名

2.14  成功替换

剩余代码可以借助 AI 辅助完成。

完成后的操作:

  1. 将恶意文件伪装成正常 DLL 的同名文件
  2. 对原始正常 DLL 完成重命名
  3. 借助 DLL 转发机制,在触发计算器弹窗的同时,保障程序原有功能不受影响、正常运行

最终效果展示

2.15 验证结果

验证成功条件:

  1. 程序能正常运行
  2. 计算器成功弹出
  3. 可以正常输入账号
  4. 在进程中也能查看到相关进程

验证结果


3. 总结

DLL 劫持是一种利用 Windows 系统特性的攻击技术,通过伪装恶意 DLL 并放置在高优先级搜索路径中,诱导程序加载并执行恶意代码。成功实施需要满足多个前提条件,包括目标程序存在 DLL 依赖、未使用绝对路径加载、未进行签名校验,以及攻击者具备目录写入权限。

在防御方面,建议:

  • 程序加载 DLL 时使用绝对路径
  • 对加载的 DLL 进行数字签名校验
  • 设置合适的文件权限,防止未授权写入
  • 使用安全软件检测异常行为

免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。

本文转载自:十月的进阶之路 liudehong liudehong《水洞+1,功德+N》

水洞+1,功德+N 网络安全文章

水洞+1,功德+N

文章总结: 本文系统地介绍了DLL劫持技术,这是一种利用Windows系统DLL默认搜索机制的攻击方式。文章详细解释了其工作原理、攻击流程、成功前提,并通过一个
评论:0   参与:  0