DLL Hollowing攻击与CFG保护机制解析
字数 1782 2025-09-23 19:27:46
DLL Hollowing攻击与CFG保护机制解析
1. DLL Hollowing攻击技术
1.1 基本概念
DLL Hollowing是一种高级内存注入技术,其核心思路是:
- 利用未被目标进程加载的DLL内存映射空间
- 通过NtMapViewOfSection获取DLL映射基址
- 将payload写入未被加载的DLL内存区域
1.2 技术本质
- "复用"合法DLL的内存属性标记为Image
- 与系统加载的正常DLL内存特征一致
- 规避传统内存注入检测风险(OpenProcess/VirtualAllocEx/WriteProcessMemory/CreateRemoteThread)
1.3 攻击流程
- 查找未被加载的DLL(通常在system32目录下寻找)
- 将DLL文件加载到目标程序中
- 将内存权限设为PAGE_READWRITE
- 注入shellcode
2. CFG保护机制
2.1 CFG基本原理
控制流保护(Control Flow Guard)是Windows针对间接调用的保护机制:
- 间接调用在编译时期目标地址不能确定
- 运行时验证目标地址是否合法
- 严格限制间接调用指令可执行的位置
2.2 CFG工作流程
间接调用 → CFG检查函数 → 验证目标地址 → 允许/拒绝执行
2.3 CFG触发特征
- 程序崩溃错误代码:c0000409(CFG标准异常代码)
- 触发指令:int 29h(Windows快速失败指令)
- 调用链:
KERNEL32!BaseThreadInitThunk → KERNEL32!_guard_dispatch_icall_fptr → ntdll!LdrControlFlowGuardEnforced
2.4 CFG启用与检测
- 使用Visual Studio启用CFG保护
- 使用dumpbin命令行工具检查程序是否启用CFG
- 通过注册表禁用CFG:
计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options 创建名为MitigationOptions的QWORD值
3. 绕过CFG的技术
3.1 线程上下文劫持
- 创建处于挂起状态的线程
- 覆盖线程上下文
- 修改RIP寄存器值
- 强制线程直接执行shellcode而不执行CFG检查
优势:
- 绕过所有CFG健全性检查
- 可从任意地址开始执行代码
- 可加载任意模块到远程进程
3.2 修补目标进程禁用CFG
- 直接修改目标进程内存中的CFG相关标志
- 需要深入了解进程内存结构
3.3 其他技术组合
- 使用LoadLibrary加载牺牲DLL
- 使用MSF生成的shellcode(如启动calc)
4. 相关技术对比:DLL Hollowing vs Module Stomping
| 比较维度 | DLL Hollowing | Module Stomping |
|---|---|---|
| 核心原理 | 利用未加载DLL的内存空间,通过NtCreateSection和NtMapViewOfSection等函数注入恶意代码 | 修改已加载模块(如user32.dll)的.text节或入口点,直接覆盖为shellcode |
| 模块来源 | 选择未加载到目标进程中的DLL文件 | 使用已加载到目标进程中的模块 |
| 修改方式 | 镜像注入方式写入.text节,保持文件完整 | 直接覆盖模块入口点或导出函数 |
| 隐蔽性 | 较强,模拟正常DLL加载过程 | 较弱,易被检测到入口变化 |
| 执行方式 | 映射执行,可能配合创建线程 | 通过CreateThread执行入口函数 |
| 检测难度 | 传统手段难检测,但EDR可监测异常行为 | 易被高级EDR检测内存与磁盘不一致 |
| 适用场景 | 长期驻留高隐蔽性需求 | 快速注入执行需求 |
| 实现复杂度 | 较高,涉及内存映射等底层操作 | 相对简单直接 |
5. 其他相关技术分析
-
本地线程劫持:
- 利用合法进程线程上下文执行代码
- 绕过基于进程创建的检测
-
自定义Havoc C2配置:
- 使用非标准通信模式(自定义证书、协议混淆)
- 降低网络特征匹配概率
-
文件膨胀绕过沙箱:
- 增加文件体积至沙箱分析阈值以上
- 延迟或跳过动态分析
-
AES解密实现建议:
- 避免使用Windows API(CryptDecrypt)
- 推荐自定义或静态链接加密库(如mbedTLS)
- 前后添加其他编码或脏数据
-
ntdll钩子检测与恢复:
- 针对Sophos等EDR的钩子机制有效
- Cortex主要依赖内存与行为分析
- 可配合直接系统调用绕过