内存免杀技术分析:原理、方法与实战应用
作者:Factor

内存免杀(Memory Evasion)是红队攻击链中最核心的免杀环节之一,指的是攻击载荷在内存中执行时,能够有效绕过杀毒软件、EDR、行为建模引擎、内核态防护机制等检测系统的能力。
相较于静态免杀关注文件本体,动态免杀关注行为链条,内存免杀关注的是“攻击代码在内存中呈现出的形态是否隐蔽”。
本篇将围绕内存检测机制、免杀特征、绕过策略与实战方法展开,构建完整的内存免杀认知图谱,适用于反射注入、shellcode加载、模块手动映射、C2 beacon上线等多种高强度攻击场景。
一、内存检测机制综述
现代安全系统对内存的检测覆盖逐年增强,其目标在于:发现并中止一切“非磁盘来源、无签名、可执行”的恶意内存区域。
🔍 常见内存检测引擎与特征:
检测方式 | 检测重点特征 |
---|---|
RWX页面扫描 | 存在 Read+Write+Execute 页属性 |
shellcode签名识别 | 存在特定前缀如 0xFC 0xE8 ,或指令密集如 PUSH/RET |
反射DLL识别 | 无磁盘映射、PE结构头部异常、缺失导入表、地址错位 |
NTDLL Hook检测 | 通过页面字节比对发现 inline hook、IAT修改 |
内存模块遍历 | 查看是否存在未通过正常模块加载器加载的模块 |
Unbacked Pages | 无关联PE文件的内存页 |
ETW/AMSI联合检测 | 脚本载荷、Shellcode传播链的行为+内容联合识别 |
内存快照比对 | 定期快照并对比内存模块变化差异,检测注入与映射 |
Page Guard 跟踪 | 监视异常页访问,如执行权限变化、跨区域跳转 |
二、内存免杀核心原理与技术目标
内存免杀核心目标:
- 不暴露原始 shellcode 明文结构
- 不长时间驻留 RWX 可疑页
- 不产生可溯源行为(如写完即执行、可疑线程创建)
- 不被挂钩检测发现(恢复、替代或绕过系统调用)
- 伪装自身为合法模块/数据段
- 支持动态通信并随时切换上下文
- 与宿主系统行为融合,降低异常程度
三、内存免杀关键技术方法详解(扩展)
6. 页面复制遮掩(Memory Shadowing)
- 将加载完成的 shellcode 区段复制到另一非典型内存区域(如堆、TLS段)
- 原区域清除或释放,执行点转移至复制页
- 结合内存对抗技术可构造“镜像欺骗”效果
7. 手动LDR模块构造(Fake Loader)
- 模拟 LdrLoadDll 加载模块结构,伪造 LDR_DATA_TABLE_ENTRY
- 使用结构嵌套创建可被系统认定为合法映射模块
- EDR 遍历模块时将其视为已加载,避免误判
8. 异常机制注入执行(SEH / VEH)
- 注册异常处理器(如
SetUnhandledExceptionFilter
、VEH)为执行入口 - 制造故障跳转,触发加载的 shellcode 逻辑执行
- 可规避常规行为检测模型,避开 API 调用链回溯
9. 执行环境脱钩(Context-Free Execution)
- 利用 APC、Fiber、回调函数解耦行为链与当前主线程
- shellcode 由远程线程、隐藏线程或匿名执行环境拉起
- 降低行为回溯可能性,提高生存能力
10. 使用 RW 页替代 RX 页面
- 分配为 RW,但使用页异常触发时动态设为 RX 再恢复
- 阻止扫描器通过权限过滤器发现可执行页
四、高级免杀技术组合策略(扩展)
场景 | 高级组合策略 |
---|---|
AV/EDR双重扫描环境 | Shellcode AES 加密 + RW页面动态转为RX + SysWhispers注入 + 多线程行为解耦 |
长驻内存 Beacon管理器 | 多段拼接 + 内存页shadow + TLS段隐藏执行器 + PageGuard反扫描策略 |
无落地 HTA/DOC木马配合使用 | PowerShell loader + Base64嵌套shellcode + AMSI Patch + 异常触发入口 |
Dropper载荷内存化部署 | EXE Dropper 含加密 shellcode + 执行时加载 + 自解压加载 + 无日志输出模式 |
五、面向 Linux/macOS 的内存免杀策略(简述)
🐧 Linux 平台:
- 使用
mmap
分配匿名 RW 区域,shellcode 加密后写入 - 构造动态段 ELF Loader,伪装合法用户进程或 daemon
- 使用
ptrace
,LD_PRELOAD
,/proc/self/mem
进行反射注入
🍎 macOS 平台:
- 利用 Objective-C runtime 实现内存对象动态加载与解密
- 使用 Mach-O 文件结构欺骗工具链与检测器
- 利用
NSInvocation
,dlopen
延迟加载动态模块
六、自动化免杀框架与开发建议
框架设计思路:
- 加密器:支持多层嵌套 AES/RC4/XOR 编码
- Loader 工具:支持生成多语言调用器(C++, Nim, Go)
- 权限/调用链控制器:自动生成错位线程与行为链拆分脚本
- 配置文件模板:动态生成通信参数、延迟、入口方式等
🛠 推荐开源项目:
- ShellcodeLoader:适配各类加载场景,代码干净、模板丰富
- Scarecrow:高级 C2 Loader 自动免杀封装框架
- Donut + NimlineWhispers:组合生产反射 shellcode + syscall加载器
七、结语(增强)
内存免杀代表了攻防技术的集大成者,它将加密算法、内核原理、操作系统行为、线程模型、模块结构、执行逻辑伪装融为一体,形成真正意义上的多维立体隐匿技术。
这是对现代EDR架构的深度挑战,也是对安全工程师知识体系的极限拷问。
未来,随着硬件安全模块、行为追踪引擎和 AI 模型加速部署,内存免杀将成为持久控制、无文件攻击与多态演化的必备核心技术之一。
“能被看见的攻击,才值得被防御;真正的免杀,从未暴露。”
愿每一位隐匿于内存深处的研究者,都能以极致之术,行无痕之道。