EDR对抗之内存合法性检查规避
字数 1981 2025-08-22 12:23:06

EDR对抗之内存合法性检查规避技术详解

概述

随着EDR(终端检测与响应)技术的普及和能力提升,传统的内存注入与执行手法逐渐变得不再安全。特别是在内存合法性检查技术日益成熟的背景下,攻击者将payload注入到MEM_PRIVATE或MEM_MAPPED类型的内存区域并赋予执行权限(RX),几乎都会成为明显的IOC(入侵指标)。

实验环境

  • Visual Studio 2022
  • Windows 11

内存合法性检查的核心思路

Windows系统中每个内存区域都有一个Type字段,可通过MEMORY_BASIC_INFORMATION获取:

  • MEM_IMAGE:从磁盘加载的PE文件,属于合法的可执行代码区域
  • MEM_MAPPED:文件映射区域,一般用于共享内存
  • MEM_PRIVATE:通过NtAllocateVirtualMemory等API分配的私有内存

正常情况下:

  • 程序代码段总是在MEM_IMAGE中
  • 动态生成的数据一般在MEM_PRIVATE或MEM_MAPPED中,且不会有执行权限

EDR主要关注点:

  1. 任何非MEM_IMAGE页带有执行权限(RX)
  2. MEM_IMAGE页的权限被修改(如NtProtectVirtualMemory调整RW->RX)
  3. 由于写时复制(COW)机制导致代码段生成了MEM_PRIVATE页

Module Stomping技术

优点

  • payload位于MEM_IMAGE内存区域,绕过了最明显的MEM_PRIVATE+RX监测点
  • 不需要VirtualAlloc分配空间

缺点

  • 修改了合法DLL的代码段,导致内存与磁盘文件不一致,高级EDR会对比校验和
  • 修改内存权限(RW->RX)可能会被捕获

基本原理

Module Stomping是最早的规避尝试之一,思路简单:

  1. 加载一个DLL(最好不是常用DLL)
  2. 将payload覆盖写入该DLL的代码段
  3. 直接执行

代码实现

// 基于自定义堆栈调用的代码修改
// 省略了NtAllocateVirtualMemory,避免了RWX私有内存的高危特征
// 结合间接系统调用和自定义堆栈效果更佳

DLL Hollowing技术

优点

  • 稳定性与隐蔽性更强
  • 不会破坏目标进程已依赖的DLL,不易导致崩溃
  • IOC主要在于模块注册/内存属性,可以修复

缺点

  • 导入表未解析
  • NtProtectVirtualMemory调用
  • COW机制

基本原理

与Module Stomping直接修改现有模块不同,DLL Hollowing步骤:

  1. 找一个未加载的合法DLL(系统目录下的任意.dll),大小足够容纳Payload
  2. CreateFile(或syscall NtCreateFile)打开DLL
  3. NtCreateSection创建SEC_IMAGE类型的Section
  4. NtMapViewOfSection把DLL映射到进程地址空间
  5. NtProtectVirtualMemory改为RW,写入payload,再改回RX
  6. NtCreateThreadEx启动线程,执行Payload

由于DLL是通过SEC_IMAGE映射的,其内存页类型为MEM_IMAGE,因此绕过了最明显的内存检查。

注入示例

// 注入自身代码示例
// 远程注入代码示例
// 以上代码均做了简化处理

Phantom Hollowing技术

核心实现

Phantom Hollowing的核心思路是:不在内存中修改DLL,而是在磁盘上预先修改DLL文件的.text段,再将其映射入内存。

具体步骤:

  1. 使用TxF(事务性NTFS)创建事务性文件句柄
  2. 在事务中修改DLL的.text段,将payload写入磁盘DLL
  3. 使用NtCreateSection(SEC_IMAGE)将DLL映射到内存,此时payload已存在于.text段,无需修改内存也就不会触发COW
  4. 回滚TxF事务,磁盘DLL恢复原样,痕迹消除

优点

  • 避免了NtProtectVirtualMemory的可疑调用
  • 避免COW机制生成的MEM_PRIVATE页

缺点

  1. 权限问题:大部分系统DLL在System32,需要高权限
  2. 路径异常:如果拷贝到用户可写目录(如Temp),路径差距可能被检测
  3. 版本不一致:内存中的DLL与磁盘的DLL校验不一致
  4. TxF限制:在开启CIG(代码完整性防护)的进程中,TxF已被禁用

简单示例代码

// Phantom Hollowing实现代码示例

总结

对抗EDR不是单一技术的胜利,而是持续攻防博弈。攻击者不断寻找新的"合法执行"方式,EDR也在逐渐增强内存完整性检测。没有绝对隐蔽的技术,只有更高级的对抗演进。

关键点总结:

  1. 理解内存类型(MEM_IMAGE/MEM_MAPPED/MEM_PRIVATE)的区别
  2. 掌握各种Hollowing技术的优缺点及适用场景
  3. 结合间接系统调用和自定义堆栈可增强隐蔽性
  4. 关注新技术如Phantom Hollowing的创新思路
  5. 认识到对抗是持续过程,需要不断演进技术
EDR对抗之内存合法性检查规避技术详解 概述 随着EDR(终端检测与响应)技术的普及和能力提升,传统的内存注入与执行手法逐渐变得不再安全。特别是在内存合法性检查技术日益成熟的背景下,攻击者将payload注入到MEM_ PRIVATE或MEM_ MAPPED类型的内存区域并赋予执行权限(RX),几乎都会成为明显的IOC(入侵指标)。 实验环境 Visual Studio 2022 Windows 11 内存合法性检查的核心思路 Windows系统中每个内存区域都有一个Type字段,可通过 MEMORY_BASIC_INFORMATION 获取: MEM_ IMAGE :从磁盘加载的PE文件,属于合法的可执行代码区域 MEM_ MAPPED :文件映射区域,一般用于共享内存 MEM_ PRIVATE :通过 NtAllocateVirtualMemory 等API分配的私有内存 正常情况下: 程序代码段总是在MEM_ IMAGE中 动态生成的数据一般在MEM_ PRIVATE或MEM_ MAPPED中,且不会有执行权限 EDR主要关注点: 任何非MEM_ IMAGE页带有执行权限(RX) MEM_ IMAGE页的权限被修改(如 NtProtectVirtualMemory 调整RW->RX) 由于写时复制(COW)机制导致代码段生成了MEM_ PRIVATE页 Module Stomping技术 优点 payload位于MEM_ IMAGE内存区域,绕过了最明显的MEM_ PRIVATE+RX监测点 不需要 VirtualAlloc 分配空间 缺点 修改了合法DLL的代码段,导致内存与磁盘文件不一致,高级EDR会对比校验和 修改内存权限(RW->RX)可能会被捕获 基本原理 Module Stomping是最早的规避尝试之一,思路简单: 加载一个DLL(最好不是常用DLL) 将payload覆盖写入该DLL的代码段 直接执行 代码实现 DLL Hollowing技术 优点 稳定性与隐蔽性更强 不会破坏目标进程已依赖的DLL,不易导致崩溃 IOC主要在于模块注册/内存属性,可以修复 缺点 导入表未解析 NtProtectVirtualMemory 调用 COW机制 基本原理 与Module Stomping直接修改现有模块不同,DLL Hollowing步骤: 找一个未加载的合法DLL(系统目录下的任意.dll),大小足够容纳Payload 用 CreateFile (或syscall NtCreateFile )打开DLL 用 NtCreateSection 创建 SEC_IMAGE 类型的Section 用 NtMapViewOfSection 把DLL映射到进程地址空间 用 NtProtectVirtualMemory 改为RW,写入payload,再改回RX 用 NtCreateThreadEx 启动线程,执行Payload 由于DLL是通过 SEC_IMAGE 映射的,其内存页类型为 MEM_IMAGE ,因此绕过了最明显的内存检查。 注入示例 Phantom Hollowing技术 核心实现 Phantom Hollowing的核心思路是:不在内存中修改DLL,而是在磁盘上预先修改DLL文件的.text段,再将其映射入内存。 具体步骤: 使用TxF(事务性NTFS)创建事务性文件句柄 在事务中修改DLL的.text段,将payload写入磁盘DLL 使用 NtCreateSection(SEC_IMAGE) 将DLL映射到内存,此时payload已存在于.text段,无需修改内存也就不会触发COW 回滚TxF事务,磁盘DLL恢复原样,痕迹消除 优点 避免了 NtProtectVirtualMemory 的可疑调用 避免COW机制生成的MEM_ PRIVATE页 缺点 权限问题:大部分系统DLL在System32,需要高权限 路径异常:如果拷贝到用户可写目录(如Temp),路径差距可能被检测 版本不一致:内存中的DLL与磁盘的DLL校验不一致 TxF限制:在开启CIG(代码完整性防护)的进程中,TxF已被禁用 简单示例代码 总结 对抗EDR不是单一技术的胜利,而是持续攻防博弈。攻击者不断寻找新的"合法执行"方式,EDR也在逐渐增强内存完整性检测。没有绝对隐蔽的技术,只有更高级的对抗演进。 关键点总结: 理解内存类型(MEM_ IMAGE/MEM_ MAPPED/MEM_ PRIVATE)的区别 掌握各种Hollowing技术的优缺点及适用场景 结合间接系统调用和自定义堆栈可增强隐蔽性 关注新技术如Phantom Hollowing的创新思路 认识到对抗是持续过程,需要不断演进技术