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 攻击流程

  1. 查找未被加载的DLL(通常在system32目录下寻找)
  2. 将DLL文件加载到目标程序中
  3. 将内存权限设为PAGE_READWRITE
  4. 注入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 线程上下文劫持

  1. 创建处于挂起状态的线程
  2. 覆盖线程上下文
  3. 修改RIP寄存器值
  4. 强制线程直接执行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. 其他相关技术分析

  1. 本地线程劫持

    • 利用合法进程线程上下文执行代码
    • 绕过基于进程创建的检测
  2. 自定义Havoc C2配置

    • 使用非标准通信模式(自定义证书、协议混淆)
    • 降低网络特征匹配概率
  3. 文件膨胀绕过沙箱

    • 增加文件体积至沙箱分析阈值以上
    • 延迟或跳过动态分析
  4. AES解密实现建议

    • 避免使用Windows API(CryptDecrypt)
    • 推荐自定义或静态链接加密库(如mbedTLS)
    • 前后添加其他编码或脏数据
  5. ntdll钩子检测与恢复

    • 针对Sophos等EDR的钩子机制有效
    • Cortex主要依赖内存与行为分析
    • 可配合直接系统调用绕过

6. 参考资源

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工作流程 2.3 CFG触发特征 程序崩溃错误代码:c0000409(CFG标准异常代码) 触发指令:int 29h(Windows快速失败指令) 调用链: 2.4 CFG启用与检测 使用Visual Studio启用CFG保护 使用dumpbin命令行工具检查程序是否启用CFG 通过注册表禁用CFG: 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主要依赖内存与行为分析 可配合直接系统调用绕过 6. 参考资源 Microsoft CFG官方文档 DLL Hollowing深度解析