# 分析规划指南

> AI 编排器在阶段 B（分析规划）时加载。根据初始分析结果生成分析方案。

## 核心原则

1. **先规划再执行** — 任何分析型需求，必须先输出方案再开始执行
2. **场景驱动** — 根据 scene_tags 选择对应的方案模板
3. **收益/耗时评估** — 每个步骤标注预期耗时，高收益低耗时优先
4. **失败切换预设** — 每个步骤预设失败后的切换方向

---

## 场景分类与方案模板

### 场景：packed（加壳）

**场景标签**：`scene_tags` 包含 `"packed"`

**目标**：快速脱壳，获得可分析的解壳后二进制

**方案模板**：

| 步骤 | 操作 | 预期耗时 | 失败切换 |
|------|------|---------|---------|
| 1. 加载知识库 | 读取 `packer-handling.md` | 即时 | 无 |
| 2. 已知壳检查 | 如果 `packer_name` 不为 null，尝试工具脱壳 | 1-2 分钟 | → 步骤 3 |
| 3. OEP 定位 | 读 stub 尾部字节 → 搜索 OEP 模式 → 计算 OEP | 3-5 分钟 | → 步骤 5 |
| 4. 动态 dump | `debug_dump.py` 运行到 OEP 并 dump | 2-3 分钟 | → 步骤 4b |
| 4b. Frida dump | `frida_unpack.py` dump | 3-5 分钟 | → 步骤 5 |
| 5. 静态分析（最后手段） | 反编译 stub → 生成脱壳机 → 执行 | 15-30 分钟 | 告知用户限制 |

**强制规则**：
- 步骤 3 定位到 OEP 后**立即 dump**，禁止逆向解压算法
- 静态分析（步骤 5）仅在动态方法全部失败时使用
- 步骤 5 上限时 30 分钟
- 用户指令"不用三方脱壳工具"≠"必须静态分析" — IDA 调试器 dump 是内置能力

**解壳后**：
1. 用 idat 加载解壳产物
2. 重新执行 `initial_analysis.py` 获取解壳后的信息
3. 根据新的 scene_tags 进入对应场景

### 场景：crypto（密码学）

**场景标签**：`scene_tags` 包含 `"crypto"`

**目标**：识别密码学算法，找到输入/输出/比较逻辑，破解验证

**方案模板**：

| 步骤 | 操作 | 预期耗时 | 失败切换 |
|------|------|---------|---------|
| 1. 加载知识库 | 读取 `crypto-validation-patterns.md` | 即时 | 无 |
| 2. 快速验证 | 标准库计算 vs 程序输出对比 → 确认是否标准实现 | 3-5 分钟 | → 步骤 3 |
| 3. 差异定位 | 标准实现不匹配时，逐项排查差异点 | 5-10 分钟 | 回到步骤 2 换输入 |
| 4. 数据流追踪 | 从算法输入反推到用户输入，从输出追踪到比较逻辑 | 5-15 分钟 | — |
| 5. 求解 | 根据算法和比较逻辑，构造满足条件的输入 | 5-15 分钟 | — |

**强制规则**：
- 步骤 2 必须先做，不能跳过 — 先确认算法是否标准
- 差异定位顺序：padding → init 常量 → 输入构造 → round function → 字节序
- 不逐项检查 64 个常量，只在步骤 2 发现不匹配时才逐步骤 3

### 场景：gui（GUI 程序）

**场景标签**：`scene_tags` 包含 `"gui"`

**目标**：绕过 GUI 交互，直接到达关键逻辑

**方案模板**：

| 步骤 | 操作 | 预期耗时 | 失败切换 |
|------|------|---------|---------|
| 1. 加载知识库 | 读取 `dynamic-analysis.md` | 即时 | 无 |
| 2. 定位关键逻辑 | 找到比较函数、验证函数的地址 | 3-5 分钟 | 用 strings/xrefs 间接定位 |
| 3. Hook 关键点 | code cave 注入 → hook 比较函数 → 读取/修改参数 | 5-10 分钟 | → 步骤 4 |
| 4. GUI 自动化 | SendMessage(WM_SETTEXT) + PostMessage(WM_COMMAND) | 5-10 分钟 | → 步骤 5 |
| 5. Frida 注入 | `dynamic-analysis-frida.md` | 5-10 分钟 | 告知用户限制 |

**强制规则**：
- **优先 hook 比较逻辑**（步骤 3），而非 GUI 自动化（步骤 4）
- 编辑控件文本设置：`SetDlgItemTextA` 可能不生效 → 必须用 `SendMessage(hwnd_edit, WM_SETTEXT, 0, text_ptr)`
- 64-bit 环境调试 32-bit 进程（WoW64）时硬件断点可能不工作 → 优先 code cave 而非断点

### 场景：kernel_driver（Windows 内核驱动）

**场景标签**：`scene_tags` 包含 `"kernel_driver"`

**目标**：使用双机调试分析 Windows 内核驱动（.sys），绕过 VMProtect 等混淆

**前置条件**：
- 目标为 Windows 内核驱动（通过 IAT 中的 `IoCreateDevice`、`IofCompleteRequest` 等内核 API 自动识别）
- 宿主机有 VMware + vmrun
- VM 已配置 NET 调试传输

**方案模板**：

| 步骤 | 操作 | 预期耗时 | 失败切换 |
|------|------|---------|---------|
| 1. 加载知识库 | 读取 `$SHARED_DIR/knowledge-base/kernel-driver-analysis.md` | 即时 | 无 |
| 2. 环境检测 | `$PYTHON_CMD "$SHARED_DIR/scripts/detect_kernel_debug_env.py" --output "$TASK_DIR/kernel_env.json"` | 1-2 分钟 | 缺失项 → 告知用户配置 |
| 3. IAT 分析 | 读取 `initial.json` 中的 imports → 推导通信机制和功能 | 2-3 分钟 | 无 |
| 4. PE 常量搜索 | `struct.pack` + `find()` 搜索 IOCTL code、magic number | 3-5 分钟 | 无 |
| 5. 双机调试 | kd.exe 连接 VM → 反汇编关键代码 → dump 运行时数据 | 10-30 分钟 | kd 连接失败 → 检查 VM 调试配置 |
| 6. 算法还原 | 综合常量搜索和运行时反汇编 → 还原校验/编码算法 | 5-15 分钟 | — |

**强制规则**：
- **不要尝试让 IDA 完整分析 VMP 段** — 会无限卡住
- 步骤 2 环境检测不通过时，停止分析并告知用户配置缺失项
- 步骤 5 使用 kd.exe 封装模式（`.logopen` 写输出，`AttachConsole` 发 break）
- 常量搜索优先于反汇编 — VMP 虚拟化了代码但常量不变

**与 packed 场景的交互**：
- 如果 `kernel_driver` 和 `packed` 同时存在（VMP 内核驱动），忽略 packed 的脱壳流程，直接走 kernel_driver 方案
- VMP 内核驱动不能通过常规脱壳解决，必须走双机调试

### 场景：standard（标准二进制，无特殊标签）

**方案模板**：

| 步骤 | 操作 | 预期耗时 |
|------|------|---------|
| 1. 入口分析 | `decompile` main/WinMain | 1-2 分钟 |
| 2. 关键函数 | 根据入口代码找到关键调用 | 3-5 分钟 |
| 3. 深入分析 | 反编译/反汇编关键函数 | 5-15 分钟 |
| 4. 数据追踪 | xrefs + read_data 追踪数据流 | 5-10 分钟 |

### 场景组合

当 `scene_tags` 包含多个标签时，按优先级处理：
1. **kernel_driver 最优先** — 内核驱动必须走双机调试，忽略 packed
2. **packed 其次** — 先脱壳，再重新分析
3. **crypto 然后** — 脱壳后识别密码学特征
4. **gui 最后** — 在密码学分析需要运行时验证时处理

---

## 分析规划输出格式

向用户输出方案时使用以下格式：

```
## 分析方案

**场景分类**: [packed] [crypto] [gui]

**计划步骤**:
1. [x分钟] 操作描述 — 失败时: 切换方向
2. [x分钟] 操作描述
3. ...

**预计总耗时**: Xm

开始执行...
```

**用户可以在执行前调整方案**。但一旦开始执行，必须遵循失败切换规则。
