7.31 杀软 / EDR / AMSI / ETW 防御架构
「7E 防御绕过基础」系列 Part 1,免费开放。 进入这一篇之前先立个规矩:本系列只讲防御架构、检测思路与加固方法,不提供任何可直接使用的免杀成品或绕过工具。 我们先花一整篇把现代 Windows 的防御栈完整地图画清楚——你只有先知道"自己的每个动作会在哪一层、被哪个组件看到",后面谈规避、谈检测才有意义。一上来就找"怎么过杀软"的人,往往连自己在跟谁对抗都没搞明白。
一、从"杀毒软件"到"检测响应":三代演进
很多人对防御的印象还停留在十年前:装一个杀毒软件,病毒库里存着一串病毒特征,文件落盘时拿去比对,命中就弹窗删除。这套机制真实存在过,而且至今仍是防御的一环,但它早就不是全部。我们先把防御的三代演进理一遍,你才知道现在面对的到底是什么。
第一代,特征码杀毒。 它的判定对象是"磁盘上的文件",判定依据是"这个文件(或其中某段字节)的指纹是否在病毒库里"。优点是快、准、误报低;致命盲区是它只能识别"已知"样本,而且要求恶意内容以文件形式落盘。攻击者把样本改几个字节(变种)、或者干脆不落地,特征码就失效了。
第二代,启发式加云查。 为了对付变种,引擎开始看"行为像不像"——比如一个程序刚启动就去改注册表自启、紧接着注入别的进程,这种组合本身就可疑,哪怕它不在病毒库。同时单台机器算不动的信誉判断交给云端:文件哈希、签名、流行度(这个文件在全世界多少台机器上出现过)实时回查。云查让"冷门 + 无签名 + 刚出现"的文件天然可疑。
第三代,EDR(端点检测与响应)。 它的思路彻底变了:不再纠结"这个文件是不是病毒",而是持续记录端点上发生的一切——谁创建了谁、加载了什么、跑了什么脚本、碰没碰 LSASS、连了哪个地址——再把这些事件串成行为链,用规则和模型识别攻击,最后交给分析师处置。理解这三代的差异,你就明白为什么"给 payload 加个花指令过静态查杀"在今天远远不够:你过的可能只是第一代,后面还有 AMSI、ETW 和一堆内核回调在看着。
二、现代防御栈的分层全景
把一台联网、开着 Defender 的 Windows 11 拆开看,防御是分层堆叠的:越靠上越贴近应用,越靠下越贴近内核。下面这张图是本系列的总纲,后面每一篇都在展开其中某一层。
读这张图有个诀窍:从上往下是"一次操作被看到的先后",从右往左是"策略对行为的约束"。 比如你在 PowerShell 里跑一段下载执行的命令,最先在脚本层撞上 AMSI;进程和网络动作接着在 API 层产生 ETW 事件;进程创建本身在内核层触发回调;而你这次能不能跑、跑起来有没有权限,又受静态/策略层的白名单和标记约束。一个动作,四层都可能留下记录。
三、四大支柱逐个认识
3.1 静态引擎:还是地基,但只是地基
文件实时扫描(Real-time protection)在文件被写入、读取或执行时介入,结合本地特征与云端信誉做判断。它对"已知样本、完整落盘"依然高效,所以攻击者要面对的第一件事仍是"我的文件会不会落地即杀"。但请记住它的边界:它看的是文件,对纯内存、解释执行、合法工具滥用这三类场景天然乏力——这些缺口由下面三个支柱补。
3.2 AMSI:专门盯脚本的传感器
AMSI(Antimalware Scan Interface)是 Windows 提供的一套标准接口,让 PowerShell、Office VBA、WMI、JScript 这类脚本宿主,能在脚本"内容已经解出、马上要交给解释器执行"的那一刻,把内容送给安装的反恶意软件引擎扫描。它最大的意义是:扫描的是解码后的明文,所以 Base64 编码、简单混淆在这一层会被还原后看到。AMSI 的内部结构和扫描时机是下一篇 7.32 的主题,这里先建立"脚本层有 AMSI"这一认知。
3.3 ETW:操作系统自带的事件总线
ETW(Event Tracing for Windows)是 Windows 内核里一套成熟的事件机制。系统里几乎每个关键组件——进程线程、网络栈、磁盘、DNS 客户端、.NET 运行时、甚至 AMSI 自己——都内置了"提供者(Provider)",在特定动作发生时发出结构化事件;防御产品作为"消费者(Consumer)"订阅这些事件。可以把它理解成操作系统出厂就布好的统一监控总线:EDR 大量的遥测并不需要自己从头 hook,直接订阅 ETW 就能拿到。对攻击者而言,麻烦在于 ETW 覆盖面极广且在系统深处,"完全不产生事件"几乎不可能。
3.4 EDR:把信号串成行为链的大脑
EDR 平台做三件事:采集(AMSI 结果、ETW 事件、自己的内核回调与用户态监控)、关联(把孤立事件按时间和因果拼成攻击链,比如"Office 子进程 → 拉起 PowerShell → 下载 → 注入")、响应(告警、隔离主机、封禁、回滚,配合分析师)。它的判定单位不是单个文件,而是行为序列。这解释了一个常见现象:你每一步单看都"合法",但连起来就触发了规则——因为 EDR 看的是整条链。
四、两个常被忽略的控制点
4.1 MOTW:文件的"出身证明"
从互联网下载的文件,浏览器会给它打上 MOTW(Mark of the Web),具体是在文件的 NTFS 备用数据流 Zone.Identifier 里记下"来自 Internet 区域"。带这个标记的可执行文件首次运行会走 SmartScreen 信誉检查,Office 文档会进入受保护视图,脚本的约束也更严。它不判断文件好坏,只标记来源——但来源本身就是极强的风险信号。值得注意的是,某些容器格式(历史上部分压缩包)不会把标记传递给解压出的文件,这也是攻击者偏爱"下载压缩包再解压"的原因之一,新版 Windows 已在持续修补这类传递缺口。
4.2 应用白名单:从"拦坏的"到"只放好的"
传统思路是黑名单——知道哪些是坏的就拦哪些,这必然永远慢一步。AppLocker 和 WDAC(Windows Defender Application Control)走相反思路:默认全拦,只放行明确信任的程序(按签名、哈希或路径)。配置得当的话,绝大多数来路不明的 payload 连执行的机会都没有。它的成本是前期要梳理清楚机器上哪些程序是合法的,因此在服务器等软件相对固定的场景最容易落地。
五、几个关键的事件来源(把抽象的 ETW 落到具体)
第三节约略讲了 ETW 是"事件总线",这里把防守方真正在订阅的几个高频事件来源列出来,你会对"系统到底能上报多细"有更具体的感受。
| 事件来源 | 关注的动作 | 对防守的意义 |
|---|---|---|
| 进程 / 线程相关内核事件 | 进程创建退出、线程建立、镜像(模块)装载 | 还原进程树,发现异常父子关系 |
| 网络相关内核事件 | 本机发起/接收的连接、端口绑定 | 发现异常外联、可疑监听端口 |
| DNS 客户端事件 | 本机发出的每一次域名解析 | 无文件下载、C2 域名常最先在这里露馅 |
| .NET 运行时事件 | 程序集加载、JIT 编译、运行时异常 | 识别内存加载的 .NET 工具 |
| AMSI 扫描事件 | 脚本送检内容与扫描结果 | 直接看到脚本层在尝试什么 |
| PowerShell 脚本日志 | 脚本块、命令执行(含编码命令还原) | 记录 PowerShell 里真实执行的内容 |
| 安全审计 | 登录登出、凭据校验、特权使用 | 关联身份与权限变更 |
读这张表要建立一个概念:这些事件来源绝大多数是操作系统"出厂自带"的,防守方不需要在机器上额外埋点,只要去订阅和集中收集即可。 对攻击者而言,这意味着"完全不产生事件"几乎做不到——你可以影响某一个来源,但很难同时让进程、网络、DNS、脚本、运行时这几路全部沉默。这也是为什么现代端点防护的性价比很高:它大量复用了系统已有的观测能力。
六、初学者最容易有的四个错觉
在进入后面的具体技术之前,先把几个常见错觉纠正掉,它们会直接影响你判断"自己有没有被发现"。
- 错觉一:"装了杀软就等于安全。" 传感器不是金钟罩,它有误报也有漏报,且会被针对性地规避;防守真正靠的是分层和纵深,而不是单一产品。
- 错觉二:"没看到弹窗,就说明没被发现。" EDR 的默认工作方式是静默采集,告警和判定发生在后台控制台,端点上未必有任何提示。你看不到动静,不代表防守方没看到。
- 错觉三:"把杀软关掉就一劳永逸。" 现代防护有防篡改,普通权限根本关不掉;即便在未加固环境被关闭,"关闭防护"这个动作本身就是高置信告警。
- 错觉四:"我自己写的程序没毒,就不会被杀。" 静态引擎看的是特征与信誉,而不是作者的主观意图。一个没有签名、全网罕见、刚出现、还带下载/注入行为的程序,天然就是高风险对象——和它"是不是你亲手写的"无关。
七、这是"传感器 vs 规避"的系统对抗
把上面所有内容收拢成一个认知:攻防在端点上的本质,是一方不断增加和串联传感器,另一方试图减少、延迟或混淆自己产生的信号。 没有哪个组件是不可绕开的,也没有哪种规避是一劳永逸的,这是一场持续的军备竞赛。
对学习阶段的你,正确的顺序是先理解"传感器布在哪、各自能看到什么、有什么盲区",再谈在授权红队中如何验证这些传感器的有效性,最后落到防守方怎么把传感器布得更密、把控制点前移。直接跳到"绕过代码",既容易越界,也学不到能迁移的东西——因为具体绕过手法几个月就失效,而这套分层架构和信号模型十年都不会大变。
八、检测与加固对照
| 组件 | 所在层 | 它能看到什么 | 加固建议 |
|---|---|---|---|
| 文件实时扫描 + 云查 | 静态层 | 落盘文件的特征、哈希、信誉 | 开启云交付与 PUA 防护,保持引擎更新 |
| MOTW / SmartScreen | 静态层 | 文件是否来自互联网、信誉是否足够 | 不随意解除网络标记,关注容器格式传递缺口 |
| AMSI | 脚本层 | 解码后即将执行的脚本明文 | 保持脚本引擎更新,移除 PowerShell 2.0 |
| ETW | 用户态/内核 | 进程、网络、.NET、DNS 等结构化事件 | 集中收集关键 ETW 通道并留存 |
| 内核回调 / Minifilter | 内核层 | 进程线程创建、对象句柄、文件操作 | 依赖受支持的 EDR,勿自行关闭驱动 |
| 应用白名单 | 策略层 | 程序是否在信任清单内 | 服务器优先上 WDAC/AppLocker |
| EDR 关联 | 平台层 | 跨组件的完整行为链 | 打开 ASR 规则、配置告警与处置流程 |
表里"它能看到什么"这一列,正是后面 7.32–7.34 要逐层展开的内容;而"加固建议"这一列,是防守视角的落点。