reverse-skills-max: initial public release (restored, redacted, hardened)
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
# 内核逆向决策树与证据分级
|
||||
|
||||
## 场景决策树(入口 → 分支)
|
||||
|
||||
### 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 手法),报告限定在授权分析范围,不提供可用做真实环境对抗的完整载荷
|
||||
Reference in New Issue
Block a user