第 41 章 EDR / AV 规避对抗(逆向视角)
前向视角:EDR 是"防御方的逆向产物"(逆向你的进程找恶意行为);本章站在红队视角理解 EDR 原理,从而知道怎么被检测、怎么绕过。先逆向防御方实现 → 再针对性绕过(MITRE ATT&CK T1562 防御规避)。
📍 知识点地图 | 主题:EDR对抗 | 前置:第44章 | 后续:— | 核心概念:Hook原理、直接syscall、ETW、免杀
41.1 EDR 检测原理全景(先懂敌人)
EDR 从哪些维度"看见"你的行为:
┌─ 静态检测: 文件哈希/特征码(YARA)→ 免杀=改特征
├─ 行为检测: API 调用序列/进程行为模式
├─ Hook 检测: 用户态 Hook 敏感 API(ntdll 层)
├─ 内核回调: 进程/线程/注册表/文件回调
├─ 遥测: ETW(事件跟踪)→ 云分析
├─ 内存扫描: 检测注入的 shellcode/标志性字节
└─ 信誉: 证书/加载器/代码签名/家族指纹
41.2 EDR 的核心机制:Hook 与回调(知识重点)
用户态 Hook(最常见)
原理: EDR 在 ntdll.dll 的函数入口写入跳转(hook)→ 转到 EDR 自己的检测代码
典型 Hook 目标:
NtAllocateVirtualMemory / NtProtectVirtualMemory(分配 RWX → 注入信号)
NtWriteVirtualMemory(跨进程写入 → 注入)
NtCreateThreadEx(远程线程 → 注入)
NtCreateProcess / NtCreateUserProcess(进程创建)
NtReadVirtualMemory / NtOpenProcess(读取敏感进程)
检测逻辑: 参数检查 + 调用栈分析(谁在调)+ 信誉决策
内核回调(更难绕)
原理: 注册内核回调(PsSetCreateProcessNotifyRoutine 等)→ 内核层面观测
能力: 进程/线程创建、映像加载、注册表操作、文件操作
绕过难度: 用户态方法无效 → 需要内核对抗(第 27 章)或间接系统调用
ETW(遥测管道)
原理: 内核/用户态事件写入 ETW 通道 → EDR 订阅分析
覆盖: 进程/线程/映像/网络/文件事件
绕过: 修改 ETW provider 的 enable mask / Patch 掉 ETW 写入函数
41.3 检测维度 → 绕过技术对照表
| EDR 检测 | 绕过技术 | 原理 |
|---|---|---|
| 用户态 Hook | 直接系统调用(SysWhispers/Hell's Gate) | 跳过 ntdll 被 hook 的代码,直接 syscall |
| 用户态 Hook | Unhook ntdll | 从磁盘/已知副本恢复原始 ntdll 字节 |
| 用户态 Hook | 间接系统调用 | 用合法 ntdll 序列间接发起 syscall |
| API 调用模式 | 混淆/拆分调用(API 碎片化) | 破坏行为特征序列 |
| 内存扫描 | 加密 shellcode(运行时才解密) | 磁盘/休眠内存不可扫 |
| 调用栈分析 | 调用栈欺骗(Call Stack Spoofing) | 伪造栈回溯(返回地址链) |
| 行为检测 | 睡一段时间再行动(Sleep) | 避开行为关联窗口 |
| 内存扫描(休眠) | Sleep 时加密内存(Ekko/Zilean) | 休眠态内存不可扫 |
| 静态特征 | 编译配置/变形(变体) | 新哈希/新特征 |
| ETW | Patch ETW 写入 | 让事件无法被记录 |
| AMSI(PowerShell) | Patch AmsiScanBuffer | 让脚本扫描失效 |
41.4 直接系统调用(最核心的绕过,必须懂原理)
为什么有效
正常流程: 你的代码 → ntdll!NtXxx → syscall 指令 → 内核
EDR hook: 你的代码 → ntdll!NtXxx(hooked!) → EDR 检测 → syscall → 内核
绕过: 你的代码 → 直接 syscall(不经过 ntdll 被 hook 的函数体)
实现方式
// SysWhispers3: 自动生成 syscall 调用
// 原理: 从 ntdll 提取 syscall number → 自己执行 syscall 指令
// Hell's Gate / Halo's Gate: 运行时解析 syscall number
// 适用: 动态获取(EDR 无法静态分析出目标)
// 间接 syscall: 借用合法 ntdll 里的 syscall 指令(绕过 syscall 检测)
注意:直接 syscall 也有检测
对抗升级: EDR 检测"直接 syscall"(调用栈没有 ntdll 帧)
对策: 间接系统调用(通过合法 ntdll 序列)→ 栈看起来正常
41.5 逆向 EDR 的方法论(红队视角)
1. 定位 hook: 对比内存中 ntdll 与磁盘副本(pe-sieve / 自写比对)
→ 哪些函数被 hook、hook 跳转到哪
2. 逆向 EDR 检测逻辑: 反编译 EDR 的检测函数(什么条件触发告警)
3. 设计绕过: 依据检测逻辑针对性设计(参数/时序/栈帧)
4. 验证: 在装了 EDR 的测试环境跑一遍(不触发告警 = 通过)
工具:
pe-sieve: 扫描进程中的 hook/注入(检测视角)
API Monitor: 观察 API 调用与参数(逆向 EDR 视角)
x64dbg/IDA: 分析 EDR 驱动/进程
41.6 投递链视角(攻击链中的位置)
投递(钓鱼/供应链)
→ 执行(加载器 Loader): 这里对抗最激烈
├─ 免杀(静态)
├─ 绕 EDR(动态 hook/内存扫描)
└─ 持久化(注册表/服务)
→ 横向/提权
→ 痕迹清理
Loader 是核心: 它负责把 shellcode/恶意逻辑加载进内存并执行
Loader 对抗手段: 加密载荷 + 直接 syscall + 内存加密 + 栈欺骗 + 睡眠加密
41.7 防御侧呼应(蓝队视角,了解检测才懂绕过)
防御检测同一行为的信号:
□ 异常 syscall 频率/来源(直接 syscall 特征)
□ 模块加载异常(未映射内存中的代码)
□ 内存区域 RWX(分配+执行)
□ 调用栈异常(返回地址不在合法模块)
□ 定时行为(Sleep 模式:进程空闲但内存有活动)
□ ETW 缺口(遥测突然中断 = 告警信号)
41.8 伦理与边界
本章技术用于: 授权的红队演练、恶意软件分析(理解对抗)、防御测试
实际环境: 未授权的绕过 = 违法。所有练习在自建隔离环境
动手练习
- 用 pe-sieve 扫描一个安装 EDR/杀软的测试机进程,列出被 hook 的函数。
- 用 SysWhispers3 生成一个直接 syscall 的调用,对比它与正常 API 调用的调用栈差异。
- 在测试环境用 Process Monitor 观察: 一个"加密载荷+延时解密"程序被什么维度检测/不检测。
- 逆向分析一个公开 loader 样本(GitHub 有源码版对照),画出它的完整对抗技术栈。
深入阅读
- 仓库:
skills/edr-bypass-re/SKILL.md(EDR 绕过逆向方法论) - 仓库:
skills/edr-bypass-re/references/hook-survey.md(EDR hook 表调查) - 仓库:
skills/edr-bypass-re/references/unhook-techniques.md(直接/间接 syscall、Hell's Gate) - 仓库:
skills/edr-bypass-re/references/telemetry-blinding.md(ETW/AMSI patch) - 仓库:
skills/attack-chain/references/evasion-cheatsheet.md(实战免杀速查) - 仓库:
skills/reverse-engineering/anti-analysis.md(防御侧反分析)