Files

4.5 KiB
Raw Permalink Blame History

内核逆向决策树与证据分级

场景决策树(入口 → 分支)

1. 目标类型判定(第一级)

拿到 .sys 或内核相关样本
├─ 单独 .sys(无用户态样本) → 静态主线(第 2 节)
├─ .sys + 用户态样本        → 静态主线 + 交互闭环(第 2 节 + IOCTL 分支)
├─ rootkit 嫌疑(隐藏/钩子行为报告) → rootkit 特征分支(第 3 节)
├─ 崩溃 dump / 蓝屏定位      → [[re-windbg]] !analyze -v 直接走
└─ 加载器/服务安装器含驱动   → 先还原安装链(服务注册),再进静态主线

2. 静态主线(驱动分析)

DriverEntry 定位(EP 或 stub 跳转)
├─ 注册 MajorFunction(28 项数组赋值/RtlCopyMemory)
│  ├─ 有 IRP_MJ_DEVICE_CONTROL(0x0E)/INTERNAL_DEVICE_CONTROL(0x0F) → IOCTL 分支
│  ├─ 有 IRP_MJ_READ/WRITE → 数据流 handler 分支
│  └─ 全默认 handler        → 可能靠 minifilter/回调工作(下查 Flt*/Ps* 导入)
├─ IoCreateDevice/IoCreateSymbolicLink → 设备名 → 用户态入口 \\.\名
├─ IoAttachDevice* 出现     → filter 驱动(文件/键盘/网络过滤)→ 查挂载点与回调
├─ FltRegisterFilter 出现   → minifilter → 查 FLT_REGISTRATION 与 Instances 配置
└─ PsSet*/CmRegister/ObRegister 回调注册 → 回调分支(第 3 节)

3. rootkit 特征分支(按技术归类)

rootkit 嫌疑特征
├─ 函数头被改写(jmp rel32 / mov rax;jmp rax)→ inline hook → 逐字节比原始镜像(≥16 字节)
├─ 表项地址异常(!ssdt 对照)→ SSDT hook → 注意 Win8 起符号不导出 + x64 PatchGuard
├─ 进程/驱动枚举差集 → DKOM 摘链表 → 调试对照 + 取证插件复核
├─ 回调数组异常地址 → 回调滥用 → 查回调类型与注册点
├─ 文件操作被劫持 → minifilter 挂载 → 查 FLT_REGISTRATION 回调表
└─ 无静态特征但有行为异常 → 动态:内核调试断点定位 + 内存取证对照

4. IOCTL 交互分支

DeviceIoControl 调用点(用户态样本)
├─ 取 IOCTL 码 → 解码 CTL_CODE(高 16 位设备类型, bit14-15 访问, bit2-13 功能, bit0-1 方法)
│  ├─ Method 0 (BUFFERED)  → SystemBuffer 处理
│  ├─ Method 3 (NEITHER)   → Type3InputBuffer(需自己探针/ProbeForWrite)
│  └─ Method 1/2 (DIRECT)  → MDL 映射
├─ 驱动 handler 反编译 → 输入结构逐字段对齐(类型传播复核)
└─ 闭环验证:用户态触发 → 内核断点命中 → 参数核对

证据分级表

级别 证据形态 示例 用途
A 强 动态 + 静态闭合 内核断点命中 handler 且参数与静态分析一致;hook 字节与原始镜像 diff 落证 可下"确定"结论
B 中 静态链完整 DriverEntry→IRP→handler 全链还原、IOCTL 结构对齐 可下"高可信"结论
C 弱 静态特征 仅导入表含 Flt*/回调 API、可疑字符串 只支持"疑似",不下结论
反证 良性解释 回调为合规过滤功能(EDR/备份)、hook 是调试器断点 记录并存档
  • 内核证据必须带版本上下文:结构偏移、符号可用性、PatchGuard 行为都随系统版本变——结论标注目标系统版本
  • rootkit 结论要两条独立证据线(调试会话 + 取证转储)互相印证,单线证据降一级

实现教训(内化)

  • 先符号后偏移:有符号服务器/PDB 时全部用符号字段名,裸偏移只在无符号时用并标注版本
  • IRP 表是驱动的心脏:从 28 项分发表出发比从 DriverEntry 顺序读代码更能覆盖全行为
  • 交互闭环比单向静态可信:IOCTL 结构是否猜对,用用户态触发 + 内核断点验证,比反复读反编译快
  • rootkit 特征按"改了什么"分类:改表项(SSDT)/改代码(inline)/改链表(DKOM)/挂回调/挂过滤——每类有对应的对照方法,别混用
  • PatchGuard 是分析边界也是安全边界:被保护结构的修改行为只在调试 VM 验证,报告里标注"该手法在目标版本是否仍可行"
  • 每次驱动加载前打快照,崩溃即回滚——蓝屏是常态不是意外

使用注意

  • 全部动态环节在沙箱调试 VM 内(re-sandbox,re-analyze/platform-tips 最高原则);测试签名只开在分析 VM(见 windows-gotchas)
  • 内核分析结论涉及系统完整性(rootkit 手法),报告限定在授权分析范围,不提供可用做真实环境对抗的完整载荷