SnowSword

Windows 10/11 x64 Kernel Analysis & Anti-Rootkit Toolkit

从用户态枚举到内核对象分析,用多个独立视角交叉验证内核中的隐藏痕迹,并输出可复核的证据而不是“可疑”结论。

项目定位

SnowSword 是一个面向 Windows 10 / 11 x64 的内核分析与反 Rootkit 工具,目标是内核对象的枚举、交叉验证与证据输出:

  • 把内核态采集(对象管理器、内核地址空间)与用户态职责(集合运算、路径格式化、结果关联与展示)分层,驱动侧尽量薄;
  • 对同一类隐蔽技术,用多个互相独立的视角采集,再按映像基址关联,输出差异集合与置信等级,而不是直接判定“恶意”;
  • 承认误报与漏报:输出“需要人工复核”的条目,并把采集失败的字段标记为“未知”,而不是用硬编码偏移继续访问。

本页能力清单以项目作者确认的信息为准,并尽量标注对应的公开记录。已实现但本博客尚未单独成文的条目也会列出(只写能力名称,不补写未经验证的实现细节);未成立或未验证的部分统一放在验证状态与边界与后续方向。

平台与环境

项目 内容
目标系统 Windows 10 / 11 x64
采集层 内核态驱动(对象管理器、内核地址空间、安全内存读取)
交互层 用户态 CLI:--cli 交互、-c 单次命令、--agent-pipe 长连接、--format json JSON 输出
权限模型 EXE 以 requireAdministrator 运行;内核级操作需要 --force
调试与验证 WinDbg、DebugView、符号验证、隔离虚拟机中的对照测试

运行截图

以下截图来自作者本机的实机运行(Windows 10/11 x64,管理员权限),界面分别是 Ring3 端的 GUI 与 CLI。截图记录的是界面布局与字段含义,底部状态栏的条数是当次枚举的实际结果,不是基准测试数据。

主界面与进程列表

内核过滤驱动与设备栈

WFP Filter 列表

网络连接列表

CLI 查询 SSDT

NTFS raw 文件系统分析

已实现能力

以下为本项目当前已实现的能力(依项目作者确认的信息整理)。已在博客中单独成文的条目会引到对应文章;未附引用的条目表示本博客暂未单独成文,不代表未实现。本清单只列能力名称与已有记录,不对各能力的成熟度或稳定性作额外断言。

进程与线程分析

  • Process / Thread / Module / Window / Memory / Privilege 等进程维度的枚举与分析
  • Kernel thread suspend / resume

驱动与设备对象

  • Driver / Device Object / Device Stack 的枚举与关系分析
  • IRP Dispatch 检查

内核表与 Hook 检查

  • SSDT / ShadowSSDT
  • IDT / GDT,含多核检查
  • Ob callbacks(对象回调)
  • ExCallback 枚举
  • Minifilter / Instance 枚举
  • User-mode Inline / IAT / EAT Hook 扫描

隐藏驱动检测

  • 视角一:内核模块列表。使用 SystemModuleInformation(源自内核维护的已加载模块链表)获取驱动路径、映像基址与映像大小。两阶段查询处理不固定缓冲区大小,并对结构版本与路径编码做兼容处理。
  • 视角二:对象管理器驱动对象。从对象管理器命名空间获取 DRIVER_OBJECT,覆盖 \Driver、\FileSystem,以及 \FileSystem\Filters 子目录(MiniFilter 的驱动对象在这里,漏掉子目录会导致视野不完整)。按基址与模块列表关联,并处理引用计数纪律。
  • 视角三:内核内存 PE 特征扫描。扫描内核驱动区内存,用两级特征校验找出“带 PE 头却不在模块列表里”的可执行镜像,用于应对既摘链 PsLoadedModuleList、又不注册 \Driver 对象的情况。扫描范围不是“全内存”,而是有界的内核映像区。
  • 结果关联与分级:按映像基址做集合差集,标注来源视角(模块列表 / 对象目录 / 内存扫描)、来源数(双视角 / 三视角)与状态(已知模块、对象关联、游离 PE、需人工复核)。采集失败的条目单独标记,不混入隐藏候选。

隐藏进程检测

  • 用户态枚举与内核对象分析交叉验证:从用户态枚举 API 的视角与内核 EPROCESS 对象的视角分别建立集合,交叉比对发现异常进程,而不是只依赖单一 API 的返回值。
  • PspCidTable 进程枚举:作为第二种进程枚举视角,通过 PsLookupProcessByProcessId 的 call 跳板逆向定位 PspCidTable 地址,按 TableCode 级数逐级遍历句柄表,用 ObGetObjectType 过滤进程对象,handle 值即 PID。

文件系统

  • NTFS raw analysis
  • FAT32 相关能力

监控与行为检测

  • ETW / kernel debug monitoring
  • HIPS 相关能力(行为链检测方向)

枚举与查询(CLI)

命令 说明
process list 用户态进程枚举(PID / PPID / 名称 / 路径)
thread list --pid <N> 指定进程的线程枚举(TID、优先级、状态、ETHREAD、Teb、所属模块等)
thread callstack --pid <N> --tid <N> 线程调用栈
module list --pid <N> 指定进程的模块枚举
kernel-module list 内核模块列表(序号、名称、映像基址、映像大小、路径、驱动对象)
ssdt list SSDT 相关查询

内核内存安全读取

访问内核地址前先确认当前 IRQL,并组合使用 ProbeForRead 预检、MmCopyMemory 安全拷贝与 __try / __except 兜底;读取私有结构时还要考虑对象并发销毁与字段被修改的情况。这三者各自解决的问题不同,不能把其中任何一个当成“绝对安全”的保证。

破坏性操作的确认机制

process kill 一类用户态破坏性操作会先输出 WARNING: Destructive operation ... Confirm? [y/N]:,由调用方明确回复后执行;需要驱动的内核级操作(needsDriver=True)使用 --force 显式表达意图。工具不会为了方便而自动应答确认。

检测模型

1
2
3
4
5
6
7
8
9
10
11
12
13
不同来源采集
├─ 模块列表集合
├─ DRIVER_OBJECT 集合(\Driver / \FileSystem / \FileSystem\Filters)
└─ 内存 PE 候选集合
│
▼
按基址与名称关联
│
▼
输出差异与证据(来源视角 / 来源数 / 状态)
│
▼
人工复核后再做结论

这套设计不能保证发现所有内核隐蔽技术,但能让攻击者必须同时处理更多独立痕迹,也让检测结果比单一列表更容易解释和复核。

验证状态与边界

下面是验证状态上的缺口,不是“未实现的功能”清单:上面列出的能力已经在项目中实现,只是下列场景目前还没有公开的复现记录或对照数据。

  • 缺少干净系统基线与多次重复测试;
  • 模块、对象目录和内存候选的逐项对照尚未补齐;
  • 尚缺扫描耗时、CPU 占用和 IOCTL 次数的性能数据;
  • 非分页池定位、清除 PE 头等场景尚未验证;
  • OBJECT_DIRECTORY、LDR_DATA_TABLE_ENTRY 等内核私有结构随版本变化,跨 Windows 版本的适配与验证仍在进行中;
  • 对照测试只能证明两个工具在特定测试状态下枚举结果不同,不能据此断言某个工具一定正确,也不能外推到所有隐藏方式。

后续方向

  • 批量化内存扫描,并比较逐页与批量 IOCTL 的扫描时间、CPU 与请求数量;
  • 研究非分页池定位;
  • 为 DRIVER_OBJECT 增加多特征交叉校验,降低误报;
  • 把 WinDbg 验证信息纳入结果报告;
  • 按“基线 → 正常驱动 → 摘链场景 → 性能 → 兼容性”的顺序补全证据链,每个阶段固定保存系统版本、模块集合、对象集合与耗时。

相关文章

完整的自动聚合列表见 标签:SnowSword 与 分类:SnowSword Development。

源码与发布包

SnowSword 目前以个人项目形式开发,仓库与发布包入口都在 Gitee:

本页描述的是项目当前状态,会随实现推进而更新;与研究记录类文章相比,这里的结论更保守——只有经过实测并保留证据的结论才会写进来。

avatar
Snow
Windows Kernel Security · Anti-Rootkit · Reverse Engineering
Gitee
公告
Windows 10/11 x64 Kernel Analysis & Anti-Rootkit Toolkit
最新文章
网站信息
文章数目 :
15
最后更新时间 :