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主要关注点:
- 任何非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的代码段
- 直接执行
代码实现
// 基于自定义堆栈调用的代码修改
// 省略了NtAllocateVirtualMemory,避免了RWX私有内存的高危特征
// 结合间接系统调用和自定义堆栈效果更佳
DLL Hollowing技术
优点
- 稳定性与隐蔽性更强
- 不会破坏目标进程已依赖的DLL,不易导致崩溃
- IOC主要在于模块注册/内存属性,可以修复
缺点
- 导入表未解析
NtProtectVirtualMemory调用- COW机制
基本原理
与Module Stomping直接修改现有模块不同,DLL Hollowing步骤:
- 找一个未加载的合法DLL(系统目录下的任意.dll),大小足够容纳Payload
- 用
CreateFile(或syscallNtCreateFile)打开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已被禁用
简单示例代码
// Phantom Hollowing实现代码示例
总结
对抗EDR不是单一技术的胜利,而是持续攻防博弈。攻击者不断寻找新的"合法执行"方式,EDR也在逐渐增强内存完整性检测。没有绝对隐蔽的技术,只有更高级的对抗演进。
关键点总结:
- 理解内存类型(MEM_IMAGE/MEM_MAPPED/MEM_PRIVATE)的区别
- 掌握各种Hollowing技术的优缺点及适用场景
- 结合间接系统调用和自定义堆栈可增强隐蔽性
- 关注新技术如Phantom Hollowing的创新思路
- 认识到对抗是持续过程,需要不断演进技术