# 需求：加壳二进制静态分析脱壳流程

## 1. 背景与目标

### 1.1 背景

上一次进化（需求-加壳检测与异常分析增强）已实现壳检测能力：`packer_detect` 查询 + `segments` 异常标注。但当前策略在检测到壳后只能：
- 已知壳（如 UPX）→ 建议用户用 `upx -d` 脱壳
- 未知壳 → 告诉用户"建议先脱壳"

两种情况都**依赖用户手动操作**，AI 无法继续分析。

用户原始诉求："这是专门用于 crack 练习的可执行文件，帮我分析它是如何运作的"——系统检测到壳后直接停下来，无法回答用户的问题。

### 1.2 目标

升级加壳策略：检测到未知壳（或无自动脱壳工具的壳）时，AI 通过静态分析入口点代码，理解解壳算法，**自动生成 Python 脱壳机脚本并执行**，产出脱壳后的二进制文件。

### 1.3 评估维度

| 维度 | 改进 |
|------|------|
| 减少上下文 | 脱壳机生成后，后续分析基于脱壳的二进制，数据质量大幅提升 |
| 减少对话轮次 | 改进前：用户手动脱壳（3-4 轮交互）→ 改进后：0 轮（全自动） |
| 提升速度 | 省去用户手动操作时间（5-10 分钟） |
| 提升准确度 | AI 基于实际反编译代码推导算法，而非猜测 |

---

## 2. 技术方案

### 2.1 核心思路

```
packer_detect → 已知壳? → 是 → 尝试自动脱壳工具（upx -d 等）
                         → 否 → 静态分析脱壳流程 ↓

静态分析脱壳流程:
  1. decompile/disassemble 入口点（解壳 stub）
  2. read_data 读取被加壳数据区
  3. AI 推理解壳算法（识别循环结构、变换模式、OEP 恢复方式）
  4. 生成独立 Python 脱壳机脚本（不依赖 IDAPython）
  5. 执行脱壳机 → 输出原始二进制
  6. 用户用 IDA 打开脱壳后的文件，继续正常分析
```

### 2.2 改动范围

**只修改 1 个文件**：`ida-pro-analysis.md`

将现有的"加壳/混淆二进制处理策略"章节（第 177-193 行）从"检测到就停止"升级为完整的分阶段处理流程。

**不修改任何代码文件**：现有的 `packer_detect`、`decompile`、`disassemble`、`read_data` 查询已覆盖全部数据获取需求。

### 2.3 流程设计

替换现有的加壳策略章节，新增以下内容：

#### 阶段 1：壳检测（已有能力）

首次分析新二进制时，在 `entry_points` 后立即调用 `packer_detect`。

#### 阶段 2：已知壳自动脱壳（新增）

检测到已知壳名时：
1. 检查系统是否安装对应脱壳工具（`which upx` 等）
2. 已安装 → 直接执行脱壳（`upx -d <file> -o <output>`）
3. 未安装 → 告知用户安装命令（如 `brew install upx`），然后继续阶段 3

#### 阶段 3：静态分析脱壳（新增，核心）

当没有自动脱壳工具时，进入静态分析流程：

**步骤 3.1：分析解壳 stub**
- `decompile` 或 `disassemble` 入口点函数
- 识别关键结构：
  - 解压/解密循环（循环体 + 循环次数/条件）
  - 数据源地址（被加壳数据存放位置）
  - 数据目标地址（解壳后写入位置）
  - OEP（原始入口点）的存储/恢复方式
  - 使用的变换算法（XOR、ADD/SUB、位运算、LZMA、aPLib、自定义等）

**步骤 3.2：提取数据布局**
- `segments` 获取段布局，确定哪个段存储被加壳数据
- `read_data` 采样关键区域，验证对算法的理解

**步骤 3.3：生成脱壳机**
- 生成独立 Python 脚本（不依赖 IDAPython，可独立运行）
- 脚本模板结构：

```python
#!/usr/bin/env python3
"""脱壳机: <二进制文件名> — <壳类型>

基于静态分析结果自动生成。
入口点: 0xXXXX（解壳 stub）
原始入口点: 0xXXXX（OEP）
解壳算法: <算法描述>
"""

import struct
import sys

INPUT_FILE = sys.argv[1] if len(sys.argv) > 1 else "<原始文件名>"
OUTPUT_FILE = sys.argv[2] if len(sys.argv) > 2 else INPUT_FILE + ".unpacked"

def unpack(input_path, output_path):
    with open(input_path, "rb") as f:
        data = bytearray(f.read())

    # === 解壳算法（由 AI 根据静态分析结果填写） ===
    # 示例: XOR 解密
    # for i in range(start_offset, end_offset):
    #     data[i] ^= key

    with open(output_path, "wb") as f:
        f.write(data)
    print(f"[+] 脱壳完成: {output_path}")

if __name__ == "__main__":
    unpack(INPUT_FILE, OUTPUT_FILE)
```

**步骤 3.4：执行与验证**
- 执行脱壳机脚本：`python3 <脚本> <原始文件> <输出文件>`
- 验证输出文件是否存在且非空
- 用 `file` 命令检查输出文件类型（应为合法可执行文件格式）
- 提示用户将脱壳后的文件加载到 IDA 重新分析

#### 禁止操作（检测到加壳时）

- 不要在加壳版本上执行 `functions`、`func_info`、`strings`、`xrefs_to/from`（结果无意义）
- 不要在加壳版本上执行 `update.py` 修改操作（重命名、注释等无意义）
- 例外：`decompile`、`disassemble`、`read_data` 仅用于分析解壳 stub，这是脱壳流程的一部分

### 2.4 常见解壳模式参考（供 AI 识别）

在 prompt 中提供常见解壳模式，帮助 AI 快速识别：

| 模式 | 特征 | 脱壳方法 |
|------|------|---------|
| XOR 循环 | 单字节/多字节异或，通常有固定 key | 找到 key 和范围，逆异或 |
| ADD/SUB | 对每个字节加减固定值 | 反向操作 |
| 位运算组合 | ROL/ROR/SHL/SHR 组合 | 逆运算 |
| LZMA/zlib 压缩 | 调用解压 API 或内嵌解压代码 | 用 Python lzma/zlib 库 |
| aPLib 压缩 | 常见于壳中，小体积解压 | 用 aPLib Python 绑定 |
| 分块解密 | 逐块解密，每块可能用不同 key | 找到块大小和 key 生成逻辑 |
| 导入表重建 | 解壳后需要重建 IAT | 解析解壳后的内存布局 |

### 2.5 脱壳后的后续流程

脱壳成功后：
1. 告知用户脱壳成功，输出文件路径
2. 提示用户用 IDA 打开脱壳后的文件（需用户手动操作：在 IDA 中加载新文件）
3. 用户加载后，用新 .i64 文件路径继续正常分析流程

---

## 3. 实现规格

### 3.1 修改文件清单

| 文件 | 修改类型 | 行数变化 |
|------|---------|---------|
| `ida-pro-analysis.md` | 替换"加壳/混淆二进制处理策略"章节 | 删除 ~17 行，新增 ~120 行 |

### 3.2 不修改的文件

- `_base.py`：无变更
- `_utils.py`：无变更
- `query.py`：无变更（现有查询类型已够用）

### 3.3 脱壳机脚本的存放位置

脱壳机脚本写入 `$TASK_DIR/unpacker.py`，作为本次任务的临时产物。不沉淀到 `scripts/` 目录（脱壳机是针对特定二进制的，不是通用逆向分析原语）。

如果用户后续要分析同壳的不同二进制，可以基于此脚本修改。

---

## 4. 验收标准

### 4.1 功能验收

- [ ] `ida-pro-analysis.md` 包含完整的"阶段 1 → 阶段 2 → 阶段 3"加壳处理流程
- [ ] 阶段 2（已知壳自动脱壳）包含工具检测和自动执行逻辑
- [ ] 阶段 3（静态分析脱壳）包含完整的 4 个步骤（3.1-3.4）
- [ ] 包含常见解壳模式参考表
- [ ] 包含脱壳机脚本模板
- [ ] 禁止操作列表明确（与解壳 stub 分析的例外区分清晰）

### 4.2 回归验收

- [ ] 非加壳二进制分析流程不受影响（策略仅在 `packer_detected: true` 时激活）
- [ ] 已知壳（UPX）场景仍优先使用 `upx -d`（不强制走静态分析）
- [ ] prompt 总行数增加控制在 130 行以内（避免上下文膨胀）

### 4.3 架构验收

- [ ] 依赖方向合规：仅修改 prompt 文档，不涉及代码文件
- [ ] 脱壳机脚本为独立 Python 脚本（不依赖 IDAPython），不影响现有脚本架构

---

## 5. 与现有文档的关系

| 现有文档 | 关系 |
|---------|------|
| [需求-加壳检测与异常分析增强](需求-加壳检测与异常分析增强.md) | 本次需求是其后续进化，增强其产出的 prompt 策略部分 |
| [需求-IDA-Pro-AI智能分析命令-v2](需求-IDA-Pro-AI智能分析命令-v2.md) | 本次需求增强其产出的 `ida-pro-analysis.md` 的加壳处理策略 |
| [AGENTS.md](../../AGENTS.md) | 遵循编码规范（本次不涉及代码修改，但脱壳机脚本生成需遵循双引号等规范） |

---

## 6. 不做的事

1. **不新增查询类型**：现有 `decompile`/`disassemble`/`read_data` 已够用
2. **不做自动脱壳机沉淀**：脱壳机针对特定二进制，不是通用原语
3. **不做调试器集成**：脱壳完全基于静态分析，不依赖 IDA 调试器
4. **不做跨平台执行保证**：生成的脱壳机是纯 Python 脚本，但不保证对所有壳类型都能成功脱壳（AI 可能分析失败）
