在上一篇文章中,我尝试分析了一个 Windows 恶意样本。分析过程中发现,攻击者并不会依赖某一个“危险 API”完成攻击,而是将多个正常功能组合起来形成完整攻击链,例如进程创建、远程内存分配、代码写入以及线程执行等行为共同构成进程注入。

这让我重新思考之前 SnowWall 中 HIPS 行为检测的设计:安全检测的重点并不是简单判断某个 API 是否危险,而是分析多个事件之间的关联关系。

1. 攻击链

进程注入流程图

2. 单 API 检测不可靠的原因分析

错误设计: 仅拦截 CreateRemoteThread
问题:

  • 误报高:调试器、合法软件更新机制都会调用
  • 绕过简单:改用 NtQueueApcThread / NtSetContextThread 等替代执行方式
  • 漏报高:攻击者可用 Process Hollowing(无需远程线程)

改进设计: 从”单点拦截”转向”行为链评分”

3. SnowWall 设计思考

通过这次分析,结合SnowWall的原始设计方向,即它刚开始只拦截CreateRemoteThread.
经过改进后SnowWall使用了”事件组合”来更准确地判定恶意行为,例如将ProcessCreate(CREATE_SUSPENDED)+MemoryAlloc+MemoryWrite这个事件组合判定为进程挂起注入行为

3.1 SnowWall 当前行为规则模型(简化)

SnowWall 采用三层检测架构:
┌─────────────────────────────────────────────────────────────┐
│ 第一层:硬拦截(极高置信度,直接阻断) │
│ • 跨进程写入 PE 头(MZ/Shellcode) │
│ • Unmap→Alloc→Write→Protect 完整链 │
│ • 挂起进程恢复线程(Hollowing 最后一步) │
├─────────────────────────────────────────────────────────────┤
│ 第二层:时序可疑度评分(核心) │
│ • 按 PID+Cookie 隔离进程档案,防 PID 复用 │
│ • 指数衰减:30s 半衰期,污点进程 60s │
│ • 8 标签历史环 → 检测组合序列 → 动态加分 │
│ • 污点标记:触发高危行为后永久降阈值(80→64) │
├─────────────────────────────────────────────────────────────┤
│ 第三层:调试上下文豁免 │
│ • 信任分级:微软签名 > Program Files > 普通 │
│ • 红线:PE 头写入 / RWX 分配 / 主模块 Unmap 绝不豁免 │
└─────────────────────────────────────────────────────────────┘
标签泛化将具体 API 转化为抽象行为(如 NtAllocateVirtualMemory(Cross, RWX) → CrossExecAlloc),上层规则与具体 API 解耦,对抗替换绕过。
组合检测示例:

攻击类型 标签序列 加分 阈值
远程线程注入 CrossAlloc → CrossWrite → CrossThreadCreate +30 80
Process Hollowing Unmap → Alloc → Write → Protect_Exec +35 80
保护属性拆分 CrossAlloc → CrossWrite → CrossProtect_Exec +25 80

4. 展望

当前方案仍然依赖用户态行为采集,而攻击者可以通过 Native API、直接系统调用等方式绕过部分用户态监控。因此下一步计划研究 Windows 内核层事件采集方式,并探索如何结合驱动实现更可靠的行为监控。

相关项目与联系

项目SnowSword —— Windows 10/11 x64 内核分析与 Anti-Rootkit 工具,源码与发布包在 Gitee。

技术合作Windows 内核 / 驱动开发 / 逆向分析 / 兼容性开发,范围与边界见 技术合作。

联系2160752730@qq.com · QQ 2160752730 · 微信 lst_3258110