reverse-skills-max: initial public release (restored, redacted, hardened)

This commit is contained in:
baradok609hecl1pq6qi
2026-10-20 02:17:15 +03:00
commit da24c2bd20
2227 changed files with 443931 additions and 0 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,461 @@
# reverse-skill 经验吸收 实现计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 从 reverse-skill field-journal(MIT)吸收 12 个条目的经验到 10 个 rev-skills 技能,技能总数 107 不变。
**Architecture:** 纯技能文档扩展。每个任务 = 在目标技能「## 常见坑与陷阱」章节末尾追加改写后的坑条目(现象/原因/对策格式)+ 来源注明(MIT)。吸收素材见 /home/DslsDZC/rev-refs/extract-field-journal.md(59 个踩坑点)。
**Tech Stack:** Markdown / validate.mjs(npm test,现有)
## Global Constraints
- **红线 1 呈现中性**:禁用「最推荐」「强烈建议」等最高级强推措辞
- **红线 2 隐私脱敏**:按提取稿「脱敏注意」泛化(厂商文件指纹/产品名/真实文件名全部泛化)
- **版权**:每条吸收末尾注明「(来源:reverse-skill field-journal,MIT)」
- **改写**:不逐字复制——按现象/原因/对策格式改写
- **查重**:入库前 grep 目标技能(含 references/);同现象已存在 → 跳过并在报告中记录
- 工作区已干净(无未提交文件);各任务 commit 只 `git add` 本任务列出的文件
- 当前分支 `main`;`npm test` 全程预期 `OK: 107 skills validated`
---
### Task 1: re-go 吸收(Go Garble 对抗 + TLS 分片代理)
**Files:**
- Modify: `.claude/skills/re-go/SKILL.md`(「## 常见坑与陷阱」末尾追加)
**Interfaces:**
- Consumes: 提取稿第 1、12 节素材
- Produces: re-go 的 Garble 对抗与源码重建经验
- [ ] **Step 1: 查重**
Run: `grep -n "Garble\|GoReSym\|字符串" .claude/skills/re-go/SKILL.md`
- 若已有同现象条目 → 跳过对应条并在报告中记录
- [ ] **Step 2: 追加坑条目**
在 `.claude/skills/re-go/SKILL.md` 的「## 常见坑与陷阱」章节末尾追加:
```markdown
- **Garble 混淆的 Go 二进制**:现象——stripped + 随机函数名 + 字符串全空;原因——Garble 同时混淆函数名与字符串;对策——GoReSym 恢复 pclntab(函数边界不受名字混淆影响)→ GoResolver CFG 签名恢复标准库名 → GoStringUngarbler 批量解密字符串 → 从解密串找 C2/密钥
- **Go 静态链接函数爆炸**:现象——5 万+ 函数看不过来;原因——整个 runtime 静态链接;对策——符号恢复后按包名过滤(只看用户代码包),先分包再筛业务
- **Go 加密密钥定位**:现象——找不到 AES 密钥;原因——密钥运行时从多个常量拼接;对策——跟踪 `crypto/aes.NewCipher`(或 `crypto/cipher.NewGCM`)第一个参数来源,回溯拼接点
- **Go 接口调用看不懂**:现象——反编译的 interface 调用是间接跳转;原因——Go interface 经 itab 分派;对策——定位 itab 表手动标注接口类型
- **符号可用但签名缺失**:现象——函数名有、参数/类型没有;原因——新版本 Go 产物不带完整符号信息;对策——接受函数名可用、签名靠其他证据(配置反序列化类型/调用点)重建
- **字符串噪声大**:现象——恢复的字符串混入大量标准库常量;原因——Go 标准库字符串常量;对策——按包级别过滤后再筛业务字符串
- **源码重建原则**:现象——逐行还原不现实;原因——产物无源码对应;对策——按包重建可读代码、保留逻辑而非逐行一致(逻辑优先)
(来源:reverse-skill field-journal,MIT)
```
- [ ] **Step 3: 结构校验**
Run: `npm test`
Expected: `OK: 107 skills validated`,无 FAIL
- [ ] **Step 4: Commit**
```bash
git add .claude/skills/re-go/SKILL.md
git commit -m "经验: re-go 吸收 reverse-skill field-journal(Garble 对抗链/密钥定位/源码重建,MIT)"
```
---
### Task 2: re-binary-core 吸收(ARM64 跳转表/XOR 解密器)
**Files:**
- Modify: `.claude/skills/re-binary-core/SKILL.md`(「## 常见坑与陷阱」末尾追加)
**Interfaces:**
- Consumes: 提取稿第 2 节素材
- Produces: re-binary-core 的平坦化轻量恢复经验
- [ ] **Step 1: 查重**
Run: `grep -n "跳转表\|控制流平坦\|XOR" .claude/skills/re-binary-core/SKILL.md`
- [ ] **Step 2: 追加坑条目**
在 `.claude/skills/re-binary-core/SKILL.md` 的「## 常见坑与陷阱」末尾追加:
```markdown
- **间接跳转平坦化主函数**:现象——反编译器只识别函数前部 CFG,分发器处中断;原因——间接 BR 跳转表(控制流平坦化);对策——按跳转表公式 `target = (table_entry + fixed_delta)` 枚举真实基本块,不依赖默认 CFG;符号长度远大于 CFG 识别长度时优先查 BR/BLR 间接表
- **逐函数 XOR 字符串解密器**:现象——字符串扫描只看到少量路径;原因——文本用每字符串独立的循环 XOR;对策——识别「前 N 字节密钥 + 后 M 字节密文」布局,从解密器指令提取 key/output 长度,静态重放算法(对平坦化块局部常量传播即可恢复间接目标与字符串源地址,无需先完整去平坦化)
- **自解压归档安全展开**:现象——解包目标含恶意路径;原因——归档内路径可构造;对策——逐成员校验后写出(拒绝绝对路径、`..`、链接、设备节点),不直接执行、不信任成员路径
- **压缩载荷定位**:现象——只按魔数找压缩流会漏;原因——魔数不唯一/被混淆;对策——对候选偏移做完整解压测试(有效流校验),不只看头部
(来源:reverse-skill field-journal,MIT)
```
- [ ] **Step 3: 结构校验**
Run: `npm test`
Expected: `OK: 107 skills validated`
- [ ] **Step 4: Commit**
```bash
git add .claude/skills/re-binary-core/SKILL.md
git commit -m "经验: re-binary-core 吸收(跳转表枚举/逐函数 XOR 解密器/自解压安全展开,MIT)"
```
---
### Task 3: re-deobfuscate 吸收(验证码 DSL VM)
**Files:**
- Modify: `.claude/skills/re-deobfuscate/SKILL.md`(「## 常见坑与陷阱」末尾追加)
**Interfaces:**
- Consumes: 提取稿第 3 节素材
- Produces: re-deobfuscate 的 DSL VM 对抗经验
- [ ] **Step 1: 查重**
Run: `grep -n "DSL\|VM\|opcode\|虚拟机" .claude/skills/re-deobfuscate/SKILL.md`
- [ ] **Step 2: 追加坑条目**
在 `.claude/skills/re-deobfuscate/SKILL.md` 的「## 常见坑与陷阱」末尾追加:
```markdown
- **自定义 DSL VM(纯 JS 虚拟机)**:现象——大 JS 文件被当 WASM/常规混淆;原因——自定义解释器循环 + 自定义 opcode;对策——DSL VM 五步:case 提取 → opcode 分类 → 常量表分析 → 函数追踪 → 导出提取;先确认是纯 JS 解释器再决定工具链
- **VM 导出函数隐藏**:现象——VM 文件中找不到导出函数名;原因——导出名被指令编码隐藏;对策——从模块注册中心提取真实导出(不通过 VM 文件表面暴露)
- **流程就绪 ≠ 会话建立**:现象——接口返回成功但流程没起来;原因——成功只是会话确认;对策——以特定状态码/阶段标志判断流程真正就绪,别拿会话确认当启动
(来源:reverse-skill field-journal,MIT)
```
- [ ] **Step 3: 结构校验**
Run: `npm test`
Expected: `OK: 107 skills validated`
- [ ] **Step 4: Commit**
```bash
git add .claude/skills/re-deobfuscate/SKILL.md
git commit -m "经验: re-deobfuscate 吸收(DSL VM 五步/导出隐藏/流程就绪判断,MIT)"
```
---
### Task 4: re-fw-extract 吸收(Cortex-M 分块 XOR)
**Files:**
- Modify: `.claude/skills/re-fw-extract/SKILL.md`(「## 常见坑与陷阱」末尾追加)
**Interfaces:**
- Consumes: 提取稿第 4 节素材
- Produces: re-fw-extract 的固件分块变换恢复经验
- [ ] **Step 1: 查重**
Run: `grep -n "XOR\|分块\|掩码" .claude/skills/re-fw-extract/SKILL.md`
- [ ] **Step 2: 追加坑条目**
在 `.claude/skills/re-fw-extract/SKILL.md` 的「## 常见坑与陷阱」末尾追加:
```markdown
- **分块周期变换**:现象——单一全文件 XOR/旋转只在开头有效;原因——变换按块大小(常见 256/512/1024/2048/4096)重置;对策——先按常见 Flash/传输块大小检查变换是否按块重置周期,显式分块解码
- **块首自带掩码混淆**:现象——高熵固件被当强加密;原因——分块自带掩码混淆(如 `mask = block[0]`、`plain[i] = ROR8(packed[i], n) XOR mask`);对策——先用强 crib(向量表 SRAM 栈指针/Thumb Reset Vector)约束恢复首块,再验证模型
- **众数 crib 不可靠**:现象——文本密集块用众数字节做掩码仍乱码;原因——最常见明文字节不一定是零;对策——改用块首字节模型,验证标准:乱码消失 + 第二份同系列固件复现 + round-trip 逐字节一致
- **CRC 字符串 ≠ CRC 字段**:现象——看到 CRC 名字符串就假设末尾是标准 CRC;原因——字符串只是元数据键;对策——系统排除常见 CRC/硬件 CRC/Adler/累加族后保留为未知字段,不强行命名
(来源:reverse-skill field-journal,MIT)
```
- [ ] **Step 3: 结构校验**
Run: `npm test`
Expected: `OK: 107 skills validated`
- [ ] **Step 4: Commit**
```bash
git add .claude/skills/re-fw-extract/SKILL.md
git commit -m "经验: re-fw-extract 吸收(分块周期/块首掩码/强 crib 验证,MIT)"
```
---
### Task 5: re-loader 吸收(ELF 自解压加载器)
**Files:**
- Modify: `.claude/skills/re-loader/SKILL.md`(「## 常见坑与陷阱」末尾追加)
**Interfaces:**
- Consumes: 提取稿第 5 节素材
- Produces: re-loader 的自解压加载器经验
- [ ] **Step 1: 查重**
Run: `grep -n "自解压\|PHDR\|mmap\|解压" .claude/skills/re-loader/SKILL.md`
- [ ] **Step 2: 追加坑条目**
在 `.claude/skills/re-loader/SKILL.md` 的「## 常见坑与陷阱」末尾追加:
```markdown
- **伪装后缀的自解压加载器**:现象——readelf 报错无法解析;原因——PHDR 被故意填充损坏(干扰解析);对策——忽略损坏的 PHDR 只看有效 LOAD 段;识别标准模式:入口 → 解压函数 → mmap(RW) → 解压 → mprotect(RX) → 跳转
- **位操作密集代码反编译差**:现象——Hex-Rays 输出不可读;原因——ARM64 位操作密集;对策——切反汇编视图手动分析(位流读取/移位/条件分支场景反编译器不如直接看汇编)
- **自写解压器 bug(carry 语义)**:现象——Python 重写解压器输出错误;原因——refill 路径返回值/进位语义误判;对策——仔细对照汇编核对 carry 语义,用已知明文加断言对比
- **入口偏移不确定**:现象——payload 入口字段含义不明;原因——数据表字段无文档;对策——跟踪 loader 实际跳转目标(`br mmap_base + offset`)确认入口
- **后缀不可信**:现象——按后缀选工具链出错;原因——自解压样本伪装扩展名;对策——`file` 永远是第一步;解析器选容错实现(可处理损坏头)
(来源:reverse-skill field-journal,MIT)
```
- [ ] **Step 3: 结构校验**
Run: `npm test`
Expected: `OK: 107 skills validated`
- [ ] **Step 4: Commit**
```bash
git add .claude/skills/re-loader/SKILL.md
git commit -m "经验: re-loader 吸收(自解压模式/损坏 PHDR/carry 语义,MIT)"
```
---
### Task 6: re-game 吸收(Unity IL2CPP)
**Files:**
- Modify: `.claude/skills/re-game/SKILL.md`(「## 常见坑与陷阱」末尾追加)
**Interfaces:**
- Consumes: 提取稿第 6 节素材
- Produces: re-game 的 IL2CPP 还原经验
- [ ] **Step 1: 查重**
Run: `grep -n "IL2CPP\|Il2Cpp\|metadata" .claude/skills/re-game/SKILL.md`
- [ ] **Step 2: 追加坑条目**
在 `.claude/skills/re-game/SKILL.md` 的「## 常见坑与陷阱」末尾追加:
```markdown
- **IL2CPP 元数据还原**:现象——dump 工具报版本不支持/输出不全;原因——Unity 版本改 metadata 格式;对策——升级 dump 工具(Il2CppDumper 或 Il2CppInspectorRedux),必须用同一次 dump 的产物对(script.json 与 so 匹配,换 IDA 清缓存)
- **加密的 global-metadata.dat**:现象——元数据文件是密文;原因——反作弊/自定义加密;对策——找初始化解密函数(il2cpp_init 周围),Frida 在 mmap/read 后 dump 内存中已解密的元数据再喂给 dump 工具
- **IL2CPP 方法 hook**:现象——Frida 裸 hook 报错;原因——IL2CPP 方法非标准 Java/ObjC,需按 metadata 算偏移;对策——用 frida-il2cpp-bridge 库,不硬写 Interceptor.attach
- **patch 后闪退**:现象——静态修改后启动崩溃;原因——文件 hash 校验/anti-tamper;对策——hook 优先(不改文件);必须静态 patch 时同步处理校验逻辑;重打包后删 META-INF 重新签名(apksigner)
(来源:reverse-skill field-journal,MIT)
```
- [ ] **Step 3: 结构校验**
Run: `npm test`
Expected: `OK: 107 skills validated`
- [ ] **Step 4: Commit**
```bash
git add .claude/skills/re-game/SKILL.md
git commit -m "经验: re-game 吸收(IL2CPP 元数据/加密 metadata/方法 hook,MIT)"
```
---
### Task 7: re-frida 吸收(OkHttp SSL Pinning,查重优先)
**Files:**
- Modify: `.claude/skills/re-frida/SKILL.md`(「## 常见坑与陷阱」末尾追加)
**Interfaces:**
- Consumes: 提取稿第 7 节素材
- Produces: re-frida 的分层绕过与反检测经验
- [ ] **Step 1: 查重(关键步骤)**
Run: `grep -n "CertificatePinner\|TrustManager\|pinning\|固定" .claude/skills/re-frida/SKILL.md .claude/skills/re-frida/references/frida-scripts.md`
- frida-scripts.md 已有「SSL 固定绕过」模板(TrustManager + CertificatePinner)——**该条跳过**,报告记录
- 其余条(分层 hook 思维/反 Frida 检测/ProGuard 混淆定位)查重后决定
- [ ] **Step 2: 追加坑条目(查重后剩余)**
在 `.claude/skills/re-frida/SKILL.md` 的「## 常见坑与陷阱」末尾追加(按 Step 1 查重结果裁剪,未命中才写入):
```markdown
- **多层 TLS 校验栈**:现象——单点 hook 后部分请求仍 SSL 错误;原因——App 同时用 OkHttp/原生 HttpsURLConnection/Conscrypt 多套栈;对策——分层覆盖(OkHttp CertificatePinner + TrustManagerImpl.verifyChain + HostnameVerifier 同时 hook),全栈覆盖才算绕过完成
- **ProGuard 混淆后定位目标类**:现象——类名被改成短名;原因——混淆;对策——jadx 里 Find Usages 反查谁实例化关键 Builder,从实例化点反推原类
(来源:reverse-skill field-journal,MIT)
```
- [ ] **Step 3: 结构校验**
Run: `npm test`
Expected: `OK: 107 skills validated`
- [ ] **Step 4: Commit**
```bash
git add .claude/skills/re-frida/SKILL.md
git commit -m "经验: re-frida 吸收(多层 TLS 栈覆盖/混淆定位,MIT)"
```
---
### Task 8: re-ios-jb 吸收(越狱检测绕过)
**Files:**
- Modify: `.claude/skills/re-ios-jb/SKILL.md`(「## 常见坑与陷阱」末尾追加)
**Interfaces:**
- Consumes: 提取稿第 8 节素材
- Produces: re-ios-jb 的检测绕过与抓包经验
- [ ] **Step 1: 查重**
Run: `grep -n "越狱检测\|jailbreak\|spawn\|证书信任" .claude/skills/re-ios-jb/SKILL.md`
- [ ] **Step 2: 追加坑条目**
在 `.claude/skills/re-ios-jb/SKILL.md` 的「## 常见坑与陷阱」末尾追加:
```markdown
- **检测在加载期执行**:现象——hook 来不及,App 启动前已检测;原因——检测在 `+load` / `__attribute__((constructor))` 中执行;对策——spawn 模式在最早时机注入(`-f` + 启动即 hook)
- **双重校验**:现象——绕过越狱检测后仍闪退;原因——越狱检测与 SSL Pinning 叠加;对策——同时禁用两者,不要只处理一个
- **hook 系统函数波及自身**:现象——hook stat 后 App 卡住;原因——系统级 hook 影响正常逻辑;对策——按 caller 过滤,只 hook 应用自身代码触发的调用
- **证书信任开关**:现象——mitmproxy 装证书后仍 SSL 错误;原因——iOS 14+ 需在证书信任设置手动开启;对策——装完证书后到「通用 → 关于本机 → 证书信任设置」勾选
- **越狱检测 hook 模板**:现象——需要快速绕过常见检测;对策——拦截文件存在性检查(越狱路径列表返回不存在)+ fork 返回 -1(越狱机能 fork,非越狱机返回 -1)
(来源:reverse-skill field-journal,MIT)
```
- [ ] **Step 3: 结构校验**
Run: `npm test`
Expected: `OK: 107 skills validated`
- [ ] **Step 4: Commit**
```bash
git add .claude/skills/re-ios-jb/SKILL.md
git commit -m "经验: re-ios-jb 吸收(加载期检测/双重校验/证书信任开关,MIT)"
```
---
### Task 9: re-proto-rev 吸收(PCAP 自定义协议)
**Files:**
- Modify: `.claude/skills/re-proto-rev/SKILL.md`(「## 常见坑与陷阱」末尾追加)
**Interfaces:**
- Consumes: 提取稿第 9 节素材
- Produces: re-proto-rev 的帧界/加密判定/闭环验证经验
- [ ] **Step 1: 查重**
Run: `grep -n "熵\|dissector\|长度字段\|nonce" .claude/skills/re-proto-rev/SKILL.md`
- [ ] **Step 2: 追加坑条目**
在 `.claude/skills/re-proto-rev/SKILL.md` 的「## 常见坑与陷阱」末尾追加:
```markdown
- **私有协议无解析器**:现象——Wireshark 只显示 Data;原因——私有协议无 dissector;对策——写 Lua dissector(<100 行)或 Python 离线分析
- **数据无规律 → 先验加密**:现象——每帧都不同;原因——压缩/加密层;对策——熵分析(>7.5 几乎肯定加密),加密层找 nonce/IV 字段;长度字段解不出时按「长度可能 little/big-endian、含/不含自身」列方程组解语义
- **重放被拒**:现象——数据正确但服务端不响应;原因——协议带递增 seq/nonce;对策——搞清楚 seq 计算方式(前一帧 hash 或递增计数器),复现时正确推进
- **闭环验证**:现象——协议还原是否成立无判据;对策——用还原的帧结构写 client 发一帧,服务端响应一致才算成立
(来源:reverse-skill field-journal,MIT)
```
- [ ] **Step 3: 结构校验**
Run: `npm test`
Expected: `OK: 107 skills validated`
- [ ] **Step 4: Commit**
```bash
git add .claude/skills/re-proto-rev/SKILL.md
git commit -m "经验: re-proto-rev 吸收(私有协议解析/熵判加密/seq 推进,MIT)"
```
---
### Task 10: re-script-deob + re-crypto-id 吸收(JS 签名)
**Files:**
- Modify: `.claude/skills/re-script-deob/SKILL.md`(「## 常见坑与陷阱」末尾追加)
- Modify: `.claude/skills/re-crypto-id/SKILL.md`(「## 常见坑与陷阱」末尾追加)
**Interfaces:**
- Consumes: 提取稿第 10 节素材
- Produces: re-script-deob 的 webpack 定位经验 + re-crypto-id 的签名模式识别经验
- [ ] **Step 1: 查重**
Run: `grep -n "webpack\|签名\|initiator" .claude/skills/re-script-deob/SKILL.md .claude/skills/re-crypto-id/SKILL.md`
- [ ] **Step 2: 追加坑条目(2 文件)**
`.claude/skills/re-script-deob/SKILL.md` 的「## 常见坑与陷阱」末尾追加:
```markdown
- **webpack 打包定位签名函数**:现象——搜 "sign" 结果太多;原因——打包压缩变量名;对策——搜特征串(`sign=`)或用网络面板 initiator 列回溯发起请求的调用栈(比搜源码快)
- **本地复现结果不一致**:现象——签名逻辑对但服务端不认;原因——参数排序/时间戳精度不对;对策——核对源码 sort 逻辑(按 key 字母序 + 特殊字符规则);时间戳用 `Math.floor(Date.now() / 1000)`(秒级)
- **密钥在另一 chunk**:现象——签名函数里找不到密钥;原因——密钥经 require 从其他 chunk 引入;对策——签名函数断点处 console.log 打印密钥变量
(来源:reverse-skill field-journal,MIT)
```
`.claude/skills/re-crypto-id/SKILL.md` 的「## 常见坑与陷阱」末尾追加:
```markdown
- **常见签名模式速查**:现象——签名算法识别慢;对策——按模式快速对照:HmacSHA256(sorted_params, key) 最常见;MD5(params + salt + timestamp) 较老系统;AES(JSON.stringify(params), key) 是加密而非签名;RSA sign 少见(多为金融类)
(来源:reverse-skill field-journal,MIT)
```
- [ ] **Step 3: 结构校验**
Run: `npm test`
Expected: `OK: 107 skills validated`
- [ ] **Step 4: Commit**
```bash
git add .claude/skills/re-script-deob/SKILL.md .claude/skills/re-crypto-id/SKILL.md
git commit -m "经验: re-script-deob/re-crypto-id 吸收(webpack 定位/签名模式速查,MIT)"
```
---
### Task 11: re-managed 吸收(Electron Bytenode 更新链)
**Files:**
- Modify: `.claude/skills/re-managed/SKILL.md`(「## 常见坑与陷阱」末尾追加)
**Interfaces:**
- Consumes: 提取稿第 11 节素材
- Produces: re-managed 的 Electron/Bytenode 分析经验
- [ ] **Step 1: 查重**
Run: `grep -n "Electron\|Bytenode\|ASAR\|字节码" .claude/skills/re-managed/SKILL.md`
- [ ] **Step 2: 追加坑条目**
在 `.claude/skills/re-managed/SKILL.md` 的「## 常见坑与陷阱」末尾追加:
```markdown
- **Bytenode 字节码绑定 ABI**:现象——宿主 Node 加载 JSC 失败;原因——Bytenode 字节码绑定特定 V8/Node ABI;对策——用样本自带 Electron 的 RunAsNode 模式(`ELECTRON_RUN_AS_NODE=1`)执行,不启动业务 GUI
- **注册面 ≠ 执行面**:现象——枚举 handler 无法证明数据流;原因——注册存在不等于路径执行;对策——先枚举 IPC/preload 注册面,再对高风险 handler 用 mock fixture 调用并捕获副作用(URL 接收/下载/解压/spawn 参数),形成证据闭环
- **更新链五元组取证**:现象——更新流程证据不全;原因——链路节点分散;对策——按 `source URL → downloader → archive path → extractor → executable` 每个节点保存哈希与时间戳
- **签名状态分四态**:现象——双签名 DLL 判断含糊;原因——各签名状态可能不同;对策——`signtool verify /pa /all /v` 逐签名检查(存在性/有效期/时间戳/信任验证分开报告)
- **静态能力 ≠ 已执行**:现象——native 字符串/导入显示高权限能力;原因——导入是线索不是证据;对策——能力描述结合 xref/调用链,报告分栏「条件性能力」与「已观察行为」
(来源:reverse-skill field-journal,MIT)
```
- [ ] **Step 3: 结构校验**
Run: `npm test`
Expected: `OK: 107 skills validated`
- [ ] **Step 4: Commit**
```bash
git add .claude/skills/re-managed/SKILL.md
git commit -m "经验: re-managed 吸收(Bytenode ABI/注册面执行面分离/更新链取证,MIT)"
```

View File

@@ -0,0 +1,509 @@
# 4 个语言逆向技能 实现计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 新增 4 个语言逆向原子技能(re-swift / re-zig / re-nim / re-fp-runtime)+ 挂载同步,技能总数 97 → 101。
**Architecture:** 纯技能文档扩展。4 个新技能目录(SKILL.md,按 docs/skill-template.md 原子技能规范,全部挂 re-binary-core)+ 挂载(re-binary-core 子技能/选择树、re-ios/re-macos 跨域)+ 计数同步(README / AGENTS / marketplace)。
**Tech Stack:** Markdown / YAML frontmatter / validate.mjs(npm test,现有)
## Global Constraints
- **红线 1 呈现中性**:禁用「最推荐」「强烈建议」等最高级强推措辞
- **红线 2 隐私脱敏**:内容不指向具体项目/公司/产品
- **不绑定具体工具**:方法为核心,工具为可替换示例;「工具准备」按模板给跨 OS 安装命令
- validate.mjs:frontmatter `name`=目录名、`description` 非空、`type: atomic` 必含「## 工具准备」、`[[链接]]` 必须解析
- 工作区已干净(无未提交文件)——所有目标文件(含 re-binary-core/SKILL.md)可正常修改提交;各任务 commit 只 `git add` 本任务列出的文件
- 当前分支 `main`;`npm test` 预期按任务标注递增(98 → 101)
---
### Task 1: 创建 re-swift 技能
**Files:**
- Create: `.claude/skills/re-swift/SKILL.md`
**Interfaces:**
- Consumes: 无(新目录)
- Produces: 技能目录 `re-swift`(供 Task 5 的 [[re-swift]] 链接解析;计数 97 → 98)
- [ ] **Step 1: 创建目录与 SKILL.md**
```bash
mkdir -p .claude/skills/re-swift
```
写入 `.claude/skills/re-swift/SKILL.md`:
````markdown
---
name: re-swift
type: atomic
description: >
Swift 二进制逆向:mangling 解码、协议 witness table、闭包捕获、ObjC 互操作。
触发词:Swift逆向、swiftc、witness table、swift demangle、闭包捕获、Swift 产物。
---
# Swift 逆向
## 何时使用 / 何时不用
- 用:Swift 产物(Mach-O/ELF 含 Swift mangling 特征 `$s` 前缀)
- 不用:纯 ObjC(走 [[re-ios]] / [[re-macos]] 的 ObjC 路径)
## 工具准备
### swift-demangle(Swift 工具链,mangling 解码)
- macOS: Xcode 自带(`xcrun swift-demangle`);Linux: `apt install swiftlang` 或 Swift 官方工具链
- Windows: Swift 官方工具链
- 验证: `echo '$s3foo3bar' | swift-demangle`(输出可读形式)
### llvm-objdump(反汇编辅助)
- 安装与验证见 [[re-cpp-abi]] 工具准备
### Ghidra / IDA(反编译底座)
- 安装与验证见 [[re-ghidra]] / [[re-ida]]
## 操作步骤
按顺序执行,每步产物存档(路径 + sha256,见 [[re-triage]])。
1. **产物识别**:
```sh
strings sample | grep -E '^\$s' | head
readelf -s sample 2>/dev/null | grep -E 'swift_' | head # ELF;Mach-O 用 llvm-nm
```
- `$s` mangling 前缀是 Swift 标志;swift_* 运行时导入(swift_retain / swift_release / swift_allocObject)确认
- 纯 ObjC 无 `$s` → 转 [[re-ios]] / [[re-macos]]
2. **mangling 解码(批量)**:
```sh
readelf -s sample | grep '^\$s' | awk '{print $8}' | swift-demangle | head -20
```
- 解码内容:模块名/类型/函数签名/泛型参数展开
- 解码结果写入符号表(供 [[re-ghidra]] / [[re-ida]] 重命名)
3. **协议 witness table**:
- witness table 是协议方法的分发表(Swift 动态分派的核心)
- 定位:搜索 `swift_witnessTable` 相关引用 / 协议 conformance 记录(`_swift_getWitnessTable` 调用点)
- 还原:表内槽位 = 协议要求的方法实现地址 → 结合 [[re-cpp-abi]] 的 vtable 恢复思路反推协议一致性
4. **闭包捕获**:
- 闭包是 context 对象:捕获变量布局(按捕获顺序 + 引用语义标记)
- 定位:`swift_allocObject` 调用点 → context 分配 → 捕获字段初始化
- 还原:context 结构体字段 → 捕获变量名/类型(与函数签名关联)
5. **ObjC 互操作**:
- `@objc` 桥接:Swift 类经 ObjC runtime 可见(NSObject 子类、消息发送 objc_msgSend)
- 分析:ObjC 方法列表(class-dump 思路)→ Swift 实现入口(桥接 thunk)
- 混合产物:先走 ObjC 路径([[re-ios]] / [[re-macos]])再进 Swift 层
## 跨域联合
- [[re-binary-core]] 网关:本技能归属(选择树「Swift 产物」分支)
- [[re-ios]] / [[re-macos]]:生态衔接(ObjC 层、App 层分析)
- [[re-cpp-abi]]:vtable/witness table 恢复思路同源
- [[analysis-contract]]:符号表按数据契约传递
## 常见坑与陷阱
- **mangling 版本差异**:现象——新版本 Swift 产物解码失败;原因——mangling 方案演进;对策——升级 swift-demangle 匹配目标编译版本
- **泛型展开符号爆炸**:现象——解码输出大量 `$s...Gy` 泛型实例;原因——泛型特化;对策——按模块/类型聚类过滤
- **witness table 无符号名**:现象——分发表槽位全是裸地址;原因——协议 conformance 无命名符号;对策——结合协议方法调用点反推
- **闭包捕获含引用语义**:现象——context 字段是引用计数对象;原因——捕获变量含类实例;对策——按 swift_retain/release 调用点确认引用字段
- **纯 ObjC 误入**:现象——无 `$s` 却按 Swift 流程走;原因——产物实为 ObjC;对策——步骤 1 先确认(无 `$s` 即转)
````
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 98 skills validated`([[链接]]:re-ios/re-macos/re-cpp-abi/re-ghidra/re-ida/re-triage/analysis-contract 均存在)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-swift/SKILL.md
git commit -m "feat: re-swift 技能——mangling/witness table/闭包捕获/ObjC 互操作"
```
---
### Task 2: 创建 re-zig 技能
**Files:**
- Create: `.claude/skills/re-zig/SKILL.md`
**Interfaces:**
- Consumes: 无(新目录)
- Produces: 技能目录 `re-zig`(供 Task 5 的 [[re-zig]] 链接解析;计数 98 → 99)
- [ ] **Step 1: 创建目录与 SKILL.md**
```bash
mkdir -p .claude/skills/re-zig
```
写入 `.claude/skills/re-zig/SKILL.md`:
````markdown
---
name: re-zig
type: atomic
description: >
Zig 编译产物逆向:产物识别、comptime 展开、panic/错误处理路径、C ABI 边界。
触发词:Zig逆向、zig、comptime、zig 产物、panic。
---
# Zig 逆向
## 何时使用 / 何时不用
- 用:Zig 产物(无 C++ RTTI/异常表、panicking 函数特征)
- 不用:C/C++ 产物(走 [[re-cpp-abi]])
## 工具准备
### readelf / llvm-nm(符号与节分析)
- 安装与验证见 [[re-cpp-abi]] 工具准备
### Ghidra / IDA(反编译底座)
- 安装与验证见 [[re-ghidra]] / [[re-ida]]
## 操作步骤
按顺序执行,每步产物存档(路径 + sha256,见 [[re-triage]])。
1. **产物识别**:
```sh
readelf -s sample | grep -iE 'panicking|std.debug|zig' | head
readelf -S sample | grep -E 'eh_frame|gcc_except' # 无 C++ 异常表特征
```
- Zig 特征:panicking 函数(panic 处理链)、std 符号模式(std.debug.print 等)、**无 C++ RTTI/异常表**(对比 [[re-cpp-abi]] 的 RTTI/异常密集特征)
- 与 C 混合编译:Zig 符号与 C 符号共存(见步骤 4 边界)
2. **导出符号与启动路径**:
```sh
readelf -s sample | grep -E 'start|main|init' | head
```
- 启动路径:`_start` → 运行时初始化 → `main`(Zig 的 main 入口)
- comptime 展开产物:编译期计算已内联/展开——无对应源码结构,按行为分析
3. **panic/错误处理路径**:
- panic 链:`@panic` → panic 函数(打印 + abort)——定位 panic 调用点可找输入校验/不变量
- 错误联合(error union):`!T` 类型布局(错误码 + 值),调用点检查 `orelse`/`catch` 分支
- 分析:错误路径是逆向重点(校验逻辑、失败分支)
4. **C ABI 边界**:
- `@extern` / `@cImport`:Zig 调用 C 库(导入表清晰可查)
- 混合产物:按符号来源区分(Zig 符号 vs C 符号——链接器分组/节归属)
- 边界处是逻辑入口(Zig 主体逻辑在边界内侧)
## 跨域联合
- [[re-binary-core]] 网关:本技能归属(选择树「Zig 产物」分支)
- [[re-cpp-abi]]:边界区分(无 RTTI/异常 → 非 C++)
- [[analysis-contract]]:符号表按数据契约传递
## 常见坑与陷阱
- **comptime 展开导致符号膨胀**:现象——产物符号与源码不对应;原因——编译期展开/内联;对策——按行为分析而非源码映射
- **panic 路径误导**:现象——大量 panic 处理代码被当主逻辑;原因——错误路径与正常路径交织;对策——先分离 panic 调用点(校验),再分析正常路径
- **错误联合布局版本差异**:现象——错误码读取错位;原因——error union 布局随版本变化;对策——按目标版本确认布局(错误码位宽/对齐)
- **与 C 混合编译难分界**:现象——Zig/C 符号混杂;原因——混合编译;对策——按符号来源与节归属分组,边界处进 Zig 逻辑
- **无异常表 ≠ 无保护**:现象——误判无错误处理;原因——Zig 错误处理走 error union 不走异常表;对策——查错误联合调用点(`catch`/`orelse` 分支)
````
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 99 skills validated`([[链接]]:re-cpp-abi/re-ghidra/re-ida/re-triage/analysis-contract 均存在)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-zig/SKILL.md
git commit -m "feat: re-zig 技能——产物识别/comptime/panic 与错误路径"
```
---
### Task 3: 创建 re-nim 技能
**Files:**
- Create: `.claude/skills/re-nim/SKILL.md`
**Interfaces:**
- Consumes: 无(新目录)
- Produces: 技能目录 `re-nim`(供 Task 5 的 [[re-nim]] 链接解析;计数 99 → 100)
- [ ] **Step 1: 创建目录与 SKILL.md**
```bash
mkdir -p .claude/skills/re-nim
```
写入 `.claude/skills/re-nim/SKILL.md`:
````markdown
---
name: re-nim
type: atomic
description: >
Nim 编译产物逆向:运行时识别、NimString 结构、异常与 GC 路径。
触发词:Nim逆向、nim、NimString、NimMain、nim 产物。
---
# Nim 逆向
## 何时使用 / 何时不用
- 用:Nim 产物(NimMain / GC 符号、NimString 结构特征)
- 不用:C 产物(走 [[re-binary-core]] 通用)
## 工具准备
### readelf / llvm-nm(符号分析)
- 安装与验证见 [[re-cpp-abi]] 工具准备
### Ghidra / IDA(反编译底座)
- 安装与验证见 [[re-ghidra]] / [[re-ida]]
## 操作步骤
按顺序执行,每步产物存档(路径 + sha256,见 [[re-triage]])。
1. **产物识别**:
```sh
readelf -s sample | grep -iE 'NimMain|nimGC|NimString' | head
```
- Nim 特征:`NimMain`(入口)、GC 符号(nimGC_*)、`NimString` 结构
- 入口:`NimMain` 调用链(运行时初始化 → 模块初始化 → main)
2. **字符串与序列结构**:
- NimStringV2 布局:`len`(int)+ `reserved`(int)+ `data`(char* 或内联)——按版本确认字段序
- 定位:`newString` 分配调用点 → 结构布局 → 字符串操作函数(`eqStrings` 等)
- 分析:字符串比较点是关键逻辑(校验/协议/命令分发)
3. **异常与 raises 路径**:
- Nim 异常:`raise` → 异常对象分配 → 异常表(Nim 有异常表,与 C++ 不同)
- 定位:异常处理入口(`nimSetjmp` / 异常表)→ catch 分支
- 分析:异常路径揭示输入校验与失败处理
4. **GC 与引用计数**:
- refc(旧默认):引用计数——`nimIncRef` / `nimDecRef` 调用点
- orc(新默认):循环收集——`nimGC_*` 分配/收集
- 分析:GC 调用点帮助识别对象生命周期与所有权(配合字符串结构)
## 跨域联合
- [[re-binary-core]] 网关:本技能归属(选择树「Nim 产物」分支)
- [[analysis-contract]]:符号表按数据契约传递
## 常见坑与陷阱
- **GC 版本差异(refc/orc)**:现象——找不到引用计数调用;原因——orc 无显式 inc/dec;对策——按 Nim 版本确认 GC 模式再分析
- **NimString 布局随版本变化**:现象——data 字段偏移错;原因——版本演进;对策——按目标版本确认(字段序 len/reserved/data)
- **导出符号被 strip**:现象——无 NimMain/NimString 符号;原因——strip 处理;对策——按特征字符串/运行时行为识别([[re-triage]] 初勘兜底)
- **C 混合编译**:现象——Nim/C 符号混杂;原因——`{.compile:}` 混合;对策——按符号来源分组,Nim 侧进本技能路径
- **字符串比较点误判**:现象——关键校验被当普通比较;原因——eqStrings 包装;对策——追踪 Nim 字符串函数调用点定位比较逻辑
````
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 100 skills validated`([[链接]]:re-cpp-abi/re-ghidra/re-ida/re-triage/analysis-contract 均存在)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-nim/SKILL.md
git commit -m "feat: re-nim 技能——运行时识别/NimString/异常与 GC 路径"
```
---
### Task 4: 创建 re-fp-runtime 技能
**Files:**
- Create: `.claude/skills/re-fp-runtime/SKILL.md`
**Interfaces:**
- Consumes: 无(新目录)
- Produces: 技能目录 `re-fp-runtime`(供 Task 5 的 [[re-fp-runtime]] 链接解析;计数 100 → 101)
- [ ] **Step 1: 创建目录与 SKILL.md**
```bash
mkdir -p .claude/skills/re-fp-runtime
```
写入 `.claude/skills/re-fp-runtime/SKILL.md`:
````markdown
---
name: re-fp-runtime
type: atomic
description: >
函数式语言运行时逆向(Haskell/OCaml):闭包/堆对象模型、调用约定、数据流优先策略。
触发词:Haskell逆向、OCaml逆向、GHC RTS、thunk、STG、OCaml runtime、闭包、函数式产物。
---
# 函数式运行时逆向(Haskell / OCaml)
## 何时使用 / 何时不用
- 用:Haskell/OCaml 产物(GHC RTS 符号、OCaml block 头特征)
- 不用:命令式语言产物(各归各技能:C++ → [[re-cpp-abi]]、Go → [[re-go]]、Rust → [[re-rust]])
## 工具准备
### readelf / llvm-nm(符号分析)
- 安装与验证见 [[re-cpp-abi]] 工具准备
### ghc 工具链(Haskell 侧,可选)
- Linux/macOS: GHC 安装包(`apt install ghc` / `brew install ghc` / ghcup);验证: `ghc --version`
### ocamlobjinfo(OCaml 侧,可选)
- Linux/macOS: OCaml 工具链(`apt install ocaml` / `brew install ocaml`);验证: `ocamlobjinfo -version`
### Ghidra / IDA(反编译底座)
- 安装与验证见 [[re-ghidra]] / [[re-ida]]
## 操作步骤
按顺序执行;逆向着重**数据流**而非控制流(函数式产物控制流被打散,见坑 4)。每步产物存档(路径 + sha256,见 [[re-triage]])。
1. **运行时识别**:
```sh
readelf -s sample | grep -iE 'ghc|stg_|RTS|HsMain' | head # GHC 特征
readelf -s sample | grep -iE 'caml_|camlMain' | head # OCaml 特征
```
- GHC:`HsMain` 入口、`stg_*` 运行时符号、`RTS` 段
- OCaml:`camlMain` 入口、`caml_*` 运行时符号
- **字节码 vs 原生**:OCaml 字节码产物(非 native)特征(`caml_start_program`)→ 字节码可反汇编还原;native 产物走常规反编译
2. **闭包与堆对象**:
- GHC:thunk(未求值闭包)与已求值值的堆对象布局——closure header(info table 指针)+ 字段;CAF(顶层常量)在启动时初始化
- OCaml:block 头(tag + 大小,低 2 位 = 标记);tagged int(奇数值 = 直接整数,偶数值 = 指针)
- 分析:字段与构造器是主要线索(数据流优先)
3. **调用约定**:
- GHC:函数参数经栈传递(STG 机),返回在栈顶——与常规寄存器约定不同
- OCaml:参数经寄存器(前 N 个)传递,闭包调用经 `caml_applyN`
- 分析:先识别运行时包装(`caml_apply` / stg 入口)再进用户逻辑
4. **分析策略(数据流优先)**:
- 控制流打散:惰性求值导致求值顺序不可预测——静态控制流分析价值低
- 数据流线索:闭包字段初始化点(构造器参数)、模式匹配分支(构造器标签分发)、字符串/常量引用
- 产出:数据流图(构造器 → 字段 → 使用点)替代控制流图(与 [[analysis-contract]] 数据契约衔接)
## 跨域联合
- [[re-binary-core]] 网关:本技能归属(选择树「Haskell/OCaml 产物」分支)
- [[analysis-contract]]:数据流图按数据契约传递
## 常见坑与陷阱
- **RTS 版本差异**:现象——closure 布局解读失败;原因——GHC/OCaml 版本演进;对策——按目标版本确认布局
- **thunk 惰性求值误导**:现象——未求值闭包被当已求值数据;原因——惰性求值;对策——区分 thunk 头(info table 指向求值代码)与已求值值
- **OCaml 字节码非 native**:现象——反编译全是运行时包装;原因——字节码产物;对策——识别 `caml_start_program` 后按字节码反汇编(非常规反编译)
- **控制流打散导致静态分析失效**:现象——函数体无连续逻辑;原因——函数式编译产物;对策——转数据流分析(步骤 4),不硬追控制流
- **tagged int 误读**:现象——整数被当指针/指针被当整数;原因——OCaml 值标记位;对策——按低 2 位区分(1=整数,0=指针),访问前先解标记
````
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 101 skills validated`([[链接]]:re-cpp-abi/re-go/re-rust/re-ghidra/re-ida/re-triage/analysis-contract 均存在)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-fp-runtime/SKILL.md
git commit -m "feat: re-fp-runtime 技能——函数式运行时逆向(GHC/OCaml 闭包与数据流)"
```
---
### Task 5: 挂载与计数同步
**Files:**
- Modify: `.claude/skills/re-binary-core/SKILL.md`(子技能列表加 4 个 + 选择树加 4 分支)
- Modify: `.claude/skills/re-ios/SKILL.md`(跨域联合加 [[re-swift]])
- Modify: `.claude/skills/re-macos/SKILL.md`(跨域联合加 [[re-swift]])
- Modify: `README.md`(计数 97→101、84→88、re-binary-core 导航行加 4 个)
- Modify: `AGENTS.md`(97→101、84→88)
- Modify: `.claude-plugin/marketplace.json`(97→101)
**Interfaces:**
- Consumes: Task 1-4 的 4 个技能目录(链接可解析)
- Produces: 4 技能全库可达;计数 101 = 1 + 12 + 88
- [ ] **Step 1: re-binary-core 挂载(2 处)**
`.claude/skills/re-binary-core/SKILL.md` 子技能列表(现含 `、[[re-cpp-abi]]` 的 description 行)末尾追加 `、[[re-swift]]、[[re-zig]]、[[re-nim]]、[[re-fp-runtime]]`(在 `[[re-cpp-abi]]` 之后)。
选择树(现含「**目标是 C++(RTTI/异常表密集)** → [[re-cpp-abi]]」行)在其后插入 4 行:
```markdown
- **目标是 Swift 产物($s mangling 特征)** → [[re-swift]](mangling/witness table/闭包捕获)
- **目标是 Zig 产物(无 RTTI/异常表、panicking 特征)** → [[re-zig]](comptime/错误路径)
- **目标是 Nim 产物(NimMain/NimString 特征)** → [[re-nim]](运行时/字符串结构)
- **目标是 Haskell/OCaml 产物(GHC RTS/OCaml block 特征)** → [[re-fp-runtime]](闭包/数据流)
```
- [ ] **Step 2: re-ios / re-macos 跨域引用(2 处)**
`.claude/skills/re-ios/SKILL.md` 跨域联合节末尾追加:
```markdown
- Swift 层分析(mangling/witness table)→ [[re-swift]]
```
`.claude/skills/re-macos/SKILL.md` 跨域联合节末尾追加:
```markdown
- Swift 层分析(mangling/witness table)→ [[re-swift]]
```
- [ ] **Step 3: 计数同步(3 文件)**
`README.md`:
- `## 技能导航(97)` → `## 技能导航(101)`
- `入口 → 12 大类网关 → 84 原子技能` → `入口 → 12 大类网关 → 88 原子技能`
- 第 5 行 `97 个逆向工程技能` → `101 个逆向工程技能`
- re-binary-core 导航行末尾加 `、re-swift、re-zig、re-nim、re-fp-runtime`(在 `re-cpp-abi` 之后)
`AGENTS.md`:
- `(97 个技能)` → `(101 个技能)`
- `原子技能(84)` → `原子技能(88)`
`.claude-plugin/marketplace.json`:
- `97 个技能` → `101 个技能`
- [ ] **Step 4: 校验**
Run: `npm test`
Expected: `OK: 101 skills validated`
Run: `grep -c "re-swift\|re-zig\|re-nim\|re-fp-runtime" README.md`
Expected: ≥ 4
- [ ] **Step 5: Commit**
```bash
git add .claude/skills/re-binary-core/SKILL.md .claude/skills/re-ios/SKILL.md .claude/skills/re-macos/SKILL.md README.md AGENTS.md .claude-plugin/marketplace.json
git commit -m "增强: 4 语言技能挂载与计数同步 101(re-binary-core 选择树/re-ios-macos 跨域/README-AGENTS-marketplace)"
```

View File

@@ -0,0 +1,386 @@
# re-feedback 经验反馈网关 实现计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 新增第 12 个网关技能 re-feedback(元网关),实现经验三源收集 → 蒸馏脱敏 → 归域 → 三档处理(发表 issue / 本地入库 / 不入库),并在 re-analyze 末尾挂可选复盘钩子。
**Architecture:** 纯技能库扩展(Markdown 指令集,无新增代码)。新技能目录 `.claude/skills/re-feedback/`(SKILL.md + references/intake.md + references/issue-template.md);re-analyze/SKILL.md 加「第四步(可选):经验复盘」;README/AGENTS 同步计数与导航。校验靠现有 validate.mjs(`npm test`)。
**Tech Stack:** Markdown / YAML frontmatter / validate.mjs(Node,现有)
## Global Constraints
- **红线 1 呈现中性**:选项/建议禁用「最推荐」「强烈建议」等最高级强推措辞;选项不带推荐标注,只中性列出与适用场景,用户自决
- **红线 2 隐私脱敏**:蒸馏产物禁止具体到某个项目/公司/产品,暗示也不行(行业+规模+地域组合、专有协议名、内部代号等);技能库公开发布(npm + 插件市场),本地入库同样受约束;入库/发 issue 前必须脱敏自检
- validate.mjs 规则:frontmatter `name` = 目录名、`description` 非空、`type` ∈ atomic/entry/gateway、正文 `[[链接]]` 必须解析到技能目录或 references/*.md 文件名;gateway 类型豁免「工具准备」
- 工作区现有 3 个未提交修改(`.claude/skills/re-binary-core/SKILL.md`、`re-mobile/SKILL.md`、`re-protocol/SKILL.md`)是用户待处理的入库内容——**各任务 commit 只 `git add` 本任务列出的文件,严禁 `git add -A`**
- 正文纯 Markdown,frontmatter 标准 YAML,技能引用统一 `[[技能名]]`
- 当前分支 `feat/re-skills`
---
### Task 1: 创建 re-feedback 网关主文件
**Files:**
- Create: `.claude/skills/re-feedback/SKILL.md`
**Interfaces:**
- Consumes: 无(新目录)
- Produces: 技能目录 `re-feedback`(validate 的 knownSkills 里新增,供 Task 4 的 `[[re-feedback]]` 链接解析);引用 `[[intake]]`、`[[issue-template]]`(对应 Task 2/3 的 references 文件名,先建链接后建文件,validate 的 knownRefs 在文件存在后才收录——故本任务验证只检查名称/格式,完整链接校验在 Task 3 后)
- [ ] **Step 1: 创建目录与 SKILL.md**
```bash
mkdir -p .claude/skills/re-feedback/references
```
写入 `.claude/skills/re-feedback/SKILL.md`:
```markdown
---
name: re-feedback
type: gateway
description: >
经验反馈元网关。三源收集(会话复盘/文章扫描/手动输入)→ 蒸馏脱敏 → 归域 → 三档处理(发表 issue/本地入库/不入库)。
触发词:反馈经验、经验入库、提交经验、经验复盘、心得沉淀、lessons learned。
---
# 经验反馈
<HARD-GATE>
两条红线,违反即停:
1. 呈现中性:选项/建议禁用「最推荐」「强烈建议」等最高级强推措辞,只中性列出选项与适用场景,由用户自决。
2. 隐私脱敏:蒸馏产物禁止具体到某个项目/公司/产品,暗示也不行(行业+规模+地域组合、专有协议名、内部代号等)。
本库公开发布(npm + 插件市场),本地入库同样受约束。入库/发 issue 前必须做脱敏自检。
</HARD-GATE>
## 完整工作流
1. 收集(三源归一):
- 会话复盘:本次分析会话的踩坑/新方法([[re-analyze]] 第四步调用时已就绪)
- 文章扫描:`bin/wxsource.mjs` 抓取看雪/微信文章(`kanxue thread <ID> --md` / `wechat <URL> --md`),逐篇蒸馏
- 手动输入:用户一句话/一段笔记
2. 蒸馏与脱敏:按 `references/intake.md` —— 坑格式 `**标题**:现象——…;原因——…;对策——…`,同步脱敏
3. 归域分类:`references/intake.md` 决策表 → grep 技能库兜底 → 仍不确定问用户(不猜)
4. 三档处理(中性呈现,不带推荐标注):
- ① 发表 issue:`which gh` + `gh auth status` 探测;可用则 `gh issue create --repo DslsDZC/aihk --label 经验`,标题「经验: <技能>: <一句话>」,正文按 `references/issue-template.md`;不可用 → 输出 markdown 草稿供手动提交
- ② 本地入库:grep 去重 → 追加到该技能 `references/experience.md`(无则创建,条目含来源+日期)→ SKILL.md「常见坑与陷阱」精选同步或追加 experience.md 链接(先建文件再加链接,避免断链)→ `npm test` 校验
- ③ 不入库:确认后结束
5. (文章扫描路径可选)提交 commit:「经验: 第N轮扫描入库X篇——<篇目>」,message 列出每技能新增条目
## 何时走哪条路(选择树)
- 输入 = 本次分析会话摘要 → 会话复盘源;目标 = 沉淀本次实战
- 输入 = 文章 URL / 帖子 ID / 文章文本 → 文章扫描源;逐篇蒸馏,按 intake.md 标准跳过工具/推广帖
- 输入 = 用户一句话/笔记 → 手动源;直接蒸馏
- 三档选择(中性呈现):1. 发表 issue(可公开分享、他人可复用)2. 本地入库(本库沉淀、随库发布)3. 不入库(一次性心得)
## 跨域联合
- [[re-analyze]] 第四步(可选)调用本网关做会话复盘
- 归域目标为全部技能([[re-binary-core]] [[re-malware]] [[re-firmware]] [[re-protocol]] [[re-mobile]] [[re-anti-analysis]] [[re-cracking]] [[re-vuln]] [[re-ctf]] [[re-managed]] [[re-forensics]] 及其原子技能)
- 文章抓取用仓库 `bin/wxsource.mjs`;入库后用 `npm test`(validate.mjs)校验结构
## 常见坑与陷阱
- 蒸馏不脱敏直接入库/发 issue → 泄漏项目身份 —— 红线 2,入库前逐项列专有名词自检
- 呈现带「最推荐」等强推 → 绑架用户判断 —— 红线 1,只中性列选项
- 归域不确定硬猜 → 经验写错技能、下次检索不到 —— 问用户
- 入库后不跑 npm test → 断链/格式错破坏 CI —— 每次入库后必须 `npm test`
- 重复条目重复入库 → 库膨胀 —— 入库前 grep 关键词去重
- 文章扫描不跳过工具/推广帖 → 经验贬值 —— 按 intake.md 跳过标准过滤
```
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 89 skills validated`(re-feedback 计入;[[]] 链接中的 [[intake]]/[[issue-template]] 此时可能报 broken——属预期,Task 2/3 补齐 references 后复跑解除)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-feedback/SKILL.md
git commit -m "feat: re-feedback 经验反馈网关主文件(三源收集/三档处理/双红线)"
```
---
### Task 2: 创建蒸馏方法论 references/intake.md
**Files:**
- Create: `.claude/skills/re-feedback/references/intake.md`
**Interfaces:**
- Consumes: 无
- Produces: references 文件 `intake`(加入 validate 的 knownRefs,解除 SKILL.md 中 [[intake]] 的 broken 状态);内容约定:条目格式、脱敏规则、归域决策表(决策表目标链接全部为已存在技能)、去重规则、文章扫描跳过标准
- [ ] **Step 1: 创建 references/intake.md**
写入 `.claude/skills/re-feedback/references/intake.md`:
```markdown
# 蒸馏方法论
经验条目统一格式、脱敏规则、归域决策表、去重规则、文章扫描跳过标准。
## 条目格式
每条一格,格式固定:
**标题(动词短语,10-20 字)**:现象——(可复现的现象描述);原因——(根因,不重复现象);对策——(可执行的下一步,含技能/工具名)
示例:
**重打包保持原始格式参数**:现象——重打包/替换资源后的包在真机加载崩溃或解析失败;原因——重打包工具默认输出格式与原格式存在差异(压缩方式/对齐/容器标志);对策——保留原包的格式参数(压缩标志/对齐方式),产出与原始文件同量级同格式,先本地验证再上真机
- 一条一格:一个现象 + 一个根因 + 一个对策,不把多个坑合并进一条
- 「坑」与「方法」同格式:坑写避坑;方法写「现象——旧做法低效;原因——…;对策——更优路径」
## 脱敏规则(红线)
- 禁止出现:公司/产品/项目名、目标样本名、内部代号、专有协议名、域名/包名/签名指纹
- 禁止暗示:行业+规模+地域组合、独特技术特征组合(可推断身份)
- 泛化写法:目标 → 「某移动应用」「某嵌入式设备」「某通信协议」;只保留技术结论(现象/原因/对策)
- 来源字段:实战会话 → `2026-08 实战会话`(只写时间);文章 → 文章标题 + URL(公开信息可保留)
- 入库/发 issue 前自检:列出条目中所有专有名词逐项确认已泛化;任一不通过 → 回炉重蒸
## 归域决策表
| 条目主题 | 目标技能 |
|---|---|
| 壳/脱壳/反混淆/花指令/控制流平坦化 | [[re-anti-analysis]] 系([[re-packer-id]] [[re-unpack-simple]] [[re-unpack-advanced]] [[re-deobfuscate]]) |
| 恶意行为/持久化/注入/C2 | [[re-malware]] 系([[re-behavior]] [[re-loader]] [[re-fileless]] [[re-ioc]]) |
| 固件/IoT/嵌入式/rootfs | [[re-firmware]] 系([[re-fw-extract]] [[re-fw-rootfs]] [[re-fw-emulate]]) |
| 协议/流量/抓包/加密通信 | [[re-protocol]] 系([[re-netcap]] [[re-proto-rev]] [[re-crypto-id]] [[re-crypto-keys]] [[re-crypto-decrypt]] [[re-tls]]) |
| 移动 App/JNI/Frida/加固脱壳 | [[re-mobile]] 系([[re-apk]] [[re-android-native]] [[re-frida]] [[re-mobile-pack]]) |
| 一般二进制/反编译/调试/格式 | [[re-binary-core]] 系([[re-triage]] [[re-format-pe]] [[re-ghidra]] [[re-gdb]]) |
| 破解/授权/注册码/补丁 | [[re-cracking]] 系([[re-license]] [[re-patching]] [[re-keygen]]) |
| fuzz/崩溃/漏洞/利用 | [[re-vuln]] 系([[re-fuzzing]] [[re-crash-triage]] [[re-exploit]]) |
| CTF/angr/z3 | [[re-ctf]] 系([[re-angr]] [[re-z3]] [[re-pwn]]) |
| .NET/Java/脚本/WASM/合约/AI 模型 | [[re-managed]] 系([[re-dotnet]] [[re-java]] [[re-script-deob]] [[re-wasm]] [[re-blockchain]] [[re-ai-model]]) |
| 取证/内存取证/威胁情报 | [[re-forensics]] 系([[re-mem-forensics]] [[re-disk-forensics]] [[re-ti]]) |
| 反作弊/内核驱动/虚拟化 | [[re-kernel]] [[re-anti-cheat]] [[re-hypervisor]]([[re-binary-core]] 系) |
兜底:`grep -rn "关键词" .claude/skills/*/SKILL.md` 找最相关技能;仍不确定 → 问用户,不猜。
## 去重规则
- 入库前 `grep -n "标题关键词" .claude/skills/<技能>/references/experience.md`(文件不存在 = 无重复)
- 同现象已存在 → 跳过并告知用户;内容更完整的新版本可替换旧条目
## 文章扫描跳过标准
- 工具/工作流推广帖(新手教程、工具介绍、无新方法论)
- 正文截断/无法提取正文
- 纯新闻/非逆向内容
```
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 89 skills validated`([[intake]] broken 状态解除;[[issue-template]] 仍可能报 broken,属预期)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-feedback/references/intake.md
git commit -m "feat: re-feedback 蒸馏方法论(条目格式/脱敏规则/归域决策表/去重/跳过标准)"
```
---
### Task 3: 创建 issue 模板 references/issue-template.md
**Files:**
- Create: `.claude/skills/re-feedback/references/issue-template.md`
**Interfaces:**
- Consumes: 无
- Produces: references 文件 `issue-template`(解除 SKILL.md 中 [[issue-template]] 的 broken 状态);约定:gh 提交用 `--body` 传填充后的模板,草稿档直接输出
- [ ] **Step 1: 创建 references/issue-template.md**
写入 `.claude/skills/re-feedback/references/issue-template.md`:
```markdown
# Issue 正文模板
`gh issue create` 用 `--body` 传填充后的模板(占位符全部替换);草稿档直接输出填充后的模板正文。
**标题**:`经验: <技能名>: <一句话概括>`
**正文**:
## 技能
<技能名,如 re-mobile>
## 现象
<可复现的现象描述>
## 原因
<根因>
## 对策
<可执行的下一步,含技能/工具名>
## 来源
<2026-08 实战会话 / 文章标题 + URL>
## 脱敏声明
- [ ] 已确认:不含具体项目/公司/产品名
- [ ] 已确认:无暗示性细节(行业+规模+地域组合、专有协议名、内部代号)
```
- [ ] **Step 2: 结构校验(全部链接应已解析)**
Run: `npm test`
Expected: `OK: 89 skills validated`,无任何 FAIL 输出
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-feedback/references/issue-template.md
git commit -m "feat: re-feedback issue 模板(gh 提交/草稿共用,含脱敏声明)"
```
---
### Task 4: re-analyze 末尾挂经验复盘钩子
**Files:**
- Modify: `.claude/skills/re-analyze/SKILL.md`(在「## 第三步:编排分派」段落末尾、`## 何时使用 / 何时不用` 之前插入「## 第四步(可选):经验复盘」;第三步段落以"…必要时回退调整路径(见 triage.md 复合任务示例)。"结尾,紧邻其后插入)
**Interfaces:**
- Consumes: Task 1 的技能目录 `re-feedback`([[re-feedback]] 链接可解析)
- Produces: re-analyze 第四步(可选)——分析后引导用户调用 [[re-feedback]];triage.md 不改(第四步不属于任务识别路径)
- [ ] **Step 1: 插入第四步段落**
在 `.claude/skills/re-analyze/SKILL.md` 中,`## 何时使用 / 何时不用` 标题之前插入:
```markdown
## 第四步(可选):经验复盘
分析结论交付后,问用户是否把本次踩坑/新方法反馈给技能库——需要则调用 [[re-feedback]](三档:发表 issue / 本地入库 / 不入库;蒸馏必须脱敏,见该网关红线)。
```
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 89 skills validated`,无 FAIL
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-analyze/SKILL.md
git commit -m "feat: re-analyze 第四步(可选)经验复盘钩子 → re-feedback"
```
---
### Task 5: README / AGENTS 同步计数与导航
**Files:**
- Modify: `README.md`(第 5 行技能数、第 48 行「技能导航(88)」、第 50 行「入口 → 11 大类网关 → 76 原子技能」、re-forensics 行后追加 re-feedback 行)
- Modify: `AGENTS.md`(第 3 行「88 个技能」、第 8 行「大类网关(11)」)
**Interfaces:**
- Consumes: Task 1 的技能目录(计数 88→89、11→12)
- Produces: 文档一致性(validate.mjs 不校验这两文件,人工 grep 验证)
- [ ] **Step 1: 修改 README.md**
`README.md` 第 5 行:
- `88 个逆向工程技能` → `89 个逆向工程技能`
- `**通用、可发布**` 描述不变
`README.md` 第 48-50 行附近:
- `## 技能导航(88)` → `## 技能导航(89)`
- `入口 → 11 大类网关 → 76 原子技能` → `入口 → 12 大类网关 → 76 原子技能`
re-forensics 行(`- **re-forensics**:...`)之后追加一行:
```markdown
- **re-feedback**:经验反馈元网关——三源收集(会话复盘/文章扫描/手动输入)→ 蒸馏脱敏 → 归域 → 三档处理(发表 issue / 本地入库 / 不入库),re-analyze 第四步挂钩
```
- [ ] **Step 2: 修改 AGENTS.md**
`AGENTS.md` 第 3 行:`(88 个技能)` → `(89 个技能)`
`AGENTS.md` 第 8 行:`大类网关(11):re-binary-core / re-malware / re-firmware / re-protocol / re-mobile / re-anti-analysis / re-cracking / re-vuln / re-ctf / re-managed / re-forensics` → `大类网关(12):re-binary-core / re-malware / re-firmware / re-protocol / re-mobile / re-anti-analysis / re-cracking / re-vuln / re-ctf / re-managed / re-forensics / re-feedback(经验反馈元网关)`
- [ ] **Step 3: 校验**
Run: `npm test`
Expected: `OK: 89 skills validated`
Run: `grep -c "re-feedback" README.md AGENTS.md`
Expected: 两个文件各至少 1 处
- [ ] **Step 4: Commit**
```bash
git add README.md AGENTS.md
git commit -m "docs: README/AGENTS 同步 re-feedback(89 技能/12 网关)"
```
---
### Task 6: 端到端走查(三档处理)
**Files:**
- Test: 临时样本经验(不入库样例,仅走查;如需真入库用后删除或保留为演示条目)
- Test: `.claude/skills/re-feedback/references/experience.md`(② 档演练产物,验证后保留——作为该技能自身的经验全集首条)
**Interfaces:**
- Consumes: Task 1-4 全部产物
- Produces: 验证三档路径可用;为 re-feedback 技能自身沉淀一条首条经验
- [ ] **Step 1: 准备脱敏样本**
用以下已脱敏样本(技术内容真实、无项目身份):
```
**三档选择先问用户再动手**:现象——拿到经验直接按默认档处理(如直接发 issue),用户其实想本地留底;原因——档位是用户的权利,预设处理侵犯自主判断;对策——步骤 4 先用中性句式问「这次经验怎么处理?1. 发表 issue 2. 本地入库 3. 不入库」,等用户选定再执行
```
- [ ] **Step 2: 走查 ① 档(仅验证 gh + 草稿,不真实发 issue)**
Run: `which gh && gh auth status`
- gh 存在且已登录 → 用填充后的模板拼出完整 issue 内容(标题「经验: re-feedback: 三档选择先问用户再动手」+ 技能/现象/原因/对策/来源/脱敏声明 六段),**验证 gh 命令形式**(`gh issue create --help` 确认参数写法),**不执行真实创建**;展示填充后的草稿全文供用户核对
- gh 不存在/未登录 → 确认输出填充后的模板 markdown 草稿(标题 + 技能/现象/原因/对策/来源/脱敏声明 六段),提示用户手动提交
- 无论哪种情况:不调用 `gh issue create` 真实发帖(用户决定:演练零对外影响)
- [ ] **Step 3: 走查 ② 档(本地入库)**
1. 去重:`grep -n "三档选择" .claude/skills/re-feedback/references/experience.md` → 文件不存在(无重复)
2. 创建 `.claude/skills/re-feedback/references/experience.md`:
```markdown
# 经验全集
条目按时间倒序,来源见每条末尾;本文件与 SKILL.md「常见坑与陷阱」精选并存。
## 2026-08
- **三档选择先问用户再动手**:现象——拿到经验直接按默认档处理(如直接发 issue),用户其实想本地留底;原因——档位是用户的权利,预设处理侵犯自主判断;对策——步骤 4 先用中性句式问「这次经验怎么处理?1. 发表 issue 2. 本地入库 3. 不入库」,等用户选定再执行(来源:2026-08 实战会话)
```
3. SKILL.md「常见坑与陷阱」末尾追加链接行:`- 更多经验见本技能 [[experience]](经验全集)`
4. Run: `npm test` → Expected: `OK: 89 skills validated`([[experience]] 链接解析成功)
5. Commit:
```bash
git add .claude/skills/re-feedback/references/experience.md .claude/skills/re-feedback/SKILL.md
git commit -m "经验: re-feedback 首条入库(三档选择先问用户再动手)"
```
- [ ] **Step 4: 走查 ③ 档(不入库)**
用另一条样本(如「临时心得」),确认网关在用户选 ③ 后不再写任何文件、只口头确认结束,无残留产物(`git status` 无新增文件)。
- [ ] **Step 5: 全量校验收尾**
Run: `npm test`
Expected: `OK: 89 skills validated`,无 FAIL;`git log --oneline -6` 可见本计划的全部提交(Task 1-6)

View File

@@ -0,0 +1,447 @@
# rev-skills 能力新增 实现计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 新增 2 个原子技能(re-python / re-frida-script-author)+ 3 处并入(Keystore 审计 / Flutter channel / svc 检测),技能总数 89 → 91。
**Architecture:** 纯技能文档扩展。2 个新技能目录(SKILL.md,按 docs/skill-template.md 原子技能规范)+ 3 处现有技能/契约文件补章节 + 计数同步(README/AGENTS/marketplace.json)。校验靠 validate.mjs(npm test)。
**Tech Stack:** Markdown / YAML frontmatter / validate.mjs(Node,现有)
## Global Constraints
- **红线 1 呈现中性**:禁用「最推荐」「强烈建议」等最高级强推措辞
- **红线 2 隐私脱敏**:内容不指向具体项目/公司/产品;示例泛化(「某移动应用」等)
- **不绑定具体工具**:方法为核心,工具为可替换示例;「工具准备」按模板给跨 OS 安装命令
- validate.mjs:frontmatter `name`=目录名、`description` 非空、`type: atomic` 必含「## 工具准备」、`[[链接]]` 必须解析(技能目录或 references/*.md)
- 工作区有 3 个未提交修改(re-binary-core / re-mobile / re-protocol 的 SKILL.md)——**各任务 commit 只 `git add` 本任务列出的文件,严禁 `git add -A`**;本计划不涉及这 3 个文件
- 当前分支 `main`;提交信息按仓库惯例(feat:/增强:/docs:)
- 新技能创建后 `npm test` 预期输出 `OK: 91 skills validated`
---
### Task 1: 创建 re-python 技能
**Files:**
- Create: `.claude/skills/re-python/SKILL.md`
**Interfaces:**
- Consumes: 无(新目录)
- Produces: 技能目录 `re-python`(validate 的 knownSkills 新增,供 Task 3 的 [[re-python]] 链接解析;计数 89 → 90)
- [ ] **Step 1: 创建目录与 SKILL.md**
```bash
mkdir -p .claude/skills/re-python
```
写入 `.claude/skills/re-python/SKILL.md`:
````markdown
---
name: re-python
type: atomic
description: >
Python 打包/混淆样本分析:PyInstaller/PyArmor/Nuitka/Cython 解包、pyc 版本识别与反编译。
触发词:Python打包、PyInstaller、PyArmor、pyc、python exe、Python 样本、打包样本。
---
# Python 打包样本分析(PyInstaller / PyArmor / pyc)
## 何时使用 / 何时不用
- 用:PyInstaller 单文件/目录 exe、PyArmor 加固样本、.pyc 文件、Nuitka/Cython 编译产物、Python 恶意软件打包样本
- 不用:纯 .py 源码混淆(base64/编码包装)→ 转 [[re-script-deob]];Python 模型权重(pkl/onnx)→ [[re-ai-model]]
## 工具准备
### python3(基础运行时,必备)
- Linux: `apt install python3` / `dnf install python3` / `pacman -S python`
- macOS: `brew install python`(系统自带)
- Windows: 官网安装包或 `choco install python`
- 验证: `python3 --version`
### pyinstxtractor(PyInstaller 归档提取)
- 多平台: `pip install pyinstxtractor-ng` 或 GitHub 脚本 `python pyinstxtractor.py`
- 验证: `pyinstxtractor-ng <目标.exe>` 运行无报错(无独立 --help 命令)
### PyArmor-Unpacker(PyArmor 加固解包)
- 多平台: `git clone https://github.com/Svenskithesource/PyArmor-Unpacker`,按 README 按 PyArmor 版本选三方法之一
- 验证: 仓库内 python 脚本可运行
### pycdc / pycdas(pyc 反编译)
- Linux/macOS: `git clone https://github.com/zrax/pycdc && cd pycdc && cmake . && make`
- Windows: 预编译二进制或 WSL 编译
- 验证: `./pycdc --help`
### file(打包器识别辅助,通用)
- 各系统自带(Linux binutils / macOS / Windows 需额外装或跳过)
- 验证: `file --version`
## 操作步骤
按顺序执行,每步产物存档(路径 + sha256,见 [[re-triage]])。
1. **识别打包器**:
```sh
file sample.exe
strings sample.exe | grep -iE 'PyInstaller|_MEIPASS|pyi-|PyArmor|pyarmor' | head
```
- PyInstaller 特征:`PyInstaller` 版本串、`_MEI` 临时目录名、`pyi-` 前缀引导器
- PyArmor 特征:`pyarmor` runtime 字符串
- Nuitka/Cython:无 pyc、纯编译产物(`file` 显示普通可执行,无 Python runtime 打包特征)
- 识别失败但确认 Python 相关 → 按可疑 PyInstaller 处理
2. **PyInstaller 解包**:
```sh
python pyinstxtractor.py sample.exe
# 输出 sample.exe_extracted/ 目录,含 PYZ-00.pyz(依赖归档)与主脚本 .pyc
```
- 定位主 .pyc(名字与入口脚本对应);PYZ 内模块自动解出至 `PYZ-00.pyz_extracted/`;模块清单可用 archive_viewer.py 查看
3. **PyArmor 解包**(步骤 1 检测到 PyArmor 时):
- 按 PyArmor 版本选 PyArmor-Unpacker 三方法之一(README 判断版本 → 对应方法)
- 解包产物仍为 pyc 或源码,继续下一步
4. **pyc 版本识别**:
```sh
python3 -c "import struct,sys; print(struct.unpack('<H', open('main.pyc','rb').read(2))[0])"
```
- magic 对照(小端 2 字节,常见值;以本机 MAGIC_NUMBER 为准):
- `0d33`=3.6、`0d42`=3.7、`0d55`=3.8、`0d61`=3.9、`0d6f`=3.10、`0dcb`=3.11
- 3.12+:不写死数值,按本机 MAGIC_NUMBER 换算(`python3 -c "import importlib.util; print(hex(int.from_bytes(importlib.util.MAGIC_NUMBER[:2],'little')))"`)
- 版本匹配目标则用对应版本 python 或 pycdc 反编译;不匹配先装匹配版本再试
5. **反编译与清理**:
```sh
pycdc main.pyc > main_decompiled.py # 或匹配版本 python 的 dis 模块
```
- 清理 confusion code:删假函数/死代码(PyArmor 常见的无引用包装函数),定位核心逻辑(加密/网络/外泄)
- 反编译失败(版本不匹配/混淆)→ 用 `dis` 字节码级分析关键函数,或转 [[re-binary-core]] 深度还原
## 跨域联合
- [[re-managed]] 网关:本技能归属(选择树「Python 打包样本」分支)
- [[re-script-deob]]:纯脚本混淆(无打包)场景
- [[re-malware]]:恶意 Python 样本的行为验证与 IOC(解包后转行为分析)
- [[re-binary-core]]:pyc 深度还原 / 混合产物(内嵌 native 模块 [[re-format-elf]])
- 底座 [[re-triage]]:打包器识别的初勘输入
## 常见坑与陷阱
- **pyc 版本不匹配直接反编译失败**:现象——pycdc 输出乱码或报错;原因——magic 版本与目标不符;对策——先做步骤 4 的 magic 识别,按版本选工具
- **PyArmor 版本差异导致解包器失效**:现象——PyArmor-Unpacker 报不支持;原因——PyArmor 版本过新/过旧;对策——按版本换方法,或手动定位 runtime 的加解密逻辑(转 [[re-binary-core]])
- **Cython/Nuitka 无 pyc**:现象——找不到 .pyc;原因——编译型产物;对策——直接分析产物([[re-format-elf]] / [[re-ghidra]]),不找 pyc
- **假函数干扰定位**:现象——解包后源码充斥无引用包装函数;原因——PyArmor 的 confusion code;对策——先按调用关系过滤(无调用者即候选),再定位核心逻辑
- **strings 找打包器特征被加密隐藏**:现象——strings 无 PyInstaller 特征但行为是 Python;原因——字符串加密/壳;对策——按行为线索与扩展名判断,必要时动态侧([[re-sandbox]])观察
````
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 91 skills validated`(re-python 计入;[[链接]] 全部指向已存在技能)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-python/SKILL.md
git commit -m "feat: re-python 技能——PyInstaller/PyArmor 解包与 pyc 识别"
```
---
### Task 2: 创建 re-frida-script-author 技能
**Files:**
- Create: `.claude/skills/re-frida-script-author/SKILL.md`
**Interfaces:**
- Consumes: 无(新目录)
- Produces: 技能目录 `re-frida-script-author`(供 Task 3 的 [[re-frida-script-author]] 链接解析;计数 90 → 91);引用 [[frida-scripts]](re-frida 的 references,已存在)
- [ ] **Step 1: 创建目录与 SKILL.md**
```bash
mkdir -p .claude/skills/re-frida-script-author
```
写入 `.claude/skills/re-frida-script-author/SKILL.md`:
````markdown
---
name: re-frida-script-author
type: atomic
description: >
Frida 脚本生成方法论:目标特征 → 模板选择 → 改写 → 验证。独立于执行插桩(re-frida)。
触发词:生成Frida脚本、写hook脚本、frida脚本怎么写、写个hook、脚本生成。
---
# Frida 脚本生成
## 何时使用 / 何时不用
- 用:需要新脚本时——拦截(加密/网络/文件)、绕过(检测/固定)、追踪(JNI/方法调用)
- 不用:执行现成脚本 → 转 [[re-frida]];反检测对抗面分析 → [[anti-dynamic-workflow]]
## 工具准备
### frida-tools(脚本编写与运行验证)
- Linux: `pip install frida-tools`(或 `apt install frida-tools` / `pacman -S frida`)
- macOS: `pip install frida-tools` / `brew install frida`
- Windows: `pip install frida-tools` / `choco install frida`
- 验证: `frida --version`、`frida-ps -U`(连设备后)
### python3(配合脚本调试)
- 各平台同 [[re-python]] 工具准备
### 目标设备/模拟器
- Android 真机/模拟器 + frida-server(安装见 [[re-frida]] 工具准备);桌面目标直接本机
## 操作步骤
按「探 → 选 → 改 → 验」四步,先探后写,不猜:
1. **目标侦察**:
- 静态:目标包名/类名/关键 API([[re-apk]] jadx 输出)、加固商特征([[re-mobile-pack]])、Flutter/RN 混合结构([[re-hybrid-app]])
- 动态基线:原样跑一次抓崩溃(崩溃特征 → 保护机制对照,见 [[anti-dynamic-workflow]])
- 产出:目标特征清单(检测点/目标 API/输入输出形态)
2. **模板选择**:按特征清单对照 [[frida-scripts]] 模板表:
| 目标特征 | 模板 |
|---|---|
| HTTPS 抓包被 TLS 加密(BoringSSL) | TLS 密钥日志(SSLKEYLOGFILE) |
| 证书固定挡抓包 | SSL 固定绕过(TrustManager/CertificatePinner) |
| 加密算法/密钥要提取 | 加密拦截(Cipher/SecretKeySpec 全 overload) |
| 加固/运行时解密 | DEX dump(类加载点)/ SO dump |
| 双向 TLS 客户端证书 | keystore p12 导出 |
| JNI 动态注册要还原 | RegisterNatives + 汇聚点双 hook |
| 反调试/检测拦截 | 检测绕过表(root/属性/文件/命令) |
3. **改写**:
- 替换占位符:包名/类名/方法名(精确匹配,Java 全限定名)
- overload 精确匹配:目标方法多 overload 时逐一定义或按参数类型选
- 保存 original 引用、带原 `this` 调用;输出 JSON(可打印 ASCII + hex 双格式)
- 同一类多 hook 合并进一个 `.implementation`(缓存静默覆盖)
4. **验证**:
```sh
frida -U -f <pkg> -l script.js --pause # spawn + 停在早期代码前
```
- 输出 JSON 可解析、目标行为符合预期(拦截到目标调用/绕过生效)
- 失败 → 回步骤 2 重选模板或细化特征;崩溃 → 按 [[anti-dynamic-workflow]] 崩溃对照表定位
## 跨域联合
- [[re-frida]]:脚本执行(本技能产出 → re-frida 运行)
- [[re-mobile]] / [[re-android-native]]:移动目标场景衔接
- [[anti-dynamic-workflow]]:检测面与崩溃迭代法
- [[frida-scripts]]:模板素材库(re-frida references)
- [[analysis-contract]]:脚本输出按数据契约消费(证据存档)
## 常见坑与陷阱
- **overload 不匹配静默失效**:现象——hook 无输出;原因——目标方法 overload 签名与定义不符;对策——先 `Java.use(...).<method>.overloads` 列出全部重载再选
- **Java.use 缓存覆盖**:现象——多个 hook 只生效最后一个;原因——同类多次 `.implementation` 赋值静默覆盖;对策——合并进一个 hook
- **参数索引版本相关**:现象——native 参数读错;原因——目标版本字段/参数位次变化;对策——对照目标符号核实,不照搬经验值
- **不侦察就写脚本**:现象——脚本对不上目标;原因——跳过步骤 1;对策——先探后写
- **绕过类脚本只观察不持久化**:现象——测试后目标状态被改;原因——脚本含写操作;对策——脚本只做读取/日志,绕过仅用于观察
## 使用注意
- 全部在沙箱内执行([[platform-tips]] 最高原则)
- 输出 JSON 供 [[analysis-contract]] 数据契约消费
````
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 91 skills validated`([[frida-scripts]] / [[anti-dynamic-workflow]] 等链接全部解析)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-frida-script-author/SKILL.md
git commit -m "feat: re-frida-script-author 技能——目标特征到 Frida 脚本的生成方法论"
```
---
### Task 3: 网关挂载(re-managed / re-frida)
**Files:**
- Modify: `.claude/skills/re-managed/SKILL.md`(选择树加 re-python 分支)
- Modify: `.claude/skills/re-frida/SKILL.md`(跨域联合加 re-frida-script-author 引用)
**Interfaces:**
- Consumes: Task 1 的 `re-python`、Task 2 的 `re-frida-script-author`(链接可解析)
- Produces: 两个新技能在网关层的可达性
- [ ] **Step 1: re-managed 选择树加分支**
在 `.claude/skills/re-managed/SKILL.md` 的 `.ps1 / .docm ...(脚本或宏)` 分支行之后插入:
```markdown
- **Python 打包样本(.exe 含 PyInstaller/PyArmor 特征 / .pyc / python 打包)** → [[re-python]](pyinstxtractor 解包、PyArmor-Unpacker、pyc 反编译;纯脚本混淆转 [[re-script-deob]])
```
- [ ] **Step 2: re-frida 跨域联合加引用**
在 `.claude/skills/re-frida/SKILL.md` 的「## 跨域联合」节追加一行:
```markdown
- 脚本生成:目标特征 → 模板选择 → 改写验证 → [[re-frida-script-author]](模板素材 [[frida-scripts]])
```
- [ ] **Step 3: 结构校验**
Run: `npm test`
Expected: `OK: 91 skills validated`,无 FAIL
- [ ] **Step 4: Commit**
```bash
git add .claude/skills/re-managed/SKILL.md .claude/skills/re-frida/SKILL.md
git commit -m "增强: re-managed/re-frida 挂载 re-python 与 re-frida-script-author"
```
---
### Task 4: Keystore 审计 + Flutter channel 并入
**Files:**
- Modify: `.claude/skills/re-android-native/SKILL.md`(加「## Keystore 审计」章节)
- Modify: `.claude/skills/re-hybrid-app/SKILL.md`(加「## Flutter MethodChannel 动态拦截」章节)
**Interfaces:**
- Consumes: 无(纯章节新增)
- Produces: 两技能的动态分析能力补全;引用 [[re-frida]] / [[anti-dynamic-workflow]] / [[analysis-contract]](均已存在)
- [ ] **Step 1: re-android-native 加 Keystore 审计章节**
在 `.claude/skills/re-android-native/SKILL.md` 的「## 跨域联合」标题之前插入:
```markdown
## Keystore 审计
Android 密钥体系分析——目标密钥来自 AndroidKeyStore 时 `getEncoded()` 不可用(硬件背书),须走审计:
- **遍历**:`KeyStore.getInstance("AndroidKeyStore")` → `aliases()` 枚举全部条目
- **条目属性**:算法(AES/RSA/EC)、用途(encrypt/decrypt/sign/verify)、来源(`KeyInfo.isInsideSecureHardware`——TEE 与 StrongBox 区分)
- **生物绑定**:`setUserAuthenticationRequired` 的密钥在认证失败时不可用(绕过与检测见 [[anti-dynamic-workflow]])
- **与 hook 衔接**:加密拦截([[re-frida]] 的 [[frida-scripts]])时密钥来自 Keystore → 记录别名与用途,不记录密钥字节
```
- [ ] **Step 2: re-hybrid-app 加 Flutter channel 章节**
在 `.claude/skills/re-hybrid-app/SKILL.md` 的「## 跨域联合」标题之前插入:
```markdown
## Flutter MethodChannel 动态拦截
Flutter 平台通道(PlatformChannel)是 Dart ↔ native 通信主干,拦截可观察全部原生能力调用:
- **Java/Kotlin 侧**:hook `io.flutter.plugin.common.MethodChannel` 的 MethodCallHandler——记录 channel 名 / 方法名 / 参数 JSON
- **engine messenger 层**:`io.flutter.embedding.engine.FlutterEngine` 的 messenger 消息(低层兜底)
- **与 Dart 侧静态观察互补**:静态找 channel 名与调用点(字符串字面量),动态确认实际流量
- **输出**:结构化 JSON(channel / method / args),供 [[analysis-contract]] 数据契约消费(证据存档)
```
- [ ] **Step 3: 结构校验**
Run: `npm test`
Expected: `OK: 91 skills validated`,无 FAIL
- [ ] **Step 4: Commit**
```bash
git add .claude/skills/re-android-native/SKILL.md .claude/skills/re-hybrid-app/SKILL.md
git commit -m "增强: Keystore 审计(re-android-native)+ Flutter MethodChannel 拦截(re-hybrid-app)"
```
---
### Task 5: svc 裸系统调用检测并入 anti-dynamic-workflow
**Files:**
- Modify: `.claude/skills/re-analyze/references/anti-dynamic-workflow.md`(追加「### 裸系统调用检测」节)
**Interfaces:**
- Consumes: 无
- Produces: 通用对抗工作流的检测面补全([[anti-dynamic-workflow]] 已是全库引用目标)
- [ ] **Step 1: 追加章节**
在 `.claude/skills/re-analyze/references/anti-dynamic-workflow.md` 的「## 高频检测面清单」节之后、`## 实现教训` 节之前插入:
```markdown
## 裸系统调用检测
目标自实现系统调用(绕过 libc)时,基于 libc 符号的 hook 与检测全部失效——svc 指令级捕获:
- **架构分支**:arm64 SYS_OPEN=56、svc 机器码 `01 00 00 D4`;arm SYS_OPEN=5、`00 00 00 EF`
- **手法**:遍历可执行段(r-x)过滤 .so → 特征码扫描命中 → 回读 svc 前一条指令取系统调用号(arm64 读 `mov x8` 立即数位、arm 读 r7)→ 系统调用号等于目标(如 SYS_OPEN)才 attach → 打印文件名与返回值
- **注意**:arm64 参数索引按系统调用约定核对(open 路径参数在 x0,不照搬经验值);系统调用号表按目标内核/Android 版本核对
```
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 91 skills validated`,无 FAIL
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-analyze/references/anti-dynamic-workflow.md
git commit -m "增强: 裸系统调用检测(svc 指令级)并入通用动态对抗工作流"
```
---
### Task 6: 计数同步(README / AGENTS / marketplace)
**Files:**
- Modify: `README.md`(技能导航 89→91、「12 大类网关 → 76 原子技能」→78、re-managed 行加 re-python、re-mobile 行加 re-frida-script-author)
- Modify: `AGENTS.md`(「(89 个技能)」→「(91 个技能)」)
- Modify: `.claude-plugin/marketplace.json`(description「89 个技能」→「91 个技能」)
**Interfaces:**
- Consumes: Task 1/2 的技能目录(计数 89 → 91)
- Produces: 文档一致性(validate.mjs 不校验这三文件,人工 grep 验证)
- [ ] **Step 1: README.md 三处修改**
`README.md`:
- `## 技能导航(89)` → `## 技能导航(91)`
- `入口 → 12 大类网关 → 76 原子技能` → `入口 → 12 大类网关 → 78 原子技能`
- `- **re-managed**:re-dotnet、re-java、re-script-deob、re-wasm、re-ai-model、re-blockchain` → `- **re-managed**:re-dotnet、re-java、re-script-deob、re-wasm、re-ai-model、re-blockchain、re-python`
- `- **re-mobile**:re-apk、re-ios、re-frida、re-mobile-pack、re-hybrid-app、re-android-native、re-ios-jb` → `- **re-mobile**:re-apk、re-ios、re-frida、re-frida-script-author、re-mobile-pack、re-hybrid-app、re-android-native、re-ios-jb`
- [ ] **Step 2: AGENTS.md / marketplace.json 修改**
`AGENTS.md` 第 3 行:`(89 个技能)` → `(91 个技能)`
`.claude-plugin/marketplace.json` 第 6 行:`"description": "通用逆向工程技能库:89 个技能(...)"` 中 `89` → `91`
- [ ] **Step 3: 校验**
Run: `npm test`
Expected: `OK: 91 skills validated`
Run: `grep -c "re-python\|re-frida-script-author" README.md`
Expected: ≥ 2
- [ ] **Step 4: Commit**
```bash
git add README.md AGENTS.md .claude-plugin/marketplace.json
git commit -m "docs: 计数同步 89→91(re-python / re-frida-script-author 入导航)"
```

View File

@@ -0,0 +1,185 @@
# 中途再路由机制 实现计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 建立「中途再路由」机制——分析中证据特征出现即触发对应技能、网关完成必查、未命中按约束换路,解决「走完入口不再调用技能」的痛点。
**Architecture:** 新建 `re-analyze/references/rerouting.md`(证据→技能触发表,A/B 双表)+ re-analyze 第三步改双轨强制 + 两个引用点(analysis-contract / triage)统一指向。无新技能,91 技能不变。
**Tech Stack:** Markdown / validate.mjs(npm test,现有)
## Global Constraints
- **红线 1 呈现中性**:禁用「最推荐」「强烈建议」等最高级强推措辞
- **红线 2 隐私脱敏**:内容不指向具体项目/公司/产品
- validate.mjs:references/*.md 文件名(去扩展名)为合法 [[链接]] 目标;SKILL.md 正文 [[链接]] 必须可解析
- rerouting.md 的 [[链接]] 全部指向已存在技能(re-cpp-abi 未建——该行用文字标注「(re-cpp-abi 待建,先走 [[re-binary-core]])」,**不写 [[re-cpp-abi]] 死链**)
- 工作区有 4 个未提交修改(re-binary-core / re-mobile / re-protocol 的 SKILL.md、README.md)——**各任务 commit 只 `git add` 本任务列出的文件,严禁 `git add -A`**;本计划不涉及这 4 个文件
- 当前分支 `main`;`npm test` 预期 `OK: 91 skills validated`
---
### Task 1: 创建 rerouting.md 触发表
**Files:**
- Create: `.claude/skills/re-analyze/references/rerouting.md`
**Interfaces:**
- Consumes: 无(新 references 文件)
- Produces: references 目标 `rerouting`(validate 的 knownRefs 收录,供 Task 2/3 的 [[rerouting]] 链接解析)
- [ ] **Step 1: 创建 rerouting.md**
写入 `.claude/skills/re-analyze/references/rerouting.md`:
````markdown
# 中途再路由触发表
运行时证据触发的唯一事实源(区别于 triage.md 的入口「目标→路径」决策表)。分析过程中按双轨使用:
- **轨 1(网关完成必查)**:每网关完成后对照 A/B 表检查新证据
- **轨 2(证据出现即查)**:每产出新证据类型(字符串/节表/行为/加密特征)立即对照 A 表
- **未命中** → 按 B 表约束行动,禁止自行硬琢磨
## A 表:证据特征 → 触发技能
| 证据特征(分析中看到) | 触发技能 |
|---|---|
| 节表异常(UPX0/.aspack)、熵 >7.0 | [[re-packer-id]] → [[re-anti-analysis]] |
| 未知加密算法、S-box/常量指纹、加密流量 | [[re-crypto-id]] |
| 硬编码密钥/口令、内存中的 key | [[re-crypto-keys]] |
| 解密函数已定位、密文可还原 | [[re-crypto-decrypt]] |
| 反调试/反 VM 特征(ptrace、CPUID、时间检测) | [[re-evasion]] / [[re-anti-analysis]] |
| 动态注册 JNI、so 函数级加密 | [[re-android-native]] |
| 混淆(CFF/花指令/字符串加密) | [[re-deobfuscate]] |
| 网络回连/信标/C2 特征 | [[re-netcap]] → [[re-behavior]] |
| 持久化/注入/进程树异常 | [[re-behavior]] |
| 崩溃/段错误/ASAN 报告 | [[re-crash-triage]] |
| Python 打包特征(PyInstaller/PyArmor) | [[re-python]] |
| Flutter/RN 引擎特征 | [[re-hybrid-app]] |
| 加固商特征(加固壳) | [[re-mobile-pack]] |
| RTTI/异常表(.pdata/.xdata)密集 | (re-cpp-abi 待建,先走 [[re-binary-core]]) |
## B 表:卡住信号 → 换路
| 卡住信号 | 换路 |
|---|---|
| 同参数重复 ≥2 次无新证据 | 对照 A 表重查 / 换工具视角([[analysis-contract]] 调查预算) |
| 单命令 ≥3 次无进展 | 停下评估,重跑 re-analyze 第二步(任务识别)或换网关 |
| 分析超 30 次工具调用无结论 | 回退到最近有产出的环节,按 [[analysis-contract]] 复核格式交付部分结论 |
| 目标行为与静态结论矛盾 | 动态侧 [[re-sandbox]] / [[re-tracing]] 对照 |
## 使用规则
1. 每产出新证据类型 → 查 A 表,命中即调用对应技能,完成后回到轨 1 继续
2. 每网关完成 → 查 A+B 表
3. 未命中任何表项 → 按 B 表约束行动(换思路/回退/交付部分结论)
````
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 91 skills validated`(references 文件不校验正文链接,但保持全部链接有效;[[re-netcap]]→[[re-behavior]] 等箭头链接为文字序列,非 [[死链]])
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-analyze/references/rerouting.md
git commit -m "feat: rerouting 中途再路由触发表(A 证据→技能 / B 卡住→换路)"
```
---
### Task 2: re-analyze 第三步改双轨强制 + 常见坑
**Files:**
- Modify: `.claude/skills/re-analyze/SKILL.md`(第三步编排分派段落改双轨;常见坑追加一条)
**Interfaces:**
- Consumes: Task 1 的 `rerouting`([[rerouting]] 链接可解析)
- Produces: 入口级双轨强制机制(第三步 + 常见坑)
- [ ] **Step 1: 第三步段落改双轨**
`.claude/skills/re-analyze/SKILL.md` 现状(第三步段落):
```
调用对应大类网关技能(`[[re-binary-core]]` `[[re-malware]]` `[[re-firmware]]` `[[re-protocol]]` `[[re-mobile]]` `[[re-anti-analysis]]` `[[re-cracking]]` `[[re-vuln]]` `[[re-ctf]]` `[[re-managed]]` `[[re-forensics]]`),网关内部自行选择原子技能。每个环节完成后检查新证据,必要时回退调整路径(见 triage.md 复合任务示例)。
```
改为(在原文后追加双轨段,原文保留):
```
调用对应大类网关技能(`[[re-binary-core]]` `[[re-malware]]` `[[re-firmware]]` `[[re-protocol]]` `[[re-mobile]]` `[[re-anti-analysis]]` `[[re-cracking]]` `[[re-vuln]]` `[[re-ctf]]` `[[re-managed]]` `[[re-forensics]]`),网关内部自行选择原子技能。每个环节完成后检查新证据,必要时回退调整路径(见 triage.md 复合任务示例)。
**双轨再路由(强制,见 [[rerouting]])**:
- 轨 1(网关完成必查):每网关完成后,对照 [[rerouting]] 的 A/B 表检查新证据;命中 → 调用对应技能,完成后回到轨 1 继续
- 轨 2(证据出现即查):分析中每产出新证据类型(字符串/节表/行为/加密特征),立即对照 A 表;命中 → 调用技能
- 未命中任何表项 → 按 B 表约束行动(换思路/回退/交付部分结论),禁止自行硬琢磨
```
- [ ] **Step 2: 常见坑追加一条**
`.claude/skills/re-analyze/SKILL.md` 常见坑末尾(「自挖前先搜社区逆向成果」条之后)追加:
```
- **走完入口不再调用技能**:现象——入口编排后自己硬琢磨,中途发现新特征(壳/加密/反调试)不调对应技能;原因——再路由未执行;对策——按第三步双轨:每网关完成/每新证据对照 [[rerouting]] 触发表,命中即调
```
- [ ] **Step 3: 结构校验**
Run: `npm test`
Expected: `OK: 91 skills validated`([[rerouting]] 解析成功,无 FAIL)
- [ ] **Step 4: Commit**
```bash
git add .claude/skills/re-analyze/SKILL.md
git commit -m "增强: re-analyze 第三步双轨再路由强制(网关完成必查 + 证据出现即查)"
```
---
### Task 3: 两个引用点统一指向 rerouting
**Files:**
- Modify: `.claude/skills/re-analyze/references/analysis-contract.md`(加引用行)
- Modify: `.claude/skills/re-analyze/references/triage.md`(第 31 行改指向)
**Interfaces:**
- Consumes: Task 1 的 `rerouting`(链接可解析)
- Produces: 触发表唯一事实源的全库指向
- [ ] **Step 1: analysis-contract.md 加引用行**
`.claude/skills/re-analyze/references/analysis-contract.md` 的「分析全流程遵守本契约」段(首段)末尾追加一行:
```markdown
中途再路由:证据触发按 [[rerouting]] 双轨执行(轨 1 网关完成必查 / 轨 2 证据出现即查),命中即调对应技能。
```
- [ ] **Step 2: triage.md 第 31 行改指向**
`.claude/skills/re-analyze/references/triage.md` 现状第 31 行:
```
- 每个环节完成后检查是否有新证据改变后续路径(如动态分析发现加壳 → 回退 re-anti-analysis)。
```
改为:
```
- 每个环节完成后检查是否有新证据改变后续路径(如动态分析发现加壳 → 回退 re-anti-analysis)。中途再路由统一按 [[rerouting]] 双轨执行(证据触发 / 网关完成必查)。
```
- [ ] **Step 3: 结构校验**
Run: `npm test`
Expected: `OK: 91 skills validated`,无 FAIL
- [ ] **Step 4: Commit**
```bash
git add .claude/skills/re-analyze/references/analysis-contract.md .claude/skills/re-analyze/references/triage.md
git commit -m "增强: analysis-contract/triage 统一指向 rerouting 触发表"
```

View File

@@ -0,0 +1,281 @@
# 7 处融入 实现计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 7 处章节融入现有技能(re-blockchain / re-automotive / re-script-deob / re-forensics / re-exploit / re-tracing / re-disk-forensics),技能总数 97 不变。
**Architecture:** 纯技能文档扩展。每处融入 = 在目标技能「## 跨域联合」标题前插入一个「## 章节」(按 docs/skill-template.md 体例),章节全文在本计划中给出。
**Tech Stack:** Markdown / validate.mjs(npm test,现有)
## Global Constraints
- **红线 1 呈现中性**:禁用「最推荐」「强烈建议」等最高级强推措辞
- **红线 2 隐私脱敏**:内容不指向具体项目/公司/产品
- **不绑定具体工具**:方法为核心,工具为可替换示例
- validate.mjs:SKILL.md 正文 `[[链接]]` 必须可解析(技能目录或 references/*.md)
- 工作区有 3 个未提交修改(re-binary-core / re-mobile / re-protocol 的 SKILL.md)——**各任务 commit 只 `git add` 本任务列出的文件,严禁 `git add -A`**;本计划 7 个融入目标技能均为干净文件
- 当前分支 `main`;`npm test` 预期全程 `OK: 97 skills validated`
---
### Task 1: re-blockchain 融入「非 EVM 链」
**Files:**
- Modify: `.claude/skills/re-blockchain/SKILL.md`(「## 跨域联合」标题前插入章节)
**Interfaces:**
- Consumes: 无
- Produces: re-blockchain 的非 EVM 覆盖(Solana BPF / Move)
- [ ] **Step 1: 插入章节**
在 `.claude/skills/re-blockchain/SKILL.md` 的「## 跨域联合」标题之前插入:
```markdown
## 非 EVM 链(Solana / Move)
流程与 EVM 同构(字节码反编译 → 漏洞分析),指令集与资源模型不同——先识别运行时,再按对应路径走。
- **Solana(BPF 字节码)**:识别特征——ELF 文件 + .text 段为 BPF 指令(eBPF 类指令集);反编译路径——`llvm-objdump -d`(BPF 反汇编)或专用反编译器;分析重点——程序账户与指令调度(CPI 跨程序调用链)、账户数据布局(结构体偏移)
- **Sui / Aptos(Move 字节码)**:识别特征——模块/资源/函数表结构;反编译——move disassembler(`move disassemble`);分析重点——资源模型(对象/能力)对漏洞面的影响(转账/所有权逻辑)、模块依赖图
- **DeFi/NFT 场景**:池子合约(AMM 常量积公式)、代币标准变体(SPL 等)、授权与提现逻辑定位
- 漏洞分析承接:逻辑漏洞(重入/权限)沿用 EVM 思路,资源/账户模型差异处单独判断
```
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 97 skills validated`(章节内 [[链接]] 无;如含需确认指向已存在技能)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-blockchain/SKILL.md
git commit -m "增强: re-blockchain 融入非 EVM 链(Solana BPF / Move 字节码)"
```
---
### Task 2: re-automotive 融入「IVI / T-Box / V2X 路径」
**Files:**
- Modify: `.claude/skills/re-automotive/SKILL.md`(「## 跨域联合」标题前插入章节)
**Interfaces:**
- Consumes: 无
- Produces: re-automotive 的车联网覆盖(IVI / T-Box / V2X 分流)
- [ ] **Step 1: 插入章节**
在 `.claude/skills/re-automotive/SKILL.md` 的「## 跨域联合」标题之前插入:
```markdown
## IVI / T-Box / V2X 路径
按目标形态分流(判定规则):
- **IVI(车载娱乐系统)**:本质是 Android/Linux 系统——应用层走 [[re-apk]],系统镜像走 [[re-firmware]];关注 OEM 定制层(启动器、诊断接口、ADB/调试口)
- **T-Box(远程信息处理箱)**:蜂窝模组(AT 指令接口)、MCU 固件([[re-fw-extract]] 提取分析)、远程控制协议(车控指令——门锁/空调/启动,走 [[re-protocol]])
- **V2X(车联网通信)**:DSRC / C-V2X 帧结构 → [[re-protocol]] / [[re-ics]] 路径(协议状态机重建、PC5/Uu 接口区分)
- 判定规则:应用层 → 移动/系统路径([[re-apk]] / [[re-firmware]]);通信层 → 协议路径([[re-protocol]] / [[re-ics]]);固件层 → 固件路径([[re-fw-extract]] / [[re-fw-rootfs]])
```
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 97 skills validated`([[re-apk]] / [[re-firmware]] / [[re-fw-extract]] / [[re-protocol]] / [[re-ics]] / [[re-fw-rootfs]] 均存在)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-automotive/SKILL.md
git commit -m "增强: re-automotive 融入 IVI/T-Box/V2X 路径分流"
```
---
### Task 3: re-script-deob 融入「高级混淆对抗」
**Files:**
- Modify: `.claude/skills/re-script-deob/SKILL.md`(「## 跨域联合」标题前插入章节)
**Interfaces:**
- Consumes: 无
- Produces: re-script-deob 的商业混淆器对抗覆盖
- [ ] **Step 1: 插入章节**
在 `.claude/skills/re-script-deob/SKILL.md` 的「## 跨域联合」标题之前插入:
```markdown
## 高级混淆对抗(商业混淆器)
JScrambler 类商业混淆器的手法与对抗:
- **特征识别**:bootstrap 加载器(自执行入口)、字符串表隐藏(数组 + 索引引用)、`_0x` 变量重命名模式、函数体加密(运行时解密)
- **控制流平坦化(CFF)对抗**:dispatcher 识别(switch 分发中心)→ 状态变量追踪 → 分支还原为顺序/条件结构(方法衔接 [[re-deobfuscate]])
- **字符串加密对抗**:隐藏字符串表定位(解码函数调用点)→ 运行时提取(沙箱内执行解码函数取值,见 [[re-sandbox]])或静态还原(解码循环脚本化)
- **死代码注入对抗**:无引用函数过滤(按调用关系,无调用者即候选删除)
- 工具链:js-beautify 美化 → 按手法选对抗路径;动态侧沙箱执行取值(默认沙箱原则)
```
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 97 skills validated`([[re-deobfuscate]] / [[re-sandbox]] 均存在)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-script-deob/SKILL.md
git commit -m "增强: re-script-deob 融入高级混淆对抗(商业混淆器)"
```
---
### Task 4: re-forensics 融入「容器镜像取证」
**Files:**
- Modify: `.claude/skills/re-forensics/SKILL.md`(「## 跨域联合」标题前插入章节)
**Interfaces:**
- Consumes: 无
- Produces: re-forensics 的云原生覆盖(容器镜像取证)
- [ ] **Step 1: 插入章节**
在 `.claude/skills/re-forensics/SKILL.md` 的「## 跨域联合」标题之前插入:
```markdown
## 容器镜像取证
- **镜像结构**:tar 归档 + 分层(每层 = 文件系统快照差异;`docker save` / `skopeo copy` 导出)
- **层提取**:解包层归档 → 逐层文件系统分析(复用 [[re-disk-forensics]] / [[re-fw-rootfs]] 的方法:文件枚举、删除文件恢复)
- **分析重点**:配置与密钥(环境变量、挂载点、entrypoint/CMD 脚本)、历史层残留(删除的文件在旧层仍可恢复)、恶意镜像判定(启动命令、网络行为、可疑二进制)
- **输出**:镜像内容清单 + 可疑项列表(与 [[re-ioc]] 的指标提取衔接)
```
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 97 skills validated`([[re-disk-forensics]] / [[re-fw-rootfs]] / [[re-ioc]] 均存在)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-forensics/SKILL.md
git commit -m "增强: re-forensics 融入容器镜像取证(分层提取与文件系统分析)"
```
---
### Task 5: re-exploit 融入「内核利用」
**Files:**
- Modify: `.claude/skills/re-exploit/SKILL.md`(「## 跨域联合」标题前插入章节)
**Interfaces:**
- Consumes: 无
- Produces: re-exploit 的内核利用覆盖(提权原语 / 堆喷 / UAF 路径)
- [ ] **Step 1: 插入章节**
在 `.claude/skills/re-exploit/SKILL.md` 的「## 跨域联合」标题之前插入:
```markdown
## 内核利用
与用户态同框架:fuzz([[re-fuzzing]])→ crash([[re-crash-triage]])→ 利用(本路径)。
- **提权原语**:modprobe_path 覆写(触发内核执行任意路径)、cred 结构覆写(uid/gid 置 0)、io_uring / BPF 子系统利用面
- **堆喷与对象布局**:堆喷策略(同尺寸对象占位)、对象重叠(UAF 后伪造对象)、SLUB 分配器行为(per-CPU 缓存)
- **内核 UAF 利用路径**:漏洞触发(悬垂引用)→ 对象重用(占位伪造)→ 控制流劫持(函数指针 / ops 表覆写)
- **环境**:调试内核(KASAN 开、KASLR 关闭或绕过)、gdb/kgdb 断点、模块化测试(只读分析 + 沙箱验证)
```
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 97 skills validated`([[re-fuzzing]] / [[re-crash-triage]] 均存在)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-exploit/SKILL.md
git commit -m "增强: re-exploit 融入内核利用(提权原语/堆喷/UAF 路径)"
```
---
### Task 6: re-tracing 融入「指令级追踪」
**Files:**
- Modify: `.claude/skills/re-tracing/SKILL.md`(「## 跨域联合」标题前插入章节)
**Interfaces:**
- Consumes: 无
- Produces: re-tracing 的指令级覆盖(QEMU 插件 / Intel PT)
- [ ] **Step 1: 插入章节**
在 `.claude/skills/re-tracing/SKILL.md` 的「## 跨域联合」标题之前插入:
```markdown
## 指令级追踪
比系统调用级更深一层——指令粒度执行流:
- **QEMU 插件**:`-plugin` 加载指令级 trace 插件(insn 粒度、call/ret 路径、guest 代码块事件);用途——脱壳后真实路径还原、反混淆(静态混淆无法隐藏实际执行)
- **Intel PT**:硬件 trace(`perf record -e intel_pt`)→ 解码(`perf script` 或第三方解析)→ 分支流还原;用途——无插桩开销的完整执行路径
- **trace 分析**:热点(执行频次排序)、路径还原(调用链重建)、与 [[re-deobfuscate]] 衔接(按真实路径过滤死代码)
- **输出**:指令级执行流摘要(供 [[analysis-contract]] 证据存档)
```
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 97 skills validated`([[re-deobfuscate]] / [[analysis-contract]] 均存在)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-tracing/SKILL.md
git commit -m "增强: re-tracing 融入指令级追踪(QEMU 插件/Intel PT)"
```
---
### Task 7: re-disk-forensics 融入「数据库文件格式」
**Files:**
- Modify: `.claude/skills/re-disk-forensics/SKILL.md`(「## 跨域联合」标题前插入章节)
**Interfaces:**
- Consumes: 无
- Produces: re-disk-forensics 的数据库文件覆盖(SQLite 结构 / WAL / 恢复)
- [ ] **Step 1: 插入章节**
在 `.claude/skills/re-disk-forensics/SKILL.md` 的「## 跨域联合」标题之前插入:
```markdown
## 数据库文件格式
- **SQLite 结构**:页头(page header 字段)、btree 页(interior/leaf 类型)、记录格式(varint 长度编码 / 类型码)、溢出页(大字段跨页)
- **WAL 恢复**:WAL 文件帧解析(未 checkpoint 的事务)、checkpoint 边界判定(恢复点)
- **取证应用**:浏览器/App 数据库——删除记录恢复(freelist 页残留)、未提交事务提取(WAL 内)
- **工具**:`sqlite3` CLI 只读模式(`sqlite3 -readonly`)、页级解析脚本(python 按页结构遍历)
```
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 97 skills validated`(章节内无 [[链接]] 或确认指向已存在技能)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-disk-forensics/SKILL.md
git commit -m "增强: re-disk-forensics 融入数据库文件格式(SQLite 页结构/WAL/恢复)"
```

View File

@@ -0,0 +1,768 @@
# 6 个新技能 实现计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 新增 6 个原子技能(re-doc-malware / re-variant / re-hunting / re-mobile-forensics / re-stego / re-browser-ext)+ 挂载同步,技能总数 101 → 107。
**Architecture:** 纯技能文档扩展。6 个新技能目录(SKILL.md,按 docs/skill-template.md 原子技能规范)+ 挂载(5 网关子技能/选择树、rerouting 3 行)+ 计数同步(README / AGENTS / marketplace)。
**Tech Stack:** Markdown / YAML frontmatter / validate.mjs(npm test,现有)
## Global Constraints
- **红线 1 呈现中性**:禁用「最推荐」「强烈建议」等最高级强推措辞
- **红线 2 隐私脱敏**:内容不指向具体项目/公司/产品
- **不绑定具体工具**:方法为核心,工具为可替换示例;「工具准备」按模板给跨 OS 安装命令
- validate.mjs:frontmatter `name`=目录名、`description` 非空、`type: atomic` 必含「## 工具准备」、`[[链接]]` 必须解析
- 工作区已干净(无未提交文件)——所有目标文件可正常修改提交;各任务 commit 只 `git add` 本任务列出的文件
- 当前分支 `main`;`npm test` 预期按任务标注递增(102 → 107)
---
### Task 1: 创建 re-doc-malware 技能
**Files:**
- Create: `.claude/skills/re-doc-malware/SKILL.md`
**Interfaces:**
- Consumes: 无(新目录)
- Produces: 技能目录 `re-doc-malware`(供 Task 7 的 [[re-doc-malware]] 链接解析;计数 101 → 102)
- [ ] **Step 1: 创建目录与 SKILL.md**
```bash
mkdir -p .claude/skills/re-doc-malware
```
写入 `.claude/skills/re-doc-malware/SKILL.md`:
````markdown
---
name: re-doc-malware
type: atomic
description: >
恶意文档分析:PDF/Office 武器化、宏链、文档漏洞利用、载荷提取。
触发词:恶意文档、钓鱼文档、PDF恶意、宏文档、docm、文档漏洞、恶意附件。
---
# 恶意文档分析
## 何时使用 / 何时不用
- 用:钓鱼附件(PDF/Office/RTF)、文档漏洞利用样本、宏文档、文档型恶意载荷
- 不用:纯脚本宏(转 [[re-script-deob]]);文档仅是载体(核心逻辑在下载载荷)
## 工具准备
### pdf-parser / peepdf(PDF 结构分析)
- Linux: `apt install pdf-parser` 或 `pip install peepdf`;macOS: `brew install pdf-parser` / pip
- Windows: pip(WSL 亦可)
- 验证: `pdf-parser --version`(无则 `python3 -m pdf_parser --help`)
### olevba / oledump(Office 宏提取)
- 多平台: `pip install oletools`
- 验证: `olevba --help`
### LibreOffice(沙箱打开验证,可选)
- Linux: `apt install libreoffice` / `dnf install libreoffice`;macOS: `brew install --cask libreoffice`;Windows: 官方安装包
- 验证: `libreoffice --version`
### 7z(OLE/OOXML 解包)
- Linux: `apt install p7zip-full`;macOS: `brew install sevenzip`;Windows: 官方安装包
- 验证: `7z --help`
## 操作步骤
按顺序执行;动态打开文档必须沙箱([[re-sandbox]],[[platform-tips]] 最高原则)。每步产物存档(路径 + sha256,见 [[re-triage]])。
1. **文档类型识别**:
```sh
file sample.pdf sample.docm sample.rtf
```
- PDF:`%PDF` 头;Office 旧格式:CFB(OLE 复合文档,`D0 CF 11 E0`);OOXML:zip(`PK`);RTF:`{\rtf`
- 类型决定后续工具链
2. **PDF 恶意分析**:
```sh
pdf-parser -f sample.pdf | head -50 # 对象树遍历(-f 强制,解 FlateDecode)
pdf-parser -s /JS sample.pdf # JavaScript 动作
pdf-parser -s /OpenAction sample.pdf # 打开即执行动作
```
- 恶意特征:`/JS`(JavaScript 动作)、`/OpenAction`(打开触发)、`/AA`(自动动作)、`/Launch`(外部程序)、嵌入文件(`/EmbeddedFile`)
- 漏洞文档:`/JBIG2Decode`(JBIG2 漏洞)、`/RichMedia`(Flash 遗留)等 CVE 对应结构——按结构特征对照已知利用模式
- JS 载荷 → [[re-script-deob]] 还原
3. **Office 分析**:
```sh
olevba -c sample.docm > macro.txt # 提取宏源码
olevba --decode -c sample.docm > macro_decoded.txt
strings sample.docm | grep -iE 'DDEAUTO|http|powershell' | head
```
- 宏链:AutoOpen / Workbook_Open / Document_Open / Auto_Open
- 其他向量:DDE 域(`DDEAUTO`)、外部链接(`/hyperlink`)、OLE 嵌入对象(7z 解包后逐个分析)、模板注入(`/word/_rels`)
- 宏载荷 → [[re-script-deob]] 去混淆链
4. **载荷提取**:
- 提取项:脚本/URL/二进制/多级载荷(每层存档编号)
- 指标提取 → [[re-ioc]](URL/域名/哈希)
- 提取物初勘 → [[re-triage]]
5. **动态验证**(沙箱):
- [[re-sandbox]] 内用 LibreOffice/阅读器打开,网络隔离(INetSim/fake DNS)
- 观察:文件释放、进程链、网络回连([[re-behavior]] 衔接)
## 跨域联合
- [[re-malware]] 网关:本技能归属(选择树「钓鱼附件」分支)
- [[re-script-deob]]:宏/JS 去混淆还原
- [[re-sandbox]]:动态打开强制前置
- [[re-ioc]]:提取指标
- [[re-behavior]]:行为验证衔接
## 常见坑与陷阱
- **PDF 对象流压缩未解**:现象——pdf-parser 输出无 `/JS`;原因——对象在 FlateDecode 压缩流内;对策——`-f` 强制解压再查
- **宏被混淆**:现象——olevba 提取后满屏拼接/编码;原因——宏混淆;对策——[[re-script-deob]] 去混淆链逐层解
- **文档漏洞版本特征**:现象——结构特征与已知 CVE 不符;原因——利用代码针对特定版本;对策——按结构特征(非版本号)对照利用模式,标注版本假设
- **沙箱检测文档(延迟执行)**:现象——沙箱内无行为;原因——文档检测环境后不触发;对策——延长观察窗口、模拟用户交互(滚动/点击)
- **模板注入易漏**:现象——宏正常但仍有外联;原因——`/word/_rels` 远程模板;对策——解包后检查全部 rels 文件
````
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 102 skills validated`([[链接]]:re-script-deob/re-sandbox/re-triage/re-ioc/re-behavior/re-malware/platform-tips 均存在)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-doc-malware/SKILL.md
git commit -m "feat: re-doc-malware 技能——PDF/Office 武器化分析与载荷提取"
```
---
### Task 2: 创建 re-variant 技能
**Files:**
- Create: `.claude/skills/re-variant/SKILL.md`
**Interfaces:**
- Consumes: 无(新目录)
- Produces: 技能目录 `re-variant`(供 Task 7 的 [[re-variant]] 链接解析;计数 102 → 103)
- [ ] **Step 1: 创建目录与 SKILL.md**
```bash
mkdir -p .claude/skills/re-variant
```
写入 `.claude/skills/re-variant/SKILL.md`:
````markdown
---
name: re-variant
type: atomic
description: >
二进制变体/补丁对比:函数匹配、N-day 补丁 diff、变体溯源与相似度分析。
触发词:二进制对比、补丁对比、N-day、变体分析、BinDiff、函数匹配、样本相似。
---
# 二进制变体/补丁对比
## 何时使用 / 何时不用
- 用:补丁前后对比(漏洞定位)、家族变体关联、样本溯源、N-day 分析
- 不用:单样本深度分析(走 [[re-binary-core]] 通用路径)
## 工具准备
### BinDiff / Diaphora(函数匹配插件)
- BinDiff: Windows 商业工具(安装指引,可替换为开源替代);Diaphora: 多平台开源(`git clone https://github.com/joxeankoret/diaphora`,IDA/Ghidra 插件)
- Ghidra 侧替代: BinDiff 官方 Ghidra 插件或 Diaphora 的 Ghidra 移植
- 验证: 插件在反编译器内可加载
### radiff2 / rz-diff(rizin 命令行对比)
- Linux: `apt install rizin` / `pacman -S rizin`;macOS: `brew install rizin`;Windows: 官方安装包
- 验证: `rz-diff --version`
### readelf(符号对齐辅助)
- 安装与验证见 [[re-cpp-abi]] 工具准备
## 操作步骤
按顺序执行,每步产物存档(路径 + sha256,见 [[re-triage]])。
1. **函数匹配**:
```sh
# 命令行快速对比(rizin 系):指令哈希 + 调用图相似度
rz-diff -ss sample_v1 sample_v2 | head -30
```
- 匹配维度:指令哈希(相同代码)、调用图(子图同构)、导入导出对齐、字符串/常量引用
- 工具(BinDiff/Diaphora)输出:matched / changed / new / deleted 函数集
- strip 后符号缺失:靠结构匹配(见坑 2)
2. **补丁 diff(N-day)**:
- 修复前后对比 → `changed` 函数集 = 漏洞点候选
- 变更函数深挖:新条件分支/新校验/新增调用([[re-ghidra]] / [[re-ida]] 反编译)
- 反推漏洞:旧代码的缺陷模式(缺失校验/越界/释放后使用)
- 产出:漏洞函数 + 缺陷模式推断(置信度标注)
3. **变体溯源**:
- 家族内样本两两对比 → 相似度矩阵 → 聚类(共享函数比例阈值)
- 演进链:按时间线/相似度排序样本(早期 vs 晚期变体)
- 共享独有函数 = 家族标志(与 [[re-attribution]] 能力证据衔接)
4. **输出差异清单**:
- 格式:变更函数表(函数名/地址/变更类型/相似度)+ 结论
- 按 [[analysis-contract]] 数据契约传递(下游消费)
## 跨域联合
- [[re-binary-core]] 网关:本技能归属(选择树「补丁/N-day 对比」分支)
- [[re-ghidra]] / [[re-ida]]:反编译底座(变更函数深挖)
- [[re-attribution]]:变体关联的能力证据衔接
- [[analysis-contract]]:差异清单按数据契约传递
## 常见坑与陷阱
- **编译器差异干扰匹配**:现象——同源码不同编译器编译被判不相似;原因——优化/代码生成差异;对策——用调用图与常量引用加权,降低指令哈希权重
- **strip 后符号缺失**:现象——函数名全无;原因——符号剥离;对策——结构匹配(入口特征/调用模式)、导入表锚定
- **跨架构对比降级**:现象——x86 vs ARM 匹配率低;原因——指令集不同;对策——只比逻辑层(调用图/常量/字符串),标注跨架构局限
- **大量相似导致误关联**:现象——共享库代码导致虚高相似度;原因——公共依赖(libc/框架);对策——排除共享库符号,只比业务代码
- **补丁 diff 定位偏差**:现象——changed 函数多,漏洞点被淹没;原因——补丁含重构;对策——按变更语义过滤(新增校验/边界处理优先)
````
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 103 skills validated`([[链接]]:re-binary-core/re-ghidra/re-ida/re-attribution/analysis-contract/re-triage/re-cpp-abi 均存在)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-variant/SKILL.md
git commit -m "feat: re-variant 技能——函数匹配/补丁 diff/变体溯源"
```
---
### Task 3: 创建 re-hunting 技能
**Files:**
- Create: `.claude/skills/re-hunting/SKILL.md`
**Interfaces:**
- Consumes: 无(新目录)
- Produces: 技能目录 `re-hunting`(供 Task 7 的 [[re-hunting]] 链接解析;计数 103 → 104)
- [ ] **Step 1: 创建目录与 SKILL.md**
```bash
mkdir -p .claude/skills/re-hunting
```
写入 `.claude/skills/re-hunting/SKILL.md`:
````markdown
---
name: re-hunting
type: atomic
description: >
威胁狩猎方法论:假设驱动、遥测源选择、基线对比与验证闭环。
触发词:威胁狩猎、狩猎、hunting、假设驱动、遥测分析、异常检测。
---
# 威胁狩猎
## 何时使用 / 何时不用
- 用:主动狩猎请求(「环境里有没有 X 的活动」)、假设驱动的环境排查
- 不用:已知样本分析([[re-behavior]]);IOC 查询([[re-ti]]);单点证据深挖(各域技能)
## 工具准备
### 日志分析工具(通用)
- 多平台: jq / grep / awk(各发行版自带或 `apt install jq` / `brew install jq`)
- 验证: `jq --version`
### 遥测查询(按环境)
- SIEM/EDR 查询接口(按部署环境给查询指引,工具不绑定)
- 本地日志: journalctl / Windows 事件日志工具(按平台)
### ATT&CK 导航(假设对齐参考)
- 网页工具(公开访问);本地可下载 Navigator 层文件
## 操作步骤
按顺序执行;假设明确再动手(坑 5)。每步产物存档(路径 + sha256,见 [[re-triage]])。
1. **狩猎假设生成**:
- 输入:威胁情报([[re-ti]])、已知攻击模式([[re-behavior]] 经验)、环境特征
- 假设句式:「攻击者可能通过 X 技术在环境内做了 Y」——X 对齐 ATT&CK 技术
- 产出:假设列表(每个假设 = 可证伪的搜索目标)
2. **遥测源选择**:
- 按假设选数据源:进程行为 → EDR/进程日志;网络 → 流量/防火墙日志;登录 → 认证日志;文件 → 文件系统监控
- 数据源缺失 → 标注盲区(结论的有效性边界)
3. **基线 vs 异常**:
- 基线:正常窗口的统计分布(频率/来源/目标特征)
- 异常检测:偏离基线的行为(新进程链、非常规时段、异常目标)、规则匹配(已知模式)
- 聚类:异常条目按特征聚类(减少人工逐个审查)
4. **验证闭环**:
- 命中确认:异常 → 深挖([[re-behavior]] 行为分析、[[re-variant]] 样本关联)
- 误报排除:白名单核对、环境解释(合法变更/维护窗口)
- 证据存档:按 [[analysis-contract]] 复核格式(结论/证据/置信度)
- 闭环输出:确认命中 → 事件报告;未命中 → 假设归档(可复跑)
## 跨域联合
- [[re-forensics]] 网关:本技能归属
- [[re-ti]]:情报输入(假设来源)
- [[re-behavior]]:命中深挖
- [[re-variant]]:样本关联
- [[analysis-contract]]:结论按复核格式交付
## 常见坑与陷阱
- **基线污染**:现象——异常被视为正常;原因——环境本身已被攻陷(基线含恶意活动);对策——基线窗口选择在已知干净时段,标注基线假设
- **遥测缺失盲区**:现象——无异常结论但环境有活动;原因——关键数据源未采集;对策——步骤 2 显式标注盲区,结论限定「在已采集遥测内」
- **误报疲劳**:现象——大量命中无人深挖;原因——规则过宽/阈值过低;对策——先聚类再审查,阈值按基线校准
- **假设过窄**:现象——只查了一个技术;原因——假设单一;对策——按 ATT&CK 技术族生成多假设(覆盖率声明)
- **结论过强**:现象——「环境干净」声明;原因——未标注盲区与假设边界;对策——结论带限定(见坑 2)
````
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 104 skills validated`([[链接]]:re-behavior/re-ti/re-variant/re-forensics/analysis-contract/re-triage 均存在)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-hunting/SKILL.md
git commit -m "feat: re-hunting 技能——假设驱动狩猎/遥测选择/验证闭环"
```
---
### Task 4: 创建 re-mobile-forensics 技能
**Files:**
- Create: `.claude/skills/re-mobile-forensics/SKILL.md`
**Interfaces:**
- Consumes: 无(新目录)
- Produces: 技能目录 `re-mobile-forensics`(供 Task 7 的 [[re-mobile-forensics]] 链接解析;计数 104 → 105)
- [ ] **Step 1: 创建目录与 SKILL.md**
```bash
mkdir -p .claude/skills/re-mobile-forensics
```
写入 `.claude/skills/re-mobile-forensics/SKILL.md`:
````markdown
---
name: re-mobile-forensics
type: atomic
description: >
移动设备取证:Android/iOS 备份解析、应用数据提取、删除恢复与时间线。
触发词:移动取证、手机取证、ADB备份、iTunes备份、手机数据提取。
---
# 移动设备取证
## 何时使用 / 何时不用
- 用:设备备份/镜像的数据提取、应用数据取证、删除恢复
- 不用:App 逆向分析([[re-mobile]]);通用文件系统分析([[re-disk-forensics]])
## 工具准备
### adb(Android 设备接口)
- Linux: `apt install adb` / `dnf install android-tools`;macOS: `brew install android-platform-tools`;Windows: 官方平台工具
- 验证: `adb --version`
### libimobiledevice(iOS 设备接口)
- Linux: `apt install libimobiledevice-utils`;macOS: `brew install libimobiledevice`;Windows: 官方构建
- 验证: `idevice_id -l`(列出设备)
### 备份解析工具
- Android: `ab` 备份格式解析(python 脚本或工具);iOS: `libimobiledevice` 的 `idevicebackup2` + manifest 解析
- sqlite3(数据库读取,见 [[re-disk-forensics]] 工具准备)
## 操作步骤
按顺序执行;设备操作遵循授权边界(红线:仅授权设备)。每步产物存档(路径 + sha256,见 [[re-triage]])。
1. **Android 提取**:
```sh
adb backup -f backup.ab -all # 全量备份(应用需允许备份)
# ab 格式:头(ANDROID BACKUP)+ 可选 AES 加密 + tar 负载
adb shell run-as com.target.app ls data # 应用沙箱(debuggable 应用)
```
- 备份解析:ab 头 → 解包 tar(加密备份需密码)
- 应用沙箱:`run-as`(debuggable)/ root 设备直接读
- 数据库提取 → sqlite3([[re-disk-forensics]] 的 SQLite 页结构方法)
2. **iOS 提取**:
```sh
idevicebackup2 backup --full ./backup_dir
# 备份结构:manifest.plist + 按哈希路径组织的文件
```
- 备份解析:manifest.plist(文件映射)、加密备份需密码(无密码则标注不可提取)
- Keychain 条目(需提取工具,权限边界)
- 应用数据:Library/Preferences、Documents、Caches(按应用沙箱路径)
3. **删除恢复与时间线**:
- SQLite 删除记录(freelist 残留——[[re-disk-forensics]] 数据库文件格式方法)
- 时间线重建:文件时间戳 + 数据库记录时间(注意时区——见坑 5)
- 产出:时间线表(时间/动作/来源)+ 恢复数据
## 跨域联合
- [[re-forensics]] 网关:本技能归属
- [[re-disk-forensics]]:SQLite 结构/WAL/删除恢复方法
- [[re-mobile]]:App 结构理解(沙箱路径/数据结构)
## 常见坑与陷阱
- **加密备份无密钥**:现象——备份无法解析;原因——AES 加密;对策——无密码则标注不可提取,不硬破解(授权边界)
- **ADB backup 权限限制**:现象——备份为空;原因——应用未声明 `allowBackup`;对策——换 root/镜像提取,标注路径局限
- **iOS 哈希路径混淆**:现象——文件找不到;原因——备份文件按内容哈希组织(非原名);对策——manifest.plist 映射解析
(注:本行表述已于 2026-09-13 修正——文件按 fileID 组织且 fileID 由路径派生(SHA1(domain + "-" + relativePath))不是内容哈希,索引文件是 Manifest.db;现文见 `.claude/skills/re-mobile-forensics/SKILL.md`,核验记录见 `docs/audit/`)
- **时间线时区**:现象——时间错位;原因——设备时区与取证时区不一致;对策——统一 UTC 记录,标注设备时区
- **沙箱边界**:现象——拿不到目标数据;原因——无 root/未越狱;对策——按可提取范围交付(限定结论),不越授权
````
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 105 skills validated`([[链接]]:re-mobile/re-disk-forensics/re-forensics/re-triage 均存在)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-mobile-forensics/SKILL.md
git commit -m "feat: re-mobile-forensics 技能——Android/iOS 备份解析与删除恢复"
```
---
### Task 5: 创建 re-stego 技能
**Files:**
- Create: `.claude/skills/re-stego/SKILL.md`
**Interfaces:**
- Consumes: 无(新目录)
- Produces: 技能目录 `re-stego`(供 Task 7 的 [[re-stego]] 链接解析;计数 105 → 106)
- [ ] **Step 1: 创建目录与 SKILL.md**
```bash
mkdir -p .claude/skills/re-stego
```
写入 `.claude/skills/re-stego/SKILL.md`:
````markdown
---
name: re-stego
type: atomic
description: >
隐写术检测与提取:文件尾附加、图片 LSB、音频与其他载体、提取验证。
触发词:隐写、stego、LSB、文件尾附加、隐写提取、图片隐写。
---
# 隐写术检测与提取
## 何时使用 / 何时不用
- 用:隐写怀疑(CTF 题/取证对象)、文件尾异常、图片/音频异常
- 不用:正常文件分析(各归各域技能)
## 工具准备
### zsteg(图片 LSB 扫描)
- 多平台: `gem install zsteg` 或源码(GitHub)
- 验证: `zsteg -v`
### steghide(图片/音频隐写)
- Linux: `apt install steghide` / `dnf install steghide`;macOS: `brew install steghide`
- 验证: `steghide info --help`
### binwalk(尾部扫描)
- 安装与验证见 [[re-fw-extract]] 工具准备
### python3(位操作/验证脚本)
- 安装与验证见 [[re-python]] 工具准备
## 操作步骤
按顺序执行,每步产物存档(路径 + sha256,见 [[re-triage]])。
1. **文件尾附加检测**:
```sh
binwalk sample.png | tail -20 # 附加数据扫描
hexdump -C sample.png | tail -10 # 尾部目检
```
- 尾部附加:文件正常但尾部有多余数据(衔接 [[re-patching]] 尾部附加经验)
- 提取:binwalk 自动分割或 dd 按偏移提取 → magic 检查([[re-triage]])
2. **图片 LSB**:
```sh
zsteg sample.png # 全通道 LSB 扫描
zsteg -E 'b1,rgb,lsb,xy' sample.png # 指定通道/位平面提取
```
- 通道:RGB/alpha 各通道最低位;位平面:b1/b2(低 2 位)
- 顺序:行序/位序影响提取结果(见坑 1)
- 无工具时的脚本路径:python3 按像素遍历提取位序列
3. **其他载体**:
- 音频:频谱隐写(音频可视化工具查频域图案)、相位/回声隐写
- 文件冗余区:EXIF、文件头保留区、压缩文件未用空间
- 多载体组合(题目常用)
4. **提取验证**:
- magic 检查(提取物头部特征)
- 可读性验证(strings/file)
- 隐写前压缩:先提取再解压(提取物查压缩头——zlib `78 9C` / gzip `1F 8B`,见坑 3)
## 跨域联合
- [[re-ctf]] 网关:本技能归属
- [[re-fw-extract]]:binwalk 复用
- [[re-patching]]:尾部附加经验衔接
- [[re-triage]]:提取物初勘
## 常见坑与陷阱
- **LSB 顺序**:现象——提取乱码;原因——行序(从上到下/从下到上)/位序(LSB 优先/MSB 优先);对策——工具自动尝试或脚本枚举组合
- **多载体误判**:现象——一个文件中多个隐写层;原因——嵌套隐写;对策——分层提取,每层验证
- **隐写前压缩**:现象——提取物乱码;原因——明文先压缩再嵌入;对策——先查压缩特征(zlib 头)再解压
- **工具输出噪声**:现象——大量候选;原因——扫描输出含误报;对策——按 magic/可读性过滤
- **载体本身异常**:现象——文件损坏;原因——隐写写入破坏结构;对策——先修复/容忍损坏(按位提取不依赖结构)
````
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 106 skills validated`([[链接]]:re-ctf/re-fw-extract/re-patching/re-triage/re-python 均存在)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-stego/SKILL.md
git commit -m "feat: re-stego 技能——文件尾/LSB/多载体隐写检测与提取"
```
---
### Task 6: 创建 re-browser-ext 技能
**Files:**
- Create: `.claude/skills/re-browser-ext/SKILL.md`
**Interfaces:**
- Consumes: 无(新目录)
- Produces: 技能目录 `re-browser-ext`(供 Task 7 的 [[re-browser-ext]] 链接解析;计数 106 → 107)
- [ ] **Step 1: 创建目录与 SKILL.md**
```bash
mkdir -p .claude/skills/re-browser-ext
```
写入 `.claude/skills/re-browser-ext/SKILL.md`:
````markdown
---
name: re-browser-ext
type: atomic
description: >
浏览器扩展逆向:权限清单、恶意行为定位、混淆还原、上架审查绕过面。
触发词:浏览器扩展、Chrome扩展、Firefox扩展、恶意扩展、extension。
---
# 浏览器扩展逆向
## 何时使用 / 何时不用
- 用:扩展文件(crx/xpi/zip)、恶意扩展行为分析、扩展权限审计
- 不用:网页 JS 混淆([[re-script-deob]] 覆盖纯脚本)
## 工具准备
### unzip / 7z(解包)
- 安装与验证见 [[re-doc-malware]] 工具准备(7z)
### jq(manifest 解析)
- Linux: `apt install jq`;macOS: `brew install jq`;Windows: 官方构建
- 验证: `jq --version`
### node(扩展脚本运行/验证,可选)
- 各平台安装见 [[re-python]] 工具准备模式(node 官方安装包)
- 验证: `node --version`
## 操作步骤
按顺序执行,每步产物存档(路径 + sha256,见 [[re-triage]])。
1. **解包与结构**:
```sh
unzip sample.crx -d ext/ # crx/xpi = zip 容器
jq '.permissions, .host_permissions' ext/manifest.json
```
- 结构:manifest.json + 背景脚本(background/service_worker)+ 内容脚本(content_scripts)+ 页面
- 权限清单:`permissions`(API 权限)、`host_permissions`(站点访问)——权限决定能力边界
2. **恶意行为定位**:
- 数据外泄:fetch/XHR/beacon([[re-netcap]] 衔接)、`navigator.sendBeacon`、图片像素外传
- 权限滥用:tabs(读取页面)、storage(数据收集)、webRequest(流量篡改/监控)、clipboard(剪贴板窃取)
- 注入面:content_scripts 匹配站点、动态注入(`chrome.scripting.executeScript`)
- 后台脚本是核心(MV3 的 service worker / MV2 的 background page)
3. **混淆还原**:
- 衔接 [[re-script-deob]] 高级混淆对抗(bootstrap/字符串表/CFF)
- 远程代码:MV2 允许远程 JS(`eval`/动态加载);MV3 禁止远程 JS(远程代码是审查绕过信号)
4. **上架审查绕过面分析**:
- 动态加载(运行时拉取代码——MV2 特征)
- obfuscation 检测规避(代码混淆超过阈值触发审查)
- 多阶段(无害首版 + 更新后恶意——版本对比 [[re-variant]] 思路)
## 跨域联合
- [[re-managed]] 网关:本技能归属(选择树「浏览器扩展」分支)
- [[re-script-deob]]:混淆还原
- [[re-netcap]]:网络行为衔接
- [[re-variant]]:扩展版本对比(更新后恶意检测)
## 常见坑与陷阱
- **manifest 版本差异**:现象——MV2 分析思路套 MV3 失效;原因——权限模型不同(MV3 禁远程代码/后台改 service worker);对策——先确认 manifest_version
- **远程代码策略**:现象——静态找不到恶意逻辑;原因——代码远程拉取(MV2);对策——网络侧抓取([[re-netcap]])后还原
- **动态注入绕过静态分析**:现象——content_scripts 无恶意但行为异常;原因——运行时注入;对策——hook 注入 API(scripting.executeScript)
- **沙箱与页面隔离**:现象——扩展 API 调用点难定位;原因——扩展上下文与页面上下文隔离;对策——分上下文分析(background/content/page)
- **更新后恶意**:现象——首版干净;原因——版本更新注入恶意;对策——版本 diff([[re-variant]])
````
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 107 skills validated`([[链接]]:re-script-deob/re-netcap/re-variant/re-managed/re-triage/re-doc-malware 均存在——re-variant 由 Task 2 创建,re-doc-malware 由 Task 1 创建)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-browser-ext/SKILL.md
git commit -m "feat: re-browser-ext 技能——扩展权限审计/恶意行为/混淆还原"
```
---
### Task 7: 挂载与计数同步
**Files:**
- Modify: `.claude/skills/re-malware/SKILL.md`(子技能列表 + 选择树分支)
- Modify: `.claude/skills/re-binary-core/SKILL.md`(子技能列表 + 选择树分支)
- Modify: `.claude/skills/re-forensics/SKILL.md`(子技能列表加 2 个)
- Modify: `.claude/skills/re-ctf/SKILL.md`(子技能列表加 1 个)
- Modify: `.claude/skills/re-managed/SKILL.md`(子技能列表 + 选择树分支)
- Modify: `.claude/skills/re-analyze/references/rerouting.md`(A 表加 3 行)
- Modify: `README.md`(计数 101→107、88→94、导航加 6 行)
- Modify: `AGENTS.md`(101→107、88→94)
- Modify: `.claude-plugin/marketplace.json`(101→107)
**Interfaces:**
- Consumes: Task 1-6 的 6 个技能目录(链接可解析)
- Produces: 6 技能全库可达;计数 107 = 1 + 12 + 94
- [ ] **Step 1: 网关挂载(5 文件,7 处编辑)**
`.claude/skills/re-malware/SKILL.md` 子技能列表(description 行,末尾 `[[re-fileless]]`)追加 `、[[re-doc-malware]]`;选择树(「**无文件样本**…」分支后)插入:
```markdown
- **钓鱼附件(PDF/Office/RTF 文档)** → [[re-doc-malware]](文档武器化/宏链/载荷提取)
```
`.claude/skills/re-binary-core/SKILL.md` 子技能列表(description 行,末尾 `[[re-fp-runtime]]`)追加 `、[[re-variant]]`;选择树(「**目标是 Haskell/OCaml 产物**…」分支后)插入:
```markdown
- **补丁/N-day 对比(修复前后/变体关联)** → [[re-variant]](函数匹配/补丁 diff)
```
`.claude/skills/re-forensics/SKILL.md` 子技能列表(description 行,末尾 `[[re-attribution]]`)追加 `、[[re-hunting]]、[[re-mobile-forensics]]`
`.claude/skills/re-ctf/SKILL.md` 子技能列表(description 行,末尾 `[[re-pwn]]`)追加 `、[[re-stego]]`
`.claude/skills/re-managed/SKILL.md` 子技能列表(description 行,末尾 `[[re-blockchain]]`)追加 `、[[re-browser-ext]]`;选择树(「**EVM 合约字节码**…」分支后)插入:
```markdown
- **浏览器扩展(crx/xpi/zip 扩展文件)** → [[re-browser-ext]](权限审计/恶意行为/混淆还原)
```
- [ ] **Step 2: rerouting A 表加 3 行**
`.claude/skills/re-analyze/references/rerouting.md` A 表末尾(RTTI 行之后)追加:
```markdown
| PDF/Office 宏/钓鱼文档特征 | [[re-doc-malware]] |
| 补丁/N-day 对比需求(修复前后/变体) | [[re-variant]] |
| 文件尾附加/图片异常(隐写怀疑) | [[re-stego]] |
```
- [ ] **Step 3: 计数同步(3 文件)**
`README.md`:
- `## 技能导航(101)` → `## 技能导航(107)`
- `入口 → 12 大类网关 → 88 原子技能` → `入口 → 12 大类网关 → 94 原子技能`
- 第 5 行 `101 个逆向工程技能` → `107 个逆向工程技能`
- 导航行:re-malware 行加 `、re-doc-malware`;re-binary-core 行加 `、re-variant`;re-forensics 行加 `、re-hunting、re-mobile-forensics`;re-ctf 行加 `、re-stego`;re-managed 行加 `、re-browser-ext`
`AGENTS.md`:
- `(101 个技能)` → `(107 个技能)`
- `原子技能(88)` → `原子技能(94)`
`.claude-plugin/marketplace.json`:
- `101 个技能` → `107 个技能`
- [ ] **Step 4: 校验**
Run: `npm test`
Expected: `OK: 107 skills validated`
Run: `grep -c "re-doc-malware\|re-variant\|re-hunting\|re-mobile-forensics\|re-stego\|re-browser-ext" README.md`
Expected: ≥ 5(各技能名在导航行各出现 1 次,grep -c 按行计,5 个网关行各含 1+ 名)
- [ ] **Step 5: Commit**
```bash
git add .claude/skills/re-malware/SKILL.md .claude/skills/re-binary-core/SKILL.md .claude/skills/re-forensics/SKILL.md .claude/skills/re-ctf/SKILL.md .claude/skills/re-managed/SKILL.md .claude/skills/re-analyze/references/rerouting.md README.md AGENTS.md .claude-plugin/marketplace.json
git commit -m "增强: 6 技能挂载与计数同步 107(5 网关/rerouting 3 行/README-AGENTS-marketplace)"
```

View File

@@ -0,0 +1,835 @@
# 6 个单开技能 实现计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 新增 6 个原子技能(re-cpp-abi / re-macos / re-attribution / re-hw-chip / re-ai-attack / re-sdr)+ 挂载同步,技能总数 91 → 97。
**Architecture:** 纯技能文档扩展。6 个新技能目录(SKILL.md,按 docs/skill-template.md 原子技能规范)+ 挂载(re-binary-core / re-forensics 网关、rerouting A 表 RTTI 行、4 处跨域引用)+ 计数同步(README / AGENTS / marketplace)。
**Tech Stack:** Markdown / YAML frontmatter / validate.mjs(npm test,现有)
## Global Constraints
- **红线 1 呈现中性**:禁用「最推荐」「强烈建议」等最高级强推措辞
- **红线 2 隐私脱敏**:内容不指向具体项目/公司/产品(归因技能只写方法不写真实案例)
- **不绑定具体工具**:方法为核心,工具为可替换示例;「工具准备」按模板给跨 OS 安装命令(硬件类技能给选购指引)
- validate.mjs:frontmatter `name`=目录名、`description` 非空、`type: atomic` 必含「## 工具准备」、`[[链接]]` 必须解析
- 工作区有 4 个未提交修改(re-binary-core / re-mobile / re-protocol 的 SKILL.md、README.md)——各任务 commit 只 add 本任务列出的文件
- **re-binary-core/SKILL.md 有用户未提交改动**:Task 7 对该文件只做工作区修改、**不 git add 提交该文件**(挂载行与用户改动共存于工作区,由用户一并提交)
- 新技能创建后 `npm test` 预期输出按任务标注(92 → 97 递增)
---
### Task 1: 创建 re-cpp-abi 技能
**Files:**
- Create: `.claude/skills/re-cpp-abi/SKILL.md`
**Interfaces:**
- Consumes: 无(新目录)
- Produces: 技能目录 `re-cpp-abi`(供 Task 7 的 [[re-cpp-abi]] 链接解析;计数 91 → 92)
- [ ] **Step 1: 创建目录与 SKILL.md**
```bash
mkdir -p .claude/skills/re-cpp-abi
```
写入 `.claude/skills/re-cpp-abi/SKILL.md`:
````markdown
---
name: re-cpp-abi
type: atomic
description: >
现代 C++ 二进制逆向:RTTI/异常/虚表恢复、ABI 识别、mangling 解码。
触发词:C++逆向、RTTI、虚表恢复、异常处理、C++ ABI、mangling、C++反编译。
---
# 现代 C++ 逆向(RTTI / 异常 / 虚表)
## 何时使用 / 何时不用
- 用:RTTI/异常表密集的二进制、反编译结果混乱的 C++ 目标(类层次/虚调用/异常流无法直接读出)
- 不用:C 代码或纯汇编(走 [[re-binary-core]] 通用路径);混淆主导的目标(先 [[re-deobfuscate]])
## 工具准备
### readelf / llvm-objdump(节表与异常表)
- Linux: `apt install binutils llvm` / `dnf install binutils llvm` / `pacman -S binutils llvm`
- macOS: `brew install llvm`(binutils 部分 macOS 自带)
- Windows: WSL 或 llvm 预编译
- 验证: `readelf --version`、`llvm-objdump --version`
### c++filt / undname(mangling 解码)
- Linux/macOS: `c++filt`(binutils 自带);Windows: `undname`(VS 工具链)
- 验证: `echo '_ZN3foo3barEv' | c++filt`(输出 `foo::bar()`)
### Ghidra / IDA(反编译底座,脚本化 RTTI 遍历)
- 安装与验证见 [[re-ghidra]] / [[re-ida]] 工具准备
### gdb(异常断点,可选)
- 安装与验证见 [[re-gdb]]
## 操作步骤
按顺序执行,每步产物存档(路径 + sha256,见 [[re-triage]])。
1. **ABI 识别**:
```sh
readelf -s sample | grep -E '_ZN|_ZTV|_ZTI' | head # Itanium(GCC/Clang)
strings sample | grep -E '^\?\?_' | head # MSVC
```
- Itanium 特征:`_ZN`(函数)、`_ZTV`(虚表)、`_ZTI`(RTTI 类型信息)
- MSVC 特征:`??_7`(vftable)、`??_R`(RTTI)
- 识别错则后续全部偏——先确认再继续
2. **RTTI 重建(Itanium)**:
```sh
readelf -s sample | grep _ZTI | head
# _ZTI<类名> 指向 typeinfo;typeinfo+8 处 _ZTVN10__cxxabiv1... 链到 vtable 前缀
```
- 结构:`typeinfo` → `__class_type_info` 派生链 → 每个类的完整继承路径
- 脚本化:Ghidra/IDA 遍历 _ZTI 引用,重建类继承图(父子关系表)
- 产出:类名 → 继承链映射(写入会话 symbols_known,见 [[analysis-contract]])
3. **虚表恢复**:
```sh
readelf -s sample | grep _ZTV | head
```
- `_ZTV<类名>` 指向 vtable 起点(虚函数指针数组);`offset to top` + `typeinfo ptr` 位于 vtable 前 8 字节(Itanium ABI)
- 定位 vtable 后:每个槽位的函数地址 → 调用点反推虚方法名(结合步骤 2 的继承图)
- 虚调用(`call *reg`)无法静态定名 → 用调用点上下文(参数/返回值使用)缩小候选
4. **异常处理表**:
```sh
readelf -S sample | grep -E 'pdata|xdata' # PE:.pdata/.xdata
readelf -S sample | grep -E 'eh_frame|gcc_except' # ELF:.eh_frame
```
- PE:`.pdata` 的 RUNTIME_FUNCTION(Begin/End/UnwindInfo)→ `.xdata` 展开数据 → 异常处理器(__CxxFrameHandler3)
- ELF:`.eh_frame` 的 FDE/CIE → 展开规则与 LSDA(.gcc_except_table)→ 异常处理函数
- 用途:恢复被异常路径打断的控制流、定位析构/清理逻辑(catch 块)
5. **模板/lambda 识别**:
- 模板:符号含 `<...>` 参数(Itanium mangling 中展开为长串);实例化爆炸时按调用模式聚类
- lambda:Itanium 中 `_ZZ<作用域>ENK...` 特征、MSVC 中 `<lambda_...>`;lambda 局部类**无 RTTI**(步骤 2 缺失时反推)
- 输出:疑似模板实例化/lambda 的函数清单 + 调用点
6. **mangling 解码(批量)**:
```sh
readelf -s sample | grep -E '_ZN|_ZTV|_ZTI' | awk '{print $8}' | c++filt | head -20
```
- MSVC: `undname` 或在线等价工具
- 解码结果写入符号表(供 [[re-ghidra]] / [[re-ida]] 重命名)
## 跨域联合
- [[re-binary-core]] 网关:本技能归属(选择树「现代 C++」分支待加)
- [[re-ghidra]] / [[re-ida]]:反编译底座与脚本化
- [[re-deobfuscate]]:混淆与 ABI 分析衔接
- [[analysis-contract]]:类继承图/符号表按数据契约传递
- [[rerouting]]:RTTI/异常表特征触发本技能(A 表已挂)
## 常见坑与陷阱
- **ABI 误判导致全部解析失败**:现象——用 Itanium 结构解析 MSVC 目标(或反之)全盘错位;原因——识别步骤跳过;对策——先做步骤 1,mangling 特征双查
- **模板展开导致符号爆炸**:现象——readelf 输出几万行 `_Z...`;原因——模板实例化;对策——按调用模式聚类、过滤标准库符号(libstdc++/STL 前缀)
- **lambda 无 RTTI**:现象——类继承图缺节点;原因——lambda 局部类不生成 typeinfo;对策——按 `_ZZ` mangling 特征与调用点识别,不硬找 RTTI
- **异常表版本差异**:现象——.xdata 解析错位;原因——MSVC 异常处理版本(__CxxFrameHandler3 等)不同;对策——按导入函数(__CxxFrameHandler)确认版本再解析
- **虚调用无法静态定名**:现象——`call *reg` 全是间接调用;原因——虚分派;对策——结合 vtable 槽位与调用点证据缩小候选,不猜
````
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 92 skills validated`(re-cpp-abi 计入;[[链接]] 全部指向已存在技能:re-binary-core/re-deobfuscate/re-ghidra/re-ida/analysis-contract/rerouting/re-triage/re-gdb 均存在)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-cpp-abi/SKILL.md
git commit -m "feat: re-cpp-abi 技能——RTTI/异常/虚表恢复与 ABI 识别"
```
---
### Task 2: 创建 re-macos 技能
**Files:**
- Create: `.claude/skills/re-macos/SKILL.md`
**Interfaces:**
- Consumes: 无(新目录)
- Produces: 技能目录 `re-macos`(供 Task 7 的 [[re-macos]] 链接解析;计数 92 → 93)
- [ ] **Step 1: 创建目录与 SKILL.md**
```bash
mkdir -p .claude/skills/re-macos
```
写入 `.claude/skills/re-macos/SKILL.md`:
````markdown
---
name: re-macos
type: atomic
description: >
macOS 原生应用逆向:App Bundle/签名公证、entitlements、沙箱与 TCC、钥匙串与 Secure Enclave。
触发词:macOS逆向、mac app、entitlements、Secure Enclave、钥匙串、TCC、codesign、公证。
---
# macOS 应用逆向
## 何时使用 / 何时不用
- 用:macOS 原生/闭源应用(.app/.dylib/.framework)、带签名公证与沙箱的目标、钥匙串/Secure Enclave 硬件密钥场景
- 不用:iOS 应用(转 [[re-ios]]);纯 Mach-O 格式解析(转 [[re-format-macho]])
## 工具准备
### codesign / spctl / otool / lipo(签名与 Mach-O 工具,macOS 内置)
- macOS: 系统自带(Xcode 命令行工具 `xcode-select --install`)
- Linux: 可静态分析 Mach-O(`llvm-otool`,`brew install llvm` 或发行版 llvm 包)
- 验证: `codesign --version`、`otool --version`
### Hopper / IDA / Ghidra(反编译底座)
- 安装与验证见 [[re-ida]] / [[re-ghidra]]
### lldb(动态调试)
- 安装与验证见 [[re-lldb]]
## 操作步骤
按顺序执行,每步产物存档(路径 + sha256,见 [[re-triage]])。
1. **包结构与签名检查**:
```sh
file Sample.app/Contents/MacOS/Sample
codesign -dv Sample.app 2>&1 | head # 签名者/Team ID/要求
spctl -a -vv Sample.app 2>&1 # 公证状态(Gatekeeper)
defaults read Sample.app/Contents/Info.plist # Info.plist 关键键
```
- 关注:签名者(Apple 开发者/分发证书)、Team ID、Hardened Runtime(runtime 标志)、Info.plist 的 CFBundleIdentifier/版本
2. **entitlements 与沙箱**:
```sh
codesign -d --entitlements :- Sample.app 2>&1 | head -30
```
- 关键键:`com.apple.security.app-sandbox`(沙箱开启)、`com.apple.security.network.client/server`、`com.apple.security.files.user-selected.*`、`com.apple.security.device.*`(摄像头/麦克风)
- 沙箱 profile 决定能力边界——分析授权逻辑时先看 entitlements 清单
3. **TCC 权限库**:
```sh
# 用户级 TCC 库(授权记录)
ls ~/Library/Application\ Support/com.apple.TCC/
```
- TCC.db(SQLite)记录各 App 对隐私资源的授权;分析目标对 TCC 的依赖(它请求了什么权限、何时请求)
- 注意:TCC 数据属系统隐私数据,只读分析不导出内容(红线 2)
4. **钥匙串与 Secure Enclave**:
- 钥匙串条目类型(通用密码/互联网密码/密钥)与 ACL(`kSecAttrAccess` 可访问性类:非锁定/首次解锁/此设备)
- Secure Enclave 密钥:`SecKeyCreateWithData` 带 `kSecAttrTokenIDSecureEnclave` —— 私钥**不可提取**(等价 Android Keystore 硬件背书,见 [[re-android-native]] Keystore 审计)
(注:本行 API 用法已于 2026-09-13 修正——SE 密钥须用 `SecKeyCreateRandomKey`,`SecKeyCreateWithData` 是外部数据导入;现文见 `.claude/skills/re-macos/SKILL.md`,核验记录见 `docs/audit/`)
- 分析:目标读哪些钥匙串条目(SecItemCopyMatching 调用点)、密钥是否 Secure Enclave 绑定(不可提取 → 记录用途而非字节)
5. **dyld 加载链**:
```sh
otool -L Sample.app/Contents/MacOS/Sample | head # LC_LOAD_DYLIB 依赖
otool -l Sample.app/Contents/MacOS/Sample | grep -A4 LC_RPATH
```
- 依赖清单与 RPATH → Dylib Hijacking 面(可写目录 + 缺失依赖)
- 注入面:DYLD_INSERT_LIBRARIES(受 hardened runtime 限制——有 `com.apple.security.cs.allow-dyld-environment-variables` 才可注入)
6. **反调试与保护**:
- taskgated/签名校验:改签名或注入触发校验失败的典型点
- 对抗面分析:代码签名校验(`SecStaticCodeCheckValidity`)、调试器检测(`PT_DENY_ATTACH`)、反注入(`DYLD_INSERT_LIBRARIES` 检查)
- 动态侧:[[re-lldb]] attach 前先处理 PT_DENY_ATTACH(ptrace 调用点 patch)
## 跨域联合
- [[re-format-macho]]:Mach-O 格式底座(LC_* 解析)
- [[re-ios]]:iOS 侧互补(越狱生态与 entitlements 差异)
- [[re-lldb]]:动态调试
- [[re-frida]]:动态插桩(macOS 桌面支持)
- [[analysis-contract]]:签名/entitlements 信息按数据契约传递
## 常见坑与陷阱
- **签名校验多处触发**:现象——patch 后运行即退;原因——加载/运行/更新多处校验;对策——逐点定位(步骤 6),先处理校验点再过逻辑
- **Secure Enclave 密钥不可提取**:现象——内存搜不到私钥;原因——硬件背书;对策——记录用途与 ACL,不找字节(见步骤 4)
- **TCC 权限导致功能缺失**:现象——目标功能灰掉;原因——TCC 未授权;对策——分析其请求逻辑而非绕过系统权限(红线)
- **公证检查离线不可复现**:现象——离线环境 spctl 结果异常;原因——公证需要网络查询;对策——用 codesign 的本地签名信息替代
- **hardened runtime 限制注入**:现象——DYLD_INSERT_LIBRARIES 无效;原因——runtime 标志未含 allow-dyld 环境变量;对策——静态分析路径([[re-ghidra]]),不硬注入
````
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 93 skills validated`([[链接]]:re-ios/re-format-macho/re-lldb/re-frida/re-android-native/analysis-contract/re-triage/re-ida/re-ghidra 均存在)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-macos/SKILL.md
git commit -m "feat: re-macos 技能——签名公证/entitlements/钥匙串与 Secure Enclave"
```
---
### Task 3: 创建 re-attribution 技能
**Files:**
- Create: `.claude/skills/re-attribution/SKILL.md`
**Interfaces:**
- Consumes: 无(新目录)
- Produces: 技能目录 `re-attribution`(供 Task 7 的 [[re-attribution]] 链接解析;计数 93 → 94)
- [ ] **Step 1: 创建目录与 SKILL.md**
```bash
mkdir -p .claude/skills/re-attribution
```
写入 `.claude/skills/re-attribution/SKILL.md`:
````markdown
---
name: re-attribution
type: atomic
description: >
威胁归因方法论:钻石模型、基础设施图谱、置信度分级与归因报告。
触发词:归因、APT、attribution、攻击者身份、基础设施图谱、钻石模型、威胁组织。
---
# 威胁归因(APT Attribution)
## 何时使用 / 何时不用
- 用:情报归因请求(「谁干的」)、基础设施关联分析、样本/能力到攻击者的推理
- 不用:单个 IOC 查询(转 [[re-ti]]);恶意行为判定(转 [[re-behavior]])
## 工具准备
### 关联查询工具(Passive DNS / 证书透明 / Whois)
- 多平台: 命令行客户端 + 在线服务(查询类工具,给 API 使用指引)
- 验证: 任一查询工具可返回结果
### MISP(情报关联与共享)
- Linux: `apt install misp` 或 Docker 部署;验证: 实例可访问
- 轻量替代: 本地 CSV/图文件 + 脚本分析
### 图分析(基础设施关系)
- 多平台: `pip install networkx`(python 图分析);验证: `python3 -c "import networkx"`
## 操作步骤
按顺序执行;全部内容脱敏处理(红线 2:不指向具体组织/受害者身份)。
1. **钻石模型定位**:
- 四角:受害者(已明确)/ 基础设施(C2 域名/IP/证书)/ 能力(工具/样本/漏洞利用)/ 对手(待推断)
- 产出:四角已知信息表 + 缺失角(归因目标)
- 规则:只有两角以上才能开始推理;单角(仅样本)不支撑归因声明
2. **基础设施图谱**:
```sh
# 域名/IP/证书关联聚类(示例流程,工具可替换)
# 1) 收集 C2 域名/IP → Whois 注册信息
# 2) 证书透明日志查共用证书 → 关联其他域名
# 3) 图分析(networkx)聚类:共享注册者/证书/NS 的节点合并
```
- 聚类特征:同一注册者/注册邮箱、共用证书、共用 DNS 基础设施、IP 段归属
- 跳板/托管商共存不能作为归属证据(见坑 1)
3. **能力与样本归因**:
- 代码复用(样本间相似度:字符串/函数/资源)、TTP 对比(行为模式与已知活动对齐)、时间线(活动窗口对齐)
- 唯一性特征优先:独特字符串/编译特征/语言习惯(比通用 TTP 更有区分度)
- 产出:能力证据表(每条证据 → 支持/反对假设)
4. **置信度分级**:
- 低:单类证据(仅基础设施或仅能力)
- 中:两类独立证据交叉(如基础设施 + 能力)
- 高:三类以上 + 时间线一致 + 无矛盾证据
- 规则:无高置信度证据时声明「关联活动」而非「归属组织」;明确列出未解决的反证
5. **报告**:
- 结构:结论(分级声明)→ 证据链(每角证据 + 来源)→ 置信度依据 → 反证与未决项 → 方法边界(哪些无法判定)
- 脱敏:不公开受害者身份/真实组织名(用代号),不发表过度归因声明
## 跨域联合
- [[re-ti]]:情报输入(IOC 查询与背景)
- [[re-ioc]]:指标提取(域名/IP/哈希)
- [[re-behavior]]:行为证据(TTP 对齐)
- [[re-protocol]]:C2 协议分析(基础设施特征)
- [[re-feedback]]:归因案例经验沉淀(脱敏后)
## 常见坑与陷阱
- **基础设施重叠导致误归因**:现象——两活动共享 C2 基础设施被并为一组;原因——共用托管/被劫持基础设施;对策——区分「共享」与「控制」证据(注册信息 vs 仅托管)
- **跳板机 ≠ 归属**:现象——经第三方跳板的活动归到跳板所有者;原因——混淆路径;对策——只把「控制面证据」(注册/配置/唯一特征)算入归属
- **置信度虚高**:现象——单一独特性状(罕见字符串)即高置信度;原因——单证据强但无交叉验证;对策——按步骤 4 分级,单类证据最高「中」
- **脱敏红线**:现象——报告中出现真实受害者/组织身份;原因——复制原始情报未处理;对策——报告前逐项检查(红线 2 强制)
- **时间线证据不足**:现象——活动窗口无法对齐;原因——被动数据缺失;对策——标注时间线缺口,不强行对齐
````
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 94 skills validated`([[链接]]:re-ti/re-ioc/re-behavior/re-protocol/re-feedback 均存在)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-attribution/SKILL.md
git commit -m "feat: re-attribution 技能——钻石模型/基础设施图谱/置信度分级"
```
---
### Task 4: 创建 re-hw-chip 技能
**Files:**
- Create: `.claude/skills/re-hw-chip/SKILL.md`
**Interfaces:**
- Consumes: 无(新目录)
- Produces: 技能目录 `re-hw-chip`(供 Task 7 的 [[re-hw-chip]] 链接解析;计数 94 → 95)
- [ ] **Step 1: 创建目录与 SKILL.md**
```bash
mkdir -p .claude/skills/re-hw-chip
```
写入 `.claude/skills/re-hw-chip/SKILL.md`:
````markdown
---
name: re-hw-chip
type: atomic
description: >
物理层硬件逆向:去封装、裸片分析、探针与 FIB、PCB 电路分析、硬件木马检测。
触发词:芯片逆向、去封装、decapping、PCB、硬件木马、电路分析、裸片、FIB。
---
# 芯片/PCB 硬件逆向
## 何时使用 / 何时不用
- 用:物理芯片/板级分析(固件提取失败后的物理层)、芯片解密、硬件木马检测
- 不用:固件级分析(转 [[re-fw-extract]]);接口提取(转 [[re-hardware-io]]);无线信号(转 [[re-sdr]])
## 工具准备
### 显微镜/探针台(观察与接触)
- 选购指引:体视显微镜(初检)→ 金相显微镜(裸片);探针台按预算分级
- 验证: 无软件验证——以成像清晰度验收
### decapping 设备与耗材(去封装)
- 化学 decap:发烟硝酸/硫酸 + 加热台(防护:通风橱/护目镜);激光 decap:专用激光器(高成本,外包可选)
- 验证: 无软件验证——以裸露程度验收
### 逻辑分析仪(信号提取)
- 多平台: Saleae 类(配套软件各平台可用)或开源方案(sigrok/PulseView:`pip install sigrok` 或发行版包)
- 验证: `pulseview --version`
### 热成像(功耗/时序异常,可选)
- 选购指引:按分辨率与测温范围选型;验证: 成像验收
## 操作步骤
按顺序执行;全程注意防护与破坏性风险(步骤 1 不可逆)。
1. **去封装(decapping)**:
- 化学法:加热台预加热 → 滴加发烟硝酸溶解环氧 → 清洗(丙酮)→ 显微镜检查
- 激光法:激光逐层烧蚀(精度高,成本高)
- 风险控制:通风橱、防酸手套/护目镜、废弃液处理;先练习废片
- 验收:金属层可见、无过度腐蚀(伤及晶圆)
2. **裸片分析**:
- 显微成像(金相显微镜/电子显微镜)→ 金属层走线观察
- ROM/熔丝提取:成像 → 位图还原(金属层/多晶硅层图案 → 二进制)
- 产出:ROM 位图 → 数据(与 [[re-fw-extract]] 固件对照)
3. **探针与信号提取**:
- 探针台接触测试点(总线/时钟/数据线)
- FIB(聚焦离子束):修改互连/暴露内部节点(高成本,外包)
- 信号嗅探:逻辑分析仪挂总线(时序对照数据手册)
- 注意:探针负载可能改变信号(见坑 2)
4. **PCB 电路分析**:
- 走线还原(万用表导通/成像 → 网络表)
- IC 标识识别(丝印 → 型号 → 数据手册 → 引脚功能)
- JTAG/SWD 引脚定位(测试点/走线特征 → 调试接口枚举)
5. **硬件木马检测**:
- 冗余逻辑特征(无功能路径的触发器/计数器)
- 功耗/时序异常(热成像 + 电流曲线对照基线)
- 触发条件分析(特定输入组合/温度/时间条件)
## 跨域联合
- [[re-hardware-io]]:接口提取衔接(JTAG/UART 是软件侧入口)
- [[re-fw-extract]]:固件侧对照(ROM 提取物与固件 dump 比对)
- [[re-sdr]]:无线侧(RF 接口)
- [[re-triage]]:提取物初勘
## 常见坑与陷阱
- **decap 不可逆**:现象——封装破坏后无法恢复;原因——物理破坏;对策——先存档固件([[re-fw-extract]])再做物理操作
- **探针负载改变信号**:现象——挂探针后时序异常;原因——容性负载;对策——高阻探针、记录挂载前后基线
- **FIB 高成本易毁**:现象——FIB 修改失败晶圆报废;原因——离子束损伤;对策——先成像规划、外包给专业服务
- **木马误报**:现象——正常冗余逻辑被当木马;原因——厂商设计含测试/修复逻辑;对策——对照数据手册与已知电路模式,低置信度不发布
- **安全防护缺失**:现象——化学 decap 事故;原因——未用通风橱/防护;对策——步骤 1 风险控制强制前置
````
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 95 skills validated`([[链接]]:re-fw-extract/re-hardware-io/re-sdr/re-triage 均存在)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-hw-chip/SKILL.md
git commit -m "feat: re-hw-chip 技能——去封装/裸片/探针/PCB/硬件木马"
```
---
### Task 5: 创建 re-ai-attack 技能
**Files:**
- Create: `.claude/skills/re-ai-attack/SKILL.md`
**Interfaces:**
- Consumes: 无(新目录)
- Produces: 技能目录 `re-ai-attack`(供 Task 7 的 [[re-ai-attack]] 链接解析;计数 95 → 96)
- [ ] **Step 1: 创建目录与 SKILL.md**
```bash
mkdir -p .claude/skills/re-ai-attack
```
写入 `.claude/skills/re-ai-attack/SKILL.md`:
````markdown
---
name: re-ai-attack
type: atomic
description: >
AI 模型攻击与取证:模型提取攻击、指纹/水印检测、成员推断、对抗样本基础。
触发词:模型提取、模型窃取、水印检测、模型指纹、成员推断、对抗样本、模型攻击。
---
# AI 模型攻击与取证
## 何时使用 / 何时不用
- 用:模型泄露/窃取取证、API 模型攻击评估(提取/指纹)、训练数据泄露判定
- 不用:模型文件格式解析与权重提取(转 [[re-ai-model]]);模型训练/微调(非逆向)
## 工具准备
### python3(核心运行时)
- 各平台安装见 [[re-python]] 工具准备
### 模型库(torch / tensorflow,按目标格式选)
- 多平台: `pip install torch` / `pip install tensorflow`(按硬件可选 CPU 版)
- 验证: `python3 -c "import torch"`
### 查询接口客户端(API 目标)
- 多平台: `pip install requests`;验证: `python3 -c "import requests"`
## 操作步骤
按顺序执行;仅限授权评估场景(红线:不针对未授权目标)。
1. **模型提取攻击**:
- 目标:通过 API 查询重建近似模型(蒸馏)
- 步骤:
1. 确认接口能力(返回 logits/概率 或仅标签?置信度可得性决定策略)
2. 查询采样(输入分布覆盖:代表性输入 + 边界扰动)
3. 蒸馏训练(以 API 输出为教师标签,学生模型拟合)
4. 评估近似度(同输入集输出对比)
- 仅标签时:降级为决策边界采样(输出分布重建受限——标注此局限)
2. **模型指纹/水印检测**:
- 嵌入检测:输入扰动(特定噪声/触发器)→ 输出特征比对(水印触发行为)
- 指纹提取:模型行为签名(代表性输入集输出向量)→ 与疑似副本比对
- 窃取取证:嫌疑模型与受害者模型的指纹距离(阈值判定相似)
- 产出:指纹向量 + 距离报告(置信度)
3. **成员推断**:
- 目标:判定某样本是否在训练集中
- 方法:过拟合特征(样本损失/置信度分布对比基线)、影子模型
- 局限:只能给出统计判定(误报控制:阈值校准)
4. **对抗样本基础**:
- 白盒:梯度扰动(FGSM/PGD 类方法)
- 黑盒:查询/迁移扰动
- 用途:鲁棒性评估与防御验证(非攻击部署)
## 跨域联合
- [[re-ai-model]]:格式/权重侧(提取物分析衔接)
- [[re-python]]:Python 工具链基础
- [[re-feedback]]:攻击案例经验沉淀(脱敏后)
## 常见坑与陷阱
- **查询预算限制**:现象——API 限流/计费中断;原因——高查询量;对策——预算内采样设计(先小批估计)
- **置信度不可得时降级**:现象——接口只返回标签;原因——服务端裁剪输出;对策——决策边界采样 + 标注局限,不硬造概率
- **水印被抹除**:现象——指纹比对失败;原因——嫌疑方做了剪枝/微调;对策——用鲁棒指纹(多触发器)并标注「可能被抹除」
- **成员推断误报**:现象——统计判定错误;原因——阈值偏差;对策——影子模型校准 + 报告置信区间
- **授权边界**:现象——对未授权 API 发起攻击测试;原因——范围未确认;对策——先确认授权(使用边界红线)
````
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 96 skills validated`([[链接]]:re-ai-model/re-python/re-feedback 均存在)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-ai-attack/SKILL.md
git commit -m "feat: re-ai-attack 技能——模型提取/指纹水印/成员推断"
```
---
### Task 6: 创建 re-sdr 技能
**Files:**
- Create: `.claude/skills/re-sdr/SKILL.md`
**Interfaces:**
- Consumes: 无(新目录)
- Produces: 技能目录 `re-sdr`(供 Task 7 的 [[re-sdr]] 链接解析;计数 96 → 97)
- [ ] **Step 1: 创建目录与 SKILL.md**
```bash
mkdir -p .claude/skills/re-sdr
```
写入 `.claude/skills/re-sdr/SKILL.md`:
````markdown
---
name: re-sdr
type: atomic
description: >
射频逆向:信号采集、频谱分析、解调、帧同步与协议恢复、重放。
触发词:SDR、射频、信号分析、解调、RTL-SDR、HackRF、无线协议、遥测。
---
# 射频信号逆向(SDR)
## 何时使用 / 何时不用
- 用:无线协议/遥控/遥测信号(IoT 无线、遥控器、遥测链路)、信号级协议恢复
- 不用:有线协议(转 [[re-protocol]]);无线 IoT 协议已封装分析(转 [[re-iot-proto]])
## 工具准备
### RTL-SDR / HackRF(接收硬件)
- 选购指引:RTL-SDR(接收,低成本入门)/ HackRF(收发,重放需要)
- 验证: 硬件插入后 `rtl_test` 或 `hackrf_info` 有输出
### GNU Radio(信号处理)
- Linux: `apt install gnuradio` / `pacman -S gnuradio`;macOS: `brew install gnuradio`
- Windows: 官方安装包
- 验证: `gnuradio-companion --version` 或 `grcc --version`
### inspectrum(频谱/时序可视化)
- Linux: `apt install inspectrum` 或源码编译;macOS: `brew install inspectrum`
- 验证: `inspectrum --version`
### Universal Radio Hacker (URH)(解调与帧恢复)
- 多平台: `pip install urh`
- 验证: `urh --version`
## 操作步骤
按顺序执行;仅限授权测试(红线:重放/交互需授权)。
1. **信号采集与频谱分析**:
```sh
# 示例(工具可替换):GNU Radio 或命令行采集
rtl_sdr -f 433.9M -s 1M capture.iq
```
- 先全频段扫(找活跃信号)→ 定中心频率与带宽 → 采集 IQ
- 调制识别:频谱形状(FSK 双峰/PSK 平坦/AM 载波)
2. **解调**:
- URH:加载 IQ → 自动/手动调制识别 → 解调出位流
- GNU Radio:按识别结果搭解调链(AM/FM/PSK/QAM/FSK)
- 产出:解调位流(0/1 序列)
3. **帧同步与协议恢复**:
```sh
# URH 位流分析:preamble/同步字识别、编码反转(NRZ/Manchester)
urh --decode
```
- 找同步字(重复模式/固定前缀)→ 定帧边界 → 字段划分(地址/长度/载荷/CRC)
- 多帧对照(重复发射)→ 不变字段=固定头、变化字段=数据/序号
- 产出:帧结构表(字段偏移/长度/语义)
4. **重放与交互**(授权场景):
- HackRF 回放捕获帧(重放攻击验证——仅授权目标)
- 交互式:改字段重发(滚动码/加密需先分析算法——转 [[re-crypto-*]])
## 跨域联合
- [[re-iot-proto]]:无线 IoT 协议衔接(MQTT/CoAP 等封装层)
- [[re-protocol]]:帧结构状态机重建衔接
- [[re-crypto-id]] / [[re-crypto-decrypt]]:载荷加密分析
- [[re-feedback]]:信号案例经验沉淀(脱敏后)
## 常见坑与陷阱
- **频率偏移/采样率错误**:现象——解调全乱码;原因——中心频率偏、采样率不匹配;对策——先用已知信号(FM 广播)校准
- **调制误判**:现象——FSK 当 PSK 解;原因——频谱特征相似;对策——对照时域波形(inspectrum)再定
- **重放需授权**:现象——未授权重放触发设备动作;原因——越界操作;对策——红线:仅授权目标
- **编码反转漏看**:现象——位流全反;原因——NRZ/Manchester 未识别;对策——试反相与编码模式组合
- **捕获不完整**:现象——帧被截断;原因——带宽不够/触发时机;对策——加宽带宽、延长采集、按同步字触发
````
- [ ] **Step 2: 结构校验**
Run: `npm test`
Expected: `OK: 97 skills validated`([[链接]]:re-iot-proto/re-protocol/re-crypto-id/re-crypto-decrypt/re-feedback 均存在)
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-sdr/SKILL.md
git commit -m "feat: re-sdr 技能——信号采集/解调/帧恢复/重放"
```
---
### Task 7: 挂载与计数同步
**Files:**
- Modify: `.claude/skills/re-analyze/references/rerouting.md`(A 表 RTTI 行)
- Modify: `.claude/skills/re-binary-core/SKILL.md`(子技能列表加 re-cpp-abi——**工作区修改,不提交该文件**)
- Modify: `.claude/skills/re-forensics/SKILL.md`(子技能列表加 re-attribution)
- Modify: `.claude/skills/re-ios/SKILL.md`(跨域联合加 [[re-macos]])
- Modify: `.claude/skills/re-hardware-io/SKILL.md`(跨域联合加 [[re-hw-chip]])
- Modify: `.claude/skills/re-ai-model/SKILL.md`(跨域联合加 [[re-ai-attack]])
- Modify: `.claude/skills/re-iot-proto/SKILL.md`(跨域联合加 [[re-sdr]])
- Modify: `README.md`(计数 91→97、78→84、导航 6 行——**注意:README 有用户未提交改动(安装方式重排),已在上轮随提交纳入;本任务 README 改动会叠加新计数,提交时含全部 README 改动**)
- Modify: `AGENTS.md`(91→97、78→84)
- Modify: `.claude-plugin/marketplace.json`(91→97)
**Interfaces:**
- Consumes: Task 1-6 的 6 个技能目录(链接可解析)
- Produces: 6 技能全库可达;计数 97 = 1 + 12 + 84
- [ ] **Step 1: rerouting.md RTTI 行更新**
`.claude/skills/re-analyze/references/rerouting.md` A 表 RTTI 行:
```
| RTTI/异常表(.pdata/.xdata)密集 | (re-cpp-abi 待建,先走 [[re-binary-core]]) |
```
改为:
```
| RTTI/异常表(.pdata/.xdata)密集 | [[re-cpp-abi]] |
```
- [ ] **Step 2: 网关与跨域挂载(6 处编辑)**
`.claude/skills/re-binary-core/SKILL.md` 子技能列表(含 re-anti-cheat 的那行)末尾追加 `、[[re-cpp-abi]]`(即 `re-anti-cheat、[[re-cpp-abi]]`——**本文件只做工作区修改,不 git add**)。
`.claude/skills/re-forensics/SKILL.md` 子技能列表末尾追加 `、[[re-attribution]]`。
`.claude/skills/re-ios/SKILL.md` 跨域联合节末尾追加一行:
```markdown
- 桌面 macOS 生态(签名/entitlements/Secure Enclave)→ [[re-macos]]
```
`.claude/skills/re-hardware-io/SKILL.md` 跨域联合节末尾追加一行:
```markdown
- 物理层芯片/PCB 分析(decap/裸片/木马检测)→ [[re-hw-chip]]
```
`.claude/skills/re-ai-model/SKILL.md` 跨域联合节末尾追加一行:
```markdown
- 模型攻击侧(提取/指纹水印/成员推断)→ [[re-ai-attack]]
```
`.claude/skills/re-iot-proto/SKILL.md` 跨域联合节末尾追加一行:
```markdown
- 射频信号级逆向(采集/解调/帧恢复)→ [[re-sdr]]
```
- [ ] **Step 3: 计数同步(3 文件)**
`README.md`:
- `## 技能导航(91)` → `## 技能导航(97)`
- `入口 → 12 大类网关 → 78 原子技能` → `入口 → 12 大类网关 → 84 原子技能`
- 第 5 行 `91 个逆向工程技能` → `97 个逆向工程技能`
- 导航列表:re-binary-core 行末尾加 `、re-cpp-abi`;re-forensics 行加 `、re-attribution`;新增两行:
- `- **re-macos**:macOS 应用逆向(签名/entitlements/Secure Enclave)`
- `- **re-hw-chip**:芯片/PCB 物理层(decap/裸片/木马检测)`
- `- **re-ai-attack**:模型攻击(提取/指纹/成员推断)`
- `- **re-sdr**:射频逆向(采集/解调/帧恢复)`
- 说明:README 已含用户安装方式重排改动(上轮随提交纳入),本次计数改动叠加后一并提交
`AGENTS.md`:
- `(91 个技能)` → `(97 个技能)`
- `原子技能(78)` → `原子技能(84)`
`.claude-plugin/marketplace.json`:
- `91 个技能` → `97 个技能`
- [ ] **Step 4: 校验**
Run: `npm test`
Expected: `OK: 97 skills validated`
Run: `grep -c "re-cpp-abi\|re-macos\|re-attribution\|re-hw-chip\|re-ai-attack\|re-sdr" README.md`
Expected: ≥ 6
- [ ] **Step 5: Commit(re-binary-core 除外)**
```bash
git add .claude/skills/re-analyze/references/rerouting.md .claude/skills/re-forensics/SKILL.md .claude/skills/re-ios/SKILL.md .claude/skills/re-hardware-io/SKILL.md .claude/skills/re-ai-model/SKILL.md .claude/skills/re-iot-proto/SKILL.md README.md AGENTS.md .claude-plugin/marketplace.json
git commit -m "增强: 6 技能挂载与计数同步 97(rerouting RTTI 行/网关与跨域/README-AGENTS-marketplace)"
```
**注意**:`re-binary-core/SKILL.md` 的工作区修改(re-cpp-abi 挂载)**不 git add、不提交**——与用户的未提交改动共存于工作区,由用户后续一并提交。提交后 `git status` 应显示 re-binary-core/SKILL.md 仍为 M。

View File

@@ -0,0 +1,258 @@
# 技能库第三轮扩充实施计划(2026-08-20)
## 总览
- 范围:5 新增 + 6 技能融合(8 章)+ 全库同步项(计数/导航/路由)
- 总数:107 → 112
- 设计依据:docs/superpowers/specs/2026-08-20-skill-wave-v3-design.md(归位决策已定案,勿改动)
- 工作流:每任务 = 实现 → 评审(技术事实核对 + 红线对照)→ npm test → commit → 下一任务
- 红线:呈现中性(禁「最推荐/强烈建议」)、隐私脱敏(不指向具体项目/公司/产品)、不绑定具体工具(跨 OS 安装命令/硬件选购指引)、git add 只加任务文件
## 任务顺序(关键:新技能先于引用它的融合任务,避免中间态死链)
1. re-flutter(新增)
2. re-rtos(新增)
3. re-mips(新增)
4. re-tee(新增)
5. re-harmonyos(新增)
6. re-hybrid-app(融合 RN/Hermes + [[re-flutter]] 链接)
7. re-iot-proto(融合 BLE + NFC 两章)
8. re-game(融合 Lua + Shader 两章)
9. re-hw-chip(融合侧信道一章)
10. re-fw-extract(融合 MCU 一章 + [[re-rtos]] 链接)
11. re-format-pe(融合 Delphi/VB6 一章)
12. 同步项(计数/README/triage/re-mobile 网关清单)
13. 最终全分支评审 + 修复波
每个新增技能完成后 npm test 允许有「指向未来任务的死链」?——不允许:validate.mjs 会 FAIL。因此**新增技能内部不允许链接未创建技能**;对未来的引用留到融合任务时再补(如 re-hybrid-app 的 [[re-flutter]] 在 Task 6 才写)。新增技能只链接已存在技能。
## 通用格式要求(所有任务)
- SKILL.md 结构:frontmatter(name=目录名、description 含触发词)→ # 标题 → ## 何时使用 / 何时不用 → ## 工具准备(跨 OS 安装命令 + 验证命令;硬件类给选购指引不绑型号)→ ## 操作步骤(编号、每步命令、存档习惯)→ 章节 → ## 跨域联合([[链接]])→ ## 常见坑与陷阱(**标题**:现象——…;原因——…;对策——… 格式)
- 触发词与既有技能不重叠(如 re-flutter 不抢 re-apk 的 smali 触发词)
- 坑条目 ≥3 条,每条含现象/原因/对策三要素
---
## Task 1:re-flutter(新增)
**目标文件**:`.claude/skills/re-flutter/SKILL.md`
**内容结构**:
- 何时用/不用:用 Flutter App(Android `libapp.so` / iOS App.framework、`libflutter.so`、`kernel_blob.bin`、assets 下 snapshot);不用纯原生 App([[re-apk]] / [[re-ios]])、不用 Web 版 Flutter
- 工具准备:python3(blob 结构解析)、strings/binutils、Ghidra(blob 反汇编与字符串交叉引用)、frida(动态侧,见 [[platform-tips]] 沙箱原则)、`--split-debug-info` 符号映射说明
- 操作步骤(编号):
1. 识别:`file` + `strings` 定位 libapp.so、检查 assets/flutter_assets 下的 kernel_blob.bin(debug 模式)vs AOT snapshot(release 模式)
2. snapshot 结构:Dart AOT snapshot 的 blobs 分区(ObjCode/rodata/instructions/strings/…)手动解析与字符串定位——strings blob 里找业务字符串,交叉引用回指令 blob
3. 符号还原:有 `--split-debug-info` 的 symbol 映射文件 → 名字直接映射;无映射 → 从字符串/`dart:` 库注册调用点反推
4. 引擎 vs 业务区分:libflutter.so 是引擎不分析(除非引擎层 hook),重点 libapp.so
5. 动态侧(沙箱):frida hook Dart VM 入口(`Dart_CreateRootLibrary` / 库注册)观察加载流程;Dart VM Service 可连时直接枚举 isolate/库
- 跨域联合:[[re-apk]]、[[re-ios]]、[[re-mobile]]、[[re-frida]]、[[re-hybrid-app]]
- 坑(至少 3):
- release 无 kernel_blob(只有 AOT)——别找 snapshot 文件
- 混淆后 Dart 名字是短名(tree-shaking/obfuscate)——用 symbol 映射或字符串定位,参考 [[re-go]] garble 思路(不写死链接,可提)
- 引擎代码混入业务 —— 按 libapp/libflutter 边界过滤
- frida 版本与设备匹配(沿用 re-frida 工具准备要求)
**验收**:npm test 通过(112 前为 107+1=108);无死链;触发词不撞 re-apk/re-hybrid-app
## Task 2:re-rtos(新增)
**目标文件**:`.claude/skills/re-rtos/SKILL.md`
**内容结构**:
- 何时用/不用:MCU/IoT 固件跑 FreeRTOS/ThreadX/Zephyr/RT-Thread;不用裸机固件(MCU 镜像基础走 [[re-fw-extract]])、不用 Linux 内核([[re-kernel]])
- 工具准备:Ghidra(结构体定义与任务表还原,ARM/ARM Thumb 处理器模块)、binwalk(镜像提取先行)、python3
- 操作步骤:
1. 前置:镜像提取与格式识别(链接 [[re-fw-extract]])
2. RTOS 识别:启动代码(reset handler → 系统初始化 → 调度器启动)、搜索调度器特征串/符号(`xTaskCreate`/`osKernelStart`/`_tx_thread_create`/`z_thread_entry` 类)、头部字符串
3. 任务表定位:FreeRTOS 的 `pxCurrentTCB`/任务链表静态区、ThreadX 的 `_tx_thread_created_list` 双向链表、Zephyr 的 `_kernel` 结构 —— 在 Ghidra 中定义结构体逐字段还原(优先级/状态/栈指针/任务名)
4. 任务栈识别:栈底/栈顶常量定位,按栈归属切分任务边界
5. 内核对象:队列/信号量/互斥/定时器 结构体定位,看板式从内核 API 调用点反推
6. 按任务拆分反编译:每个任务一个入口点,独立分析(对应 [[re-analyze]] 的单函数深分析)
- 跨域联合:[[re-fw-extract]]、[[re-fw-emulate]]、[[re-binary-core]]、[[re-mcu]](Task 10 后才建,Task 2 先不链接!)
- 坑(至少 3):
- 调度器启动前代码别当任务分析
- 任务名是调试符号,stripped 固件里没有——用栈指针/优先级特征定位
- 不同 RTOS 任务结构差异大(链表 vs 静态表)——先识别再定结构体
- RTOS 版本文本串可被混淆(新版本去掉字符串)——用结构特征兜底
**注意**:Task 2 不得链接 re-mcu(Task 10 才创建)。re-mcu 的引用由 Task 10 补写。
## Task 3:re-mips(新增)
**目标文件**:`.claude/skills/re-mips/SKILL.md`
**内容结构**:
- 何时用/不用:MIPS 固件/恶意软件(路由器/嵌入式)、MIPS 架构样本;不用 ARM/x86 系([[re-binary-core]] 通用底座)
- 工具准备:Ghidra/IDA 的 MIPS 处理器模块、binwalk(固件提取)、qemu-user 的 MIPS 模式(动态,沙箱原则)、python3
- 操作步骤:
1. 前置:固件提取([[re-fw-extract]])与架构确认(`file`/`readelf -h`)
2. 字节序判断:MIPS 大端/小端(`readelf` e_flags、字符串可读性)
3. 反编译注意:**延迟槽**(branch/jump 后一条指令仍执行——反汇编工具处理但手读代码时容易错位)、`$gp`/`$ra` 调用约定、GP 相对寻址(`.got` 重定位表)、`-mlong-calls` 跳板
4. 路由器固件专项:web 后端 httpd 定位(认证绕过/命令注入模式)、`/bin/busybox` 集成命令识别、固件配置与密码哈希提取
5. 动态验证(沙箱):qemu-user 跑 MIPS 样本或固件内程序,观察行为
- 跨域联合:[[re-fw-extract]]、[[re-fw-rootfs]]、[[re-binary-core]]、[[re-ghidra]]、[[re-vuln]]、[[re-sandbox]]
- 坑(至少 3):
- 延迟槽:分支后的指令在跳转前已执行——跟踪执行流时容易错
- 大小端判断错 → 指令全部乱
- `$gp` 相对引用没有重定位信息时靠基址猜测
- 路由器固件常见非标准头/压缩层(多步 binwalk)
## Task 4:re-tee(新增)
**目标文件**:`.claude/skills/re-tee/SKILL.md`
**内容结构**:
- 何时用/不用:TrustZone/OP-TEE/Trusted App/secure storage/设备密钥相关;不用 Windows 内核([[re-kernel]])、不用普通 App 层
- 工具准备:Ghidra/IDA(ARM64)、固件提取工具链([[re-fw-extract]])、frida/内核侧 hook([[re-frida]] 沙箱原则)、python3
- 操作步骤:
1. 架构定位:normal world vs secure world、SMC 指令与监控模式(EL3)、TEE OS 加载入口(bootrom/固件中定位)
2. OP-TEE 结构:core(可信 OS 内核)与 TA(可信应用)分离;TA 二进制格式(`.ta`:ELF with TA 头/签名)解析
3. TA 分析:入口(`TA_InvokeCommand`/命令分发表)、命令号枚举、secure storage 对象操作(`TEE_*` API 调用点)
4. 主机侧调用面:Linux 侧 `TEE_IOC_*` ioctl 结构、client 库调用序列——从两头夹逼 TA 的输入输出格式
5. 常见厂商差异(泛化表述,不指具体产品):自定义 TEE 的接口/结构差异处理思路
- 跨域联合:[[re-fw-extract]]、[[re-kernel]]、[[re-mobile]]、[[re-hw-chip]]、[[re-binary-core]]
- 坑(至少 3):
- TA 是签名+加密的固件镜像——先解密/验签流程再谈静态分析
- secure world 代码拿不到时用主机侧 ioctl 调用面反推
- 反调试:secure world 侧监测/防 dump 机制(泛化)
- SMC 参数传递寄存器约定(x0-x7 泛化)错误会导致完全误读
## Task 5:re-harmonyos(新增)
**目标文件**:`.claude/skills/re-harmonyos/SKILL.md`
**内容结构**:
- 何时用/不用:鸿蒙 App(hap/hsp/har)、ArkTS 字节码;不用普通 Android([[re-apk]])
- 工具准备:hap 解包工具(hap-tools 类,不绑定具体实现——给通用描述与备选)、python3、字符串/资源提取工具、[[re-java]] 思路复用(jadx 类工具针对 abc 的替代——泛化)
- 操作步骤:
1. 包结构:hap ≈ APK 变体(`module.json`、`resources/`、`ets/` 字节码目录、`.abc` 文件);解包流程与 APK 同源(zip 容器)
2. 字节码识别:`.abc`(ArkCompiler 字节码)文件头/段结构特征
3. 业务逻辑还原:字符串定位 + 反汇编(ArkCompiler 反汇编器思路)、JS/TS 业务资源提取(与 [[re-script-deob]] 方法衔接)
4. 与 Android 异同:无 dex/smali 层(跳过 [[re-apk]] 的 dex 环节)、资源与 manifest 结构类似(可复用 jadx 思路但目标格式不同)
5. 动态侧(沙箱):模拟器/真机运行时观察([[re-mobile]] 编排)
- 跨域联合:[[re-apk]]、[[re-hybrid-app]]、[[re-java]]、[[re-mobile]]、[[re-script-deob]]
- 坑(至少 3):
- 用 Android 工具直接开 hap 会漏 ets 目录——记住是双容器(zip + 内部资源)
- abc 反汇编器版本敏感(ArkCompiler 演进)——先识别编译版本
- 混淆后的 ArkTS 名字短名——字符串/资源定位兜底
## Task 6:re-hybrid-app(融合)
**目标文件**:`.claude/skills/re-hybrid-app/SKILL.md`
**内容**:追加「## React Native / Hermes」章节(位置在现有内容之后、跨域联合之前):
- 识别:`.hbc` 文件头魔数(`c61fbc03` 类)、RN 应用结构(`index.android.bundle` 类)
- Hermes 字节码:反汇编思路(hermesc 类工具)、内存布局/段特征
- JS bundle 提取:Metro 打包结构(`__d` 函数注册表类)、从 bundle 恢复业务 JS
- 原生桥接:NativeModules 定位(`TurboModule`/`NativeModules` 引用点)、桥接方法名与实现映射
- 动态:[[re-frida]] hook JS 运行时(`console.log`/模块加载点)
- 在现有 Flutter 段末尾补一句指向 [[re-flutter]](「Flutter 专项见 [[re-flutter]]」,不重复内容)
- 更新 frontmatter description 触发词补 Hermes/hbc
**验收**:章节格式与既有章节一致;[[re-flutter]] 链接有效(Task 1 已建);坑 ≥3 条(Hermes 版本差异、bundle 加密、字节码与明文 JS 混合等)
## Task 7:re-iot-proto(融合两章)
**目标文件**:`.claude/skills/re-iot-proto/SKILL.md`
**内容 A「## BLE 链路层」**:
- 嗅探:nRF 系硬件(泛化给选购指引)与主机软件抓包流程
- 广播/连接:广播包解析(ADV_IND/ADV_SCAN_IND 类)、连接事件时序、信道 37/38/39
- 配对加密:LE Legacy Pairing / LE Secure Connections 协商流程、LTK/STK 定位点、白名单/绑定密钥存储
- GATT:服务/特征枚举、handle 定位、读写通知点
- 与既有 MQTT/CoAP/Zigbee 章节并列
**内容 B「## NFC / 智能卡」**:
- ISO14443 帧结构、防冲突流程(UID/SAK 类)
- APDU 交互(CLA/INS/P1/P2/数据)、卡片应用定位
- MIFARE Classic:Crypto-1 弱点(重放/破解思路,泛化)、扇区密钥处理
- proxmark3 类设备流程(泛化选购)
**验收**:两章不重叠既有章节;坑 ≥3 条/章(或合并 ≥5);frontmatter 触发词补 BLE 链路/NFC/智能卡
## Task 8:re-game(融合两章)
**目标文件**:`.claude/skills/re-game/SKILL.md`
**内容 A「## 游戏脚本引擎(Lua)」**:
- Lua 字节码:header(签名/版本)、指令结构、常量表/upvalue 表定位
- 反汇编:luac 类工具思路;LuaJIT 字节码差异(不同版本)
- Cocos 系脚本资源提取:`.jsc`/`.luac` 混淆变体(XOR/头截断——参考 [[re-fw-extract]] 的 XOR 章节思路)
- 脚本 hook:[[re-frida]] 或内存侧 hook Lua 函数(`lua_pcall` 类入口)
**内容 B「## 图形与 Shader」**:
- SPIR-V:`spirv-dis` 反汇编、指令集结构
- DXIL/DXBC:dxc 反汇编思路、SM 版本识别
- GLSL 还原:spirv-cross 类工具(泛化)
- 找渲染入口:着色器加载点(文件/内存)、常量表定位
**验收**:两章格式一致;坑 ≥3/章;不抢 re-frida/re-script-deob 触发词
## Task 9:re-hw-chip(融合一章)
**目标文件**:`.claude/skills/re-hw-chip/SKILL.md`
**内容「## 侧信道与故障注入」**:
- SPA/DPA:功耗曲线采集原理、差分分析思路(密钥位相关性)、采集设备(chipwhisperer 类泛化选购指引)
- 故障注入:时钟毛刺/电压毛刺、glitch 宽度/相位定位流程、重放与结果判定(跳过分支/改返回值类)
- 与去封装衔接:已有章节的流程联动
- 安全边界提示:授权范围(沿用技能库使用边界)
**验收**:与现有去封装/裸片章节并列不冲突;坑 ≥3
## Task 10:re-fw-extract(融合一章)
**目标文件**:`.claude/skills/re-fw-extract/SKILL.md`
**内容「## MCU 镜像分析」**:
- 镜像格式:Intel HEX(.hex)/bin 差异、程序内存布局(flash 起始/中断向量表)
- 向量表定位:复位向量 → 启动代码(衔接 [[re-rtos]]:跑 RTOS 的固件)
- ISA 识别与反汇编:8051/AVR/PIC/MSP430 各自特征(Ghidra 处理器模块),熔丝位/配置位概念(泛化)
- 与既有 binwalk/magic 流程衔接(镜像提取后进入本节的判断条件)
**验收**:[[re-rtos]] 链接有效(Task 2 已建);坑 ≥3
## Task 11:re-format-pe(融合一章)
**目标文件**:`.claude/skills/re-format-pe/SKILL.md`
**内容「## 老运行时识别(Delphi / VB6)」**:
- Delphi VCL:RTTI 结构定位(类名/方法表)、vmt 定位、Borland 资源段(`.rsrc` 内特征)
- VB6:MSVBVM60 运行时特征(导入/资源)、入口定位(`WinMain` 类)
- 老壳注意:PECompact 类轻壳与 [[re-packer-id]] 衔接
- 识别先行:格式解析阶段就判断运行时(Delphi 的 `TApplication` 类串、VB6 的资源脚本特征)
**验收**:不抢 [[re-packer-id]] 触发词;坑 ≥3
## Task 12:同步项
**改动文件**:
1. `package.json` description:107 → 112
2. `.claude-plugin/marketplace.json` description(顶层):107 → 112(插件条目 description 无计数,不动)
3. `README.md`:首段「107 个逆向工程技能」→ 112;技能导航段:re-mobile 组 + re-flutter、re-harmonyos;re-firmware 组 + re-rtos;re-binary-core 组 + re-mips;re-tee 挂组按 Task 4 实现时定(默认 re-firmware 组);导航清单里同步各融合技能(不列章节,只保持技能名完整)
4. `.claude/skills/re-analyze/references/triage.md`:移动路径补 re-flutter/re-harmonyos;固件路径补 re-rtos
5. `.claude/skills/re-mobile/SKILL.md`:子技能清单 + [[re-flutter]] + [[re-harmonyos]]
6. `README.md` 安装段不动;marketplace.json 版本保持 0.0.2
**验收**:`grep -c` 全文无残留「107 个」;npm test 112 全绿;claude plugin validate 通过
## Task 13:最终全分支评审
- 全量 diff 复核(结构/红线 2/触发词重叠/坑格式)
- 技术事实抽查(延迟槽、Hermes 魔数、Dart snapshot、RTOS 结构、abc 格式、Crypto-1、SPIR-V 指令)
- npm test + claude plugin validate 双绿
- 台账更新 .superpowers/sdd/progress.md
## 评审清单(每任务)
- [ ] frontmatter name=目录名、description 含触发词、type=atomic
- [ ] 有「## 工具准备」(跨 OS 命令 + 验证)
- [ ] [[链接]] 全部存在(validate.mjs 强制)
- [ ] 红线 1:无最高级强推措辞
- [ ] 红线 2:无具体项目/公司/产品指代
- [ ] 不绑定具体工具(方法为核心,工具可替换)
- [ ] 坑条目含现象/原因/对策三要素
- [ ] 触发词不重叠
- [ ] npm test 全绿

View File

@@ -0,0 +1,44 @@
# zws 收藏库经验吸收实施计划(2026-08-20)
## 总览
- 范围:14 个融合吸收任务(99 候选 → ~40 条入库),技能数 112 不变
- 素材:/home/DslsDZC/rev-refs/extract-zws-*.md(已脱敏,7 文件)
- 设计依据:docs/superpowers/specs/2026-08-20-zws-absorption-design.md
- 流程:读素材+目标技能 → 查重(grep 关键词,同现象跳过/深化合并)→ 改写坑条目(现象/原因/对策)→ 追加进「## 常见坑与陷阱」→ 来源注明(仅 MIT/Apache)→ 脱敏对照 → npm test → commit
- 红线:呈现中性(禁「最推荐/强烈建议」)、隐私脱敏(无具体项目/公司/产品)、不绑定工具、git add 只加任务文件
## 任务表(全部可并行——不同目标文件)
| # | 目标 | 素材文件 | 候选条目 | 目标条数 | 来源注明 |
|---|---|---|---|---|---|
| 1 | re-flutter/SKILL.md | extract-zws-reverse-skills.md | 4,5,6,7,8,10,13,14,17,18 | 6-8 | (来源:reverse-skills(inliver233),MIT) |
| 2 | re-hybrid-app/SKILL.md | extract-zws-hermes.md | 2,3,5,7,11,14,15 | 5-7 | (来源:hermes-decomp(SymbioticSec),MIT) |
| 3 | re-script-deob/SKILL.md | extract-zws-hermes.md | 10,14 | 1-2 | (来源:hermes-decomp(SymbioticSec),MIT) |
| 4 | re-game/SKILL.md | extract-zws-cpp2il.md | 1,2,3,5,6,8 | 4-5 | (来源:Cpp2IL(SamboyCoding),MIT) |
| 5 | re-deobfuscate/SKILL.md | extract-zws-chernobog.md | 1,3,5,8,12,13,14,15 | 4-6(查重最严) | 不注源(无许可蒸馏) |
| 6 | re-python/SKILL.md | extract-zws-pyarmor.md | 1,2,3,5,7,9 | 4-5 | 不注源(无许可蒸馏) |
| 7 | re-patching/SKILL.md | extract-zws-reverse-skills.md | 9,11,12 | 2-3 | (来源:reverse-skills(inliver233),MIT) |
| 8 | re-mobile-pack/SKILL.md | extract-zws-reverse-skills.md | 20,21 | 2 | (来源:reverse-skills(inliver233),MIT) |
| 9 | re-apk/SKILL.md | extract-zws-reverse-skills.md | 19,25 | 2 | (来源:reverse-skills(inliver233),MIT) |
| 10 | re-frida/SKILL.md | extract-zws-reverse-skills.md | 22,23,24 | 2-3 | (来源:reverse-skills(inliver233),MIT) |
| 11 | re-analyze/references/(新增 analysis-tools.md 或入坑) | extract-zws-reva.md | 1,2,3,4,8,10,13 | 3-5 | (来源:ReVa(cyberkaida),Apache-2.0) |
| 12 | re-dotnet/SKILL.md | extract-zws-lazy.md | 1 | 1 | (来源:LazyReverse(a0yami),MIT) |
| 13 | re-ida/SKILL.md | extract-zws-lazy.md | 2 | 1 | (来源:LazyReverse(a0yami),MIT) |
| 14 | re-feedback/SKILL.md | extract-zws-reverse-skills.md | 26,27 | 1-2 | (来源:reverse-skills(inliver233),MIT) |
## 通用执行规则(实现者必读)
1. **读素材条目原文**(/home/DslsDZC/rev-refs/extract-zws-<file>.md 对应条目)→ 按现象/原因/对策改写为坑条目,不逐字复制素材文本
2. **查重**:`grep -n <主题关键词> <目标技能>/SKILL.md`;同现象已存在 → 跳过该条;内容更完整 → 深化合并(改写后覆盖原条)
3. **追加位置**:「## 常见坑与陷阱」列表末尾;有来源注明的素材在追加的坑条目末行加注(多条坑可共用一行注明或每条加,取每条加——与上轮 reverse-skill 吸收一致)
4. **坑格式**:`**标题**:现象——…;原因——…;对策——…`,三要素齐全
5. **脱敏对照**:素材已脱敏;入库时检查无具体项目/公司/产品名、无目标战役细节
6. **Task 11 特殊**:ReVa 方法论偏「编排/工具设计」,与 re-analyze 既有 references(analysis-contract/rerouting)比对——若条目与其思想重合度高且已覆盖,跳过或合并;真正新的(工具粒度/schema 宽容/后台作业轮询/脚本逃逸舱)写为坑条目或简短 references 说明(实现者自定,倾向坑条目)
7. **npm test** 必须全绿(112 不变);不新增/删除技能
8. 不 git add/commit(控制器统一提交)
## 验收
- 每任务:坑条目数达标、三要素齐全、来源注明正确(有则加无则无)、npm test 绿
- 终审:全波次复核 + 技术事实抽查(VLE 编码/位域头/metadata 版本考古/CFF 证据纪律/PyArmor 窗口/ReVa 轮询)

View File

@@ -0,0 +1,169 @@
# 深度波(现有技能加深度)实施计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 给现有全部技能加深度——T1 薄技能正文扩写至 ~130 行基线 + 全部技能按类型配 references/ 深度文件(每技能 2 个),技能计数不变(112,v4 落地后 118)。
**Architecture:** 纯技能文档扩展。映射表任务先产出 112 技能 × 类型 × 分层清单 → 样板任务(re-x64dbg/re-format-elf)用户定调 → T1/T2/T3 分层滚动(簇任务,每簇 3-5 技能)→ re-rtos/re-behavior 深度(v4 落地后)→ 终审波。深度文件主题命名(commands/gotchas/layout/examples/decision-tree),`[[链接]]` 目标 = 文件名去扩展名。
**Tech Stack:** Markdown / YAML frontmatter / validate.mjs(npm test,现有)。
**设计依据:** docs/superpowers/specs/2026-08-25-depth-wave-design.md(已提交 1c71097)——分层定义(§2)、类型-文件集映射(§3)、质量闸口(§5)以设计文档为准。
**并行协调:** wave-v4 计划(docs/superpowers/plans/2026-08-25-skill-wave-v4.md)同时执行。文件集隔离:本计划只碰现有技能(v4 的 6 新技能目录 + re-rtos/re-behavior/triage/rerouting/计数文件**不碰**);re-rtos/re-behavior 的深度产出放队列末尾(v4 落地后套用)。两计划不得交叉修改对方文件。
## Global Constraints
- **红线 1 呈现中性**:禁用「最推荐」「强烈建议」等最高级强推措辞(最多「推荐」)
- **红线 2 隐私脱敏**:内容不指向具体项目/公司/产品;硬件类给泛化选购指引
- **不绑定具体工具**:方法为核心,工具为可替换示例;「工具准备」按模板给跨 OS 安装命令
- validate.mjs:references/*.md 文件名(去扩展名)为合法 `[[链接]]` 目标;SKILL.md 的 `[[链接]]` 必须解析(深度文件内引用其他技能必须指向存在目标);正文扩写不破坏 frontmatter(`name`=目录名、`description` 非空、`type: atomic` 必含「## 工具准备」)与固定五节结构
- 事实核验:命令必须可执行、字段/格式断言以官方文档为准;抽查机制进终审波
- **commit 纪律**:每任务 commit 只 `git add` 本任务列出的文件,严禁 `git add -A`
- 当前分支 `main`;每任务 `npm test` 输出 `OK: 112 skills validated`(v4 落地后为 118)——深度波不改计数
- 输出不用 emoji
---
### Task 1: 映射表任务(112 技能 × 类型 × 分层)
**Files:**
- Create: `docs/superpowers/specs/2026-08-25-depth-wave-mapping.md`(映射表设计附录)
**Interfaces:**
- Consumes: 设计文档 §2(分层判定)§3(类型规则与代表技能)
- Produces: 映射表(后续每个簇任务据此确定成员与文件集)
- [ ] **Step 1: 生成映射表**
逐技能判定:分层(T1 <100 行 / T2 100-130 / T3 >130 / 网关)按 2026-08-25 实测行数;类型(工具/格式/方法论/领域混合→取主类型)按设计 §3 规则。每行:`技能 | 行数 | 分层 | 类型 | 文件集`。产出 `docs/superpowers/specs/2026-08-25-depth-wave-mapping.md`。
核查:112 行全量覆盖、T1+T2+T3+网关 = 112 闭环。
- [ ] **Step 2: 验证** — `node validate.mjs` → `OK: 112 skills validated`(映射表是 docs/ 文件,不影响计数)
- [ ] **Step 3: Commit** — `docs: 深度波映射表——112 技能 × 类型 × 分层`
### Task 2: 样板任务(re-x64dbg 工具类 + re-format-elf 格式类)
**Files:**
- Modify: `.claude/skills/re-x64dbg/SKILL.md`(正文扩写至 ~130 行)
- Create: `.claude/skills/re-x64dbg/references/commands.md`
- Create: `.claude/skills/re-x64dbg/references/gotchas.md`
- Modify: `.claude/skills/re-format-elf/SKILL.md`(正文适度补强)
- Create: `.claude/skills/re-format-elf/references/layout.md`
- Create: `.claude/skills/re-format-elf/references/examples.md`
**Interfaces:**
- Consumes: 设计文档 §4(样板审阅要点)
- Produces: 两个完整样板(正文 + 深度文件),供用户定调与后续批量任务同构参照
- [ ] **Step 1: re-x64dbg 深度产出**
正文扩写至 ~130 行基线(补:常用断点/跟踪命令组合、Scylla 插件流程、附加与启动两种模式差异);`references/commands.md`(命令速查/常用操作序列/组合套路,含断点命令族、内存读写、补丁导出);`references/gotchas.md`(工具特有坑 ≥3:x64dbg 与 olly 兼容差异、Scylla 使用注意、反调试检测绕过边界、版本差异)。
- [ ] **Step 2: re-format-elf 深度产出**
正文补强(补:section 头/程序头典型布局示例、动态链接结构解析要点);`references/layout.md`(ELF ehdr/phdr/shdr 字段表与偏移、常见 section 布局图);`references/examples.md`(最小解析示例:readelf 输出对照 + Python struct 解析 ehdr 示例 + 字节样例)。
- [ ] **Step 3: 验证** — `node validate.mjs` → `OK: 112 skills validated`(新增 references 文件为合法 [[链接]] 目标);`npm test` 全绿
- [ ] **Step 4: Commit** — `enhance: 深度样板——re-x64dbg(commands/gotchas)+ re-format-elf(layout/examples)`
- [ ] **Step 5: 用户审阅定调(评审闸口)**
向用户提交样板审阅:正文扩写密度与风格、深度文件骨架与命名、命令/示例颗粒度。用户确认或提出修改;定调后批量任务按样板同构执行。**未获确认前不得进入 Task 3。**
### Task 3-7: T1 批次(<100 行原子技能,约 18 个 → 4-5 簇任务)
**Files(每簇):**
- Modify: 簇内每个技能 `.claude/skills/<技能>/SKILL.md`(正文扩写至 ~130 行基线)
- Create: 簇内每个技能 2 个深度文件(按映射表类型:`references/commands.md`+`gotchas.md` / `layout.md`+`examples.md` / `decision-tree.md`+`gotchas.md`)
**Interfaces:**
- Consumes: Task 1 映射表(簇成员)、Task 2 样板(同构参照)
- Produces: T1 全部技能达标(正文基线 + 深度文件)
- [ ] **Step 1: 簇内技能逐一深度产出**
每个技能:正文扩写至 ~130 行基线——保持五节结构,补缺章节(工具类补命令组合与验证、格式类补布局与示例、方法论类补决策树与反例),正文内新增 `[[链接]]` 必须指向存在目标;按映射表类型创建 2 个 references/ 深度文件(骨架按样板同构)。
- [ ] **Step 2: 验证** — `node validate.mjs` → `OK: 112 skills validated`;`npm test` 全绿
- [ ] **Step 3: Commit** — `enhance: 深度 T1 簇<编号>——<技能名列表>(正文基线 + 深度文件)`
(簇划分由 Task 1 映射表确定;预估 4-5 簇,每簇 3-5 技能,主题相邻优先:如工具类簇、格式类簇、方法论类簇、领域混合簇。)
### Task 8-19: T2 批次(100-130 行,48 个 → 10-12 簇任务)
**Files(每簇):**
- Modify: 簇内技能 `.claude/skills/<技能>/SKILL.md`(正文适度补强:补缺章/示例/坑,无硬基线)
- Create: 关键者(判定规则见设计 §2)2 个深度文件;非关键者本批次不建
**Interfaces:**
- Consumes: Task 1 映射表、Task 2 样板
- Produces: T2 全部技能正文补强、关键者配深度文件
- [ ] **Step 1: 簇内技能逐一补强**
正文补强:对照五节模板找出缺口(工具类缺验证命令/版本差异、格式类缺布局说明、方法论类缺边界/反例),补至内容自洽;关键者(跨域引用 ≥2 或网关/triage 直接引用)创建深度文件,骨架按样板同构。
- [ ] **Step 2: 验证** — `node validate.mjs` → `OK: 112 skills validated`;`npm test` 全绿
- [ ] **Step 3: Commit** — `enhance: 深度 T2 簇<编号>——<技能名列表>(正文补强 + 关键者深度文件)`
### Task 20-26: T3 批次(>130 行,约 33 个 → 6-7 簇任务)
**Files(每簇):**
- Create: 簇内每个技能 2 个深度文件(按映射表类型)
**Interfaces:**
- Consumes: Task 1 映射表、Task 2 样板
- Produces: T3 技能深度文件(正文不动)
- [ ] **Step 1: 簇内技能逐一创建深度文件**
正文不动;按映射表类型创建 2 个 references/ 深度文件(内容从现有正文提炼 + 扩展:命令组合/布局图/决策树 + 新坑),骨架按样板同构;深度文件内 `[[链接]]` 指向存在目标。
- [ ] **Step 2: 验证** — `node validate.mjs` → `OK: 112 skills validated`;`npm test` 全绿
- [ ] **Step 3: Commit** — `enhance: 深度 T3 簇<编号>——<技能名列表>(深度文件)`
### Task 27: re-rtos / re-behavior 深度产出(v4 落地后)
**Files:**
- Modify: `.claude/skills/re-rtos/SKILL.md`(按 v4 扩章后的最终形态补强,如需要)
- Create: `.claude/skills/re-rtos/references/decision-tree.md` + `gotchas.md`(方法论类文件集)
- Create: `.claude/skills/re-behavior/references/decision-tree.md` + `gotchas.md`
**Interfaces:**
- Consumes: v4 计划 Task 7/8 完成(两技能扩章落地)、Task 1 映射表、Task 2 样板
- Produces: 两技能深度文件(与 v4 扩章内容衔接)
- [ ] **Step 1: 确认 v4 扩章已落地**
`git log` 确认 re-rtos/re-behavior 的 v4 扩章 commit 存在;若未落地,本任务挂起(不得与 v4 并发修改同一文件)。
- [ ] **Step 2: 创建深度文件**
按方法论类文件集创建 4 个文件;内容覆盖 v4 新增章节(re-rtos 的 VxWorks/QNX/INTEGRITY 决策要点、re-behavior 的行为监控工具链使用决策)。
- [ ] **Step 3: 验证** — `node validate.mjs` → `OK: 118 skills validated`(v4 已落地);`npm test` 全绿
- [ ] **Step 4: Commit** — `enhance: 深度 re-rtos/re-behavior——v4 扩章配套深度文件`
### Task 28: 终审修复波
**Files:** 视修复结果(全库)
**Interfaces:**
- Consumes: Task 2-27 完成
- Produces: 全库深度达标、无死链、事实与红线复核通过
- [ ] **Step 1: 全库审查**
- `node validate.mjs` / `npm test` 全绿
- grep 检查:新增 references/ 文件名均为合法链接目标(validate 已保证);SKILL.md 结构未被破坏(抽查五节顺序)
- 事实抽查:每簇至少 1 条关键断言核对(命令可执行性 / 格式字段官方依据),必要时 web 核实
- 红线对照:无强推措辞、无具体项目/产品指向
- 深度文件与正文重复度抽查(避免 references 与 SKILL.md 大段重复)
- [ ] **Step 2: 修复与提交**
修复发现项(每文件独立 commit:`fix: 深度终审——<内容>`);全部完成后最终 `node validate.mjs` → `OK: 112 skills validated`(v4 落地后 118)+ `npm test` 全绿。
---
**最终验证**:`node validate.mjs` 输出 `OK: 112 skills validated`(v4 落地后 `OK: 118 skills validated`);`npm test` 22 单测全绿;`git log` 含本计划全部任务 commit。

View File

@@ -0,0 +1,304 @@
# wave-v4(覆盖缺口波)实施计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 新增 6 个原子技能(re-arm/re-riscv/re-console/re-electron/re-javacard/re-ebpf)+ 2 处扩章(re-rtos +VxWorks/QNX/INTEGRITY、re-behavior +行为监控工具链),技能总数 112 → 118。
**Architecture:** 纯技能文档扩展。6 个新技能目录(SKILL.md 按 docs/skill-template.md 原子技能规范,内容按设计文档 §3 各节)+ 2 处扩章(第 4 节)+ 挂载同步(triage/rerouting/网关子技能列表/跨域引用)+ 计数同步(README/AGENTS/marketplace.json)。
**Tech Stack:** Markdown / YAML frontmatter / validate.mjs(npm test,现有)。
**设计依据:** docs/superpowers/specs/2026-08-25-skill-wave-v4-design.md(已提交 f7e4db9)——每任务的技能内容骨架(边界/工具/步骤/坑)以设计文档对应小节为准,本计划不重复整文。
**并行协调:** 深度波计划(docs/superpowers/plans/2026-08-25-depth-wave.md)同时执行。文件集隔离:本计划只碰 6 新技能目录 + re-rtos/re-behavior/triage/rerouting/网关列表/计数文件;深度波只碰其余现有技能。两计划不得交叉修改对方文件。
## Global Constraints
- **红线 1 呈现中性**:禁用「最推荐」「强烈建议」等最高级强推措辞(最多「推荐」)
- **红线 2 隐私脱敏**:内容不指向具体项目/公司/产品;硬件类给泛化选购指引
- **不绑定具体工具**:方法为核心,工具为可替换示例;「工具准备」按模板给跨 OS 安装命令(Linux/macOS/Windows/WSL 分支)
- validate.mjs:frontmatter `name`=目录名、`description` 非空(中英触发词)、`type: atomic` 必含「## 工具准备」、`[[链接]]` 必须解析;新技能先于引用它的同步任务(避免中间态死链)
- 事实核验:命令必须可执行、格式/字段断言以官方文档为准(必要时 web 核实),技术事实由实现时抽查,终审波复核
- **commit 纪律**:每任务 commit 只 `git add` 本任务列出的文件,严禁 `git add -A`
- 当前分支 `main`;`npm test` 预期按任务标注递增(112 → 118)
- 输出不用 emoji
---
### Task 1: 创建 re-arm 技能
**Files:**
- Create: `.claude/skills/re-arm/SKILL.md`
**Interfaces:**
- Consumes: 设计文档 §3.1(边界/工具/步骤/坑)
- Produces: 技能目录 `re-arm`(供 Task 9 的 [[re-arm]] 链接解析;计数 112 → 113)
- [ ] **Step 1: 撰写 SKILL.md**
按 docs/skill-template.md 五节结构 + 设计文档 §3.1 撰写。frontmatter:
```yaml
---
name: re-arm
description: >
ARM 架构逆向(非 Android):Cortex-M/A 向量表、Thumb/ARM 切换、AAPCS 调用约定、位置相关代码重定位、MMIO 外设寄存器交叉。
触发词:ARM、arm32、Cortex-M、Cortex-A、Thumb、AAPCS、嵌入式逆向、裸机固件、stm32、向量表。
---
```
「工具准备」必含:Ghidra/IDA(架构导入与 Thumb 支持)、`readelf`/`file`、`qemu-arm`/`qemu-aarch64`(用户态仿真)、`gdb-multiarch`、binwalk(联动 re-fw-extract),跨 OS 安装命令 + 验证命令。
「何时使用 / 何时不用」:明确排除 Android so(→ re-android-native)、通用 AArch64 Linux 用户态(→ re-binary-core)。
「操作步骤」6 步按设计 §3.1(架构确认 → 入口定位 → Thumb 边界 → 重定位 → AAPCS → 外设 xref)。
「常见坑与陷阱」≥3 条按设计 §3.1 列表。
- [ ] **Step 2: 验证**
Run: `node validate.mjs`;`npm test`
Expected: `OK: 113 skills validated`;22 单测全绿。
- [ ] **Step 3: Commit**
```bash
git add .claude/skills/re-arm/SKILL.md
git commit -m "feat: 新增 re-arm——ARM 架构逆向(Cortex-M/A、Thumb、AAPCS、MMIO),113/118"
```
### Task 2: 创建 re-riscv 技能
**Files:**
- Create: `.claude/skills/re-riscv/SKILL.md`
**Interfaces:**
- Consumes: 设计文档 §3.2
- Produces: 技能目录 `re-riscv`(供 Task 9 的 [[re-riscv]] 链接解析;计数 113 → 114)
- [ ] **Step 1: 撰写 SKILL.md**
frontmatter:
```yaml
---
name: re-riscv
description: >
RISC-V 架构逆向:RV32/RV64、压缩指令(RVC)、gp 相对寻址、ABI 与 ecall 系统调用约定、工具链指纹。
触发词:RISC-V、riscv、RV32、RV64、RVC、压缩指令、ecall、ESP32-C3、GD32V。
---
```
五节按设计 §3.2;「工具准备」含 Ghidra(RISC-V 支持)、`qemu-riscv64/32`、binutils 交叉工具链(`riscv64-unknown-elf-objdump`)、readelf;「操作步骤」7 步;「坑」≥3 条按设计。
- [ ] **Step 2: 验证** — `node validate.mjs` → `OK: 114 skills validated`;`npm test` 全绿
- [ ] **Step 3: Commit** — `feat: 新增 re-riscv——RISC-V 架构逆向(RVC/gp/ABI/ecall),114/118`
### Task 3: 创建 re-console 技能
**Files:**
- Create: `.claude/skills/re-console/SKILL.md`
**Interfaces:**
- Consumes: 设计文档 §3.3
- Produces: 技能目录 `re-console`(供 Task 9 的 [[re-console]] 链接解析;计数 114 → 115)
- [ ] **Step 1: 撰写 SKILL.md**
frontmatter:
```yaml
---
name: re-console
description: >
现代主机与复古平台逆向:Switch NSO/NPDM 容器与加密分区、PS4/PS5 ORBIS 结构、SDK 库指纹;复古 ROM 头/卡带格式/存档与 Cheat 码。
触发词:主机逆向、Switch、NSO、NPDM、PS4、PS5、ORBIS、Xbox、复古、ROM、NES、GBA、模拟器、Cheat。
---
```
五节按设计 §3.3;「何时不用」显式声明改机/盗版授权边界;「工具准备」含通用反编译器 + 平台容器工具(hactoolnet 类,**实现时 web 核实工具名与可用性**)+ 模拟器调试器 + 卡带读取器选购指引;「操作步骤」6 步(含复古存档/Cheat 小节);「坑」≥3 条。
- [ ] **Step 2: 验证** — `node validate.mjs` → `OK: 115 skills validated`;`npm test` 全绿
- [ ] **Step 3: Commit** — `feat: 新增 re-console——现代主机(NSO/NPDM/ORBIS)与复古平台逆向,115/118`
### Task 4: 创建 re-electron 技能
**Files:**
- Create: `.claude/skills/re-electron/SKILL.md`
**Interfaces:**
- Consumes: 设计文档 §3.4
- Produces: 技能目录 `re-electron`(供 Task 9 的 [[re-electron]] 链接解析;计数 115 → 116)
- [ ] **Step 1: 撰写 SKILL.md**
frontmatter:
```yaml
---
name: re-electron
description: >
Electron 桌面应用逆向:asar 解包、主/渲染进程 JS、V8 字节码(.jsc)边界、CDP 动态调试、反调试对抗。
触发词:Electron、asar、桌面应用逆向、.jsc、V8 快照、CDP、ELECTRON_RUN_AS_NODE、devtools 检测。
---
```
五节按设计 §3.4;「工具准备」含 `npx asar extract` 类解包、Node/Electron 版本识别、CDP 客户端、strings、通用反编译器;「操作步骤」7 步(静态 → 动态 → 对抗);「坑」≥3 条按设计(.jsc 边界注明限制)。
- [ ] **Step 2: 验证** — `node validate.mjs` → `OK: 116 skills validated`;`npm test` 全绿
- [ ] **Step 3: Commit** — `feat: 新增 re-electron——Electron 桌面应用逆向(asar/CDP/.jsc),116/118`
### Task 5: 创建 re-javacard 技能
**Files:**
- Create: `.claude/skills/re-javacard/SKILL.md`
**Interfaces:**
- Consumes: 设计文档 §3.5
- Produces: 技能目录 `re-javacard`(供 Task 9 的 [[re-javacard]] 链接解析;计数 116 → 117)
- [ ] **Step 1: 撰写 SKILL.md**
frontmatter:
```yaml
---
name: re-javacard
description: >
Java Card / SIM 卡 applet 逆向:CAP 文件九组件解析、CAP 字节码(Java 子集)还原、AID 与安装参数、process(APDU) 分派。
触发词:Java Card、javacard、CAP 文件、SIM 卡、USIM、applet、AID、银行卡、JCVM。
---
```
五节按设计 §3.5;「工具准备」含 CAP 解析(开源解析器或自写 Python 脚本,实现时核实可用解析器)、Ghidra/IDA 无原生 CAP 支持说明、`javap` 对照、读卡器选购指引 + 授权边界;「操作步骤」6 步;「坑」≥3 条。
- [ ] **Step 2: 验证** — `node validate.mjs` → `OK: 117 skills validated`;`npm test` 全绿
- [ ] **Step 3: Commit** — `feat: 新增 re-javacard——Java Card/SIM applet(CAP 组件/字节码还原),117/118`
### Task 6: 创建 re-ebpf 技能
**Files:**
- Create: `.claude/skills/re-ebpf/SKILL.md`
**Interfaces:**
- Consumes: 设计文档 §3.6
- Produces: 技能目录 `re-ebpf`(供 Task 9 的 [[re-ebpf]] 链接解析;计数 117 → 118)
- [ ] **Step 1: 撰写 SKILL.md**
frontmatter:
```yaml
---
name: re-ebpf
description: >
eBPF 程序逆向与对抗分析:BPF-64 指令集、progs/maps 关联、bpftool 反汇编、跟踪取证/恶意样本/EDR 对抗三用途。
触发词:eBPF、BPF、bpftool、bcc、libbpf、xlated、BPF 指令、bpf hook、EDR 对抗、tracepoint、kprobe。
---
```
五节按设计 §3.6;「工具准备」含 `bpftool`(`prog dump xlated`/`feature`)、`llvm-objdump -d bpf`、pyelftools、专用逆向工具(实现时核实,如 bpf-gazelle 类)、受控环境(联动 re-sandbox);「操作步骤」5 步;「坑」≥3 条(helper 调用号版本漂移对策写明按版本查表)。
- [ ] **Step 2: 验证** — `node validate.mjs` → `OK: 118 skills validated`;`npm test` 全绿
- [ ] **Step 3: Commit** — `feat: 新增 re-ebpf——eBPF 程序逆向与对抗(BPF-64/progs-maps/xlated),118/118`
### Task 7: re-rtos 扩章(VxWorks/QNX/INTEGRITY)
**Files:**
- Modify: `.claude/skills/re-rtos/SKILL.md`(frontmatter 触发词、正文 +3 章、跨域联合 +[[re-automotive]]、「何时使用」扩一句商业 RTOS)
**Interfaces:**
- Consumes: 设计文档 §4.1
- Produces: re-rtos 覆盖 7 个 RTOS(计数不变)
- [ ] **Step 1: 扩写 SKILL.md**
- frontmatter description 触发词追加:`VxWorks、QNX、INTEGRITY`
- 正文按现有四章同构追加三章(每章:TCB/内核对象关键字段 → 定位方法 → 特征串):
- **VxWorks**:WIND_TCB(任务名表/栈指针/优先级字段)、VxWorks 7 结构变化、任务名串特征定位
- **QNX**:线程控制块(procnto 微内核)、MsgSend/MsgReceive 消息传递调度链、车机中控场景
- **INTEGRITY**:分区(partitions)内存布局、任务/进程表结构、航电/工业场景特征
- 跨域联合追加 `[[re-automotive]]`(QNX 车机联动)
- [ ] **Step 2: 验证** — `node validate.mjs` → `OK: 118 skills validated`;`npm test` 全绿
- [ ] **Step 3: Commit** — `enhance: re-rtos 扩章——VxWorks/QNX/INTEGRITY 三章 + 车机联动`
### Task 8: re-behavior 扩章(行为监控工具链)
**Files:**
- Modify: `.claude/skills/re-behavior/SKILL.md`(追加「行为监控工具链」一节)
**Interfaces:**
- Consumes: 设计文档 §4.2
- Produces: re-behavior 覆盖 Windows 行为监控(计数不变)
- [ ] **Step 1: 扩写 SKILL.md**
正文追加一节「行为监控工具链(Windows)」:
- **ProcMon**:过滤/标注/CSV 导出关联(进程→文件→注册表→网络时间线)、过滤语法要点
- **API Monitor**:API 级 hook 链与调用参数记录(与 re-tracing 的 strace/ltrace 对应)
- **ETW**:会话与事件解析(logman/wevtutil 命令;采集侧视角,与 re-evasion 绕过侧互补)
- **Process Explorer**:进程树/句柄/签名验证视图要点
- 仅 Windows 工具在「工具准备」注明跨 OS 约束(Linux 侧对应走 [[re-tracing]])
- [ ] **Step 2: 验证** — `node validate.mjs` → `OK: 118 skills validated`;`npm test` 全绿
- [ ] **Step 3: Commit** — `enhance: re-behavior 扩章——Windows 行为监控工具链(ProcMon/API Monitor/ETW/PE)`
### Task 9: 挂载同步(triage / rerouting / 网关列表 / 跨域引用)
**Files:**
- Modify: `.claude/skills/re-analyze/references/triage.md`(路由表补分支)
- Modify: `.claude/skills/re-analyze/references/rerouting.md`(A/B 表补行)
- Modify: `.claude/skills/re-binary-core/SKILL.md`(子技能列表补 [[re-arm]]/[[re-riscv]])
- Modify: `.claude/skills/re-managed/SKILL.md`(子技能列表补 [[re-electron]]/[[re-javacard]])
- Modify: `.claude/skills/re-game/SKILL.md`(跨域联合补 [[re-console]])
- Modify: `.claude/skills/re-iot-proto/SKILL.md`(跨域联合补 [[re-javacard]])
- Modify: `.claude/skills/re-fw-emulate/SKILL.md`(架构识别节补 [[re-arm]]/[[re-riscv]])
**Interfaces:**
- Consumes: Task 1-6 的技能目录([[链接]] 解析目标)
- Produces: 新技能可被发现(计数不变)
- [ ] **Step 1: triage.md 补路由**
按现有路由表行式逐行核对,补:
- 固件行:`→(ARM 架构 → re-arm;RISC-V → re-riscv)`
- 托管行:`→(Electron 应用 → re-electron;Java Card/SIM → re-javacard)`
- 游戏行:`→(现代主机/复古 → re-console)`
- [ ] **Step 2: rerouting.md 补证据→技能行**
A/B 表补行(至少 5 行):`.NSO/NPDM` 结构 → re-console;BPF ELF section(.BTF/.maps)→ re-ebpf;CAP 文件头(`0xDE 0xCA` 类魔数,实现时按 CAP 规范核实)→ re-javacard;asar 结构(`files` 目录 + app.asar)→ re-electron;VxWorks/QNX 特征串 → re-rtos;MMIO 外设区 + Thumb 特征 → re-arm。
- [ ] **Step 3: 网关子技能列表与跨域引用**
re-binary-core 子技能行补 `[[re-arm]]`、`[[re-riscv]]`(对标 `[[re-mips]]` 行);re-managed 子技能行补 `[[re-electron]]`、`[[re-javacard]]`;re-game 跨域联合补 `[[re-console]]`;re-iot-proto 跨域联合补 `[[re-javacard]]`;re-fw-emulate 架构识别节补 `[[re-arm]]`/`[[re-riscv]]`。
- [ ] **Step 4: 验证** — `node validate.mjs` → `OK: 118 skills validated`(无死链);`npm test` 全绿
- [ ] **Step 5: Commit** — `enhance: 挂载同步——triage/rerouting 路由补 6 技能 + 网关列表与跨域引用`
### Task 10: 计数同步(README / AGENTS / marketplace.json)
**Files:**
- Modify: `README.md`(技能数 112 → 118,按实际表述核对)
- Modify: `AGENTS.md`(技能数 112 → 118)
- Modify: `marketplace.json`(逐字段核对,有技能数/版本则同步)
**Interfaces:**
- Consumes: Task 1-9 完成
- Produces: 全库计数一致(118)
- [ ] **Step 1: 计数替换**
grep 全库 `112` 相关技能数表述(README/AGENTS/marketplace.json 及他处),逐一更新为 118;不含数字的其他字段不动。
- [ ] **Step 2: 验证** — `node validate.mjs` → `OK: 118 skills validated`;`npm test` 全绿
- [ ] **Step 3: Commit** — `docs: 计数同步 112 → 118(README/AGENTS/marketplace)`
### Task 11: 终审修复波
**Files:** 视修复结果(全库)
**Interfaces:**
- Consumes: Task 1-10 完成
- Produces: 全库一致、无死链、事实与红线达标
- [ ] **Step 1: 全库审查**
- `node validate.mjs` / `npm test` 全绿
- grep 检查:6 新技能触发词与 description 一致性、[[链接]] 全部可解析(validate 已保证)、计数 118 一致
- 技术事实抽查:每个新技能至少 1 条关键断言核对(命令可执行性 / 格式字段官方依据),必要时 web 核实
- 红线对照:新内容无强推措辞、无具体项目/产品指向
- [ ] **Step 2: 修复与提交**
修复发现项(每文件独立 commit:`fix: 终审——<内容>`);全部完成后最终 `node validate.mjs` → `OK: 118 skills validated` + `npm test` 全绿。
---
**最终验证**:`node validate.mjs` 输出 `OK: 118 skills validated`;`npm test` 22 单测全绿;`git log` 含本计划全部任务 commit。

View File

@@ -0,0 +1,416 @@
# 事实核查波(监控报告对账后修复)实施计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 处理 2026-09-12 至 2026-09-29 ChatGPT 监控对话中的 121 条报告项——30 条已修不动,91 条未修项经实测判定后,对确证成立者修正内容、补回归断言、回填审查状态。
**Architecture:** 先出判定表(逐条给出实测证据与结论:采纳/驳回/部分采纳),再按**技能文件集**分组串行修复(每个技能只归一个任务,避免同文件并发修改)。两条「安装矩阵收敛」任务(rizin / binwalk)先落地源侧单一事实源,其余任务改写各自的副本指回源侧。终审波统一补断言与审查记录。
**Tech Stack:** Markdown / YAML frontmatter / Node ESM 工具链(`validate.mjs`、`bin/capindex.mjs`、`bin/auditstate.mjs`)/ node:test。
**设计依据:** 本次对账的三份本地产物(`/analysis/` 下,gitignore 已排除,不进公开仓库):
- `analysis/chatgpt-share-6abc3084.txt` —— 对话全文(238 条消息)
- `analysis/unfixed-report.md` —— 121 条修复状态对账(含 A/B/C 三类判定与文件:行证据)
- `analysis/findings.json` —— 报告项结构化数据(F001–F121)
已确立的前提:**「未修」不等于「是缺陷」**。
**判定已完成(2026-09-30)**:95 条逐条判定——采纳 70、部分成立 9、**驳回 11**、已修 5。判定表见
`docs/audit/2026-09-30-adjudication.md`(提交 f532491),依据与改法以该表为准。
**驳回的 11 条(F022 / F034 / F035 / F036 / F047 / F052 / F069 / F072 / F080 / F110 / F111)
严禁出现在任何 `fix:` 提交里**——改动它们等于把正确内容改错。Task 5 Step 1 与 Task 6 Step 1
已按此改写作废步骤。各任务的「Consumes」栏引用的判定结论,以判定表中该条目的「改法」列为准;
标「不改」的即跳过。
**并行协调:** 本计划任务**串行执行**(后一任务依赖前一任务 commit);执行期间不得与其他计划交叉修改同一技能目录。文件集隔离见各任务 Files 清单。
## Global Constraints
- **红线 1 呈现中性**:禁用「最推荐」「强烈建议」等最高级强推措辞(最多「推荐」)
- **红线 2 隐私脱敏**:内容不指向具体项目/公司/产品;本波源自一份对话记录,**改写时只保留技术结论,不得把对话里的措辞、引用标记(`filecite`/`cite` 残留)、模型署名带进技能**
- **红线 3 不用 emoji**:文档与提交信息一律纯文本
- **红线 4 事实核验**:每条改动必须附实测证据(PyPI/官方文档/源码/本地实跑命令与输出),禁止「按报告照改」。仓库历史上多处断言因想当然出错,本波尤其要求先证后改
- **红线 5 授权边界**:内容边界不变,不因修 bug 引入新的绕过/破解类操作指引
- **内容边界**:`.claude/skills/` 只写「是什么/怎么做」——**不写审查历史**(日期戳、finding 编号、progress 标记、`docs/audit/` 引用)。判定过程与编号一律留在 `docs/audit/`
- **validate 约束**:frontmatter 的 `name`=目录名、`description` 非空且含 CJK+拉丁、`capabilities` 标签须在注册表内、正文 `[[链接]]` 必须解析(**先建文件再加链接**)
- **commit 纪律**:每任务 commit 只 `git add` 本任务列出的文件,**严禁 `git add -A`**
- 每任务收尾 `npm test` 必须输出 `OK: 122 skills validated` 且全绿;改动 `capabilities` 时先跑 `node bin/capindex.mjs`
- 当前分支 `main`;本波**不改技能总数**(122)
---
### Task 1: 判定表(91 条未修项逐条实测)
**Files:**
- Create: `docs/audit/2026-09-30-adjudication.md`(判定表)
- Modify: `docs/audit/2026-09-13-factual-audit.md`(追加「补充 33:监控报告对账波——判定表」小节,指向判定表)
**Interfaces:**
- Consumes: `analysis/unfixed-report.md`(A/B/C 三类清单)、`analysis/findings.json`(F001–F121 原文)
- Produces: 判定表——后续每个修复任务的输入;每条给出 `F 编号 | 目标文件:行 | 报告主张 | 实测证据 | 结论(采纳/驳回/部分采纳)| 改法`
- [ ] **Step 1: 逐条实测**
对 A 类(约 53 项)与 B 类(14 条)逐条取证。取证手段按类型:
- 版本/依赖类 → 查官方元数据(`curl -sS https://pypi.org/pypi/<pkg>/json` 的 `info.version` 与 `requires_python`);GitHub 发行用 `https://github.com/<owner>/<repo>/releases.atom`(API 有未认证限流)
- 格式/常量类 → 官方规范、头文件(如 Apple `loader.h`、Linux `elf.h`)、工具源码,必要时本地编译/构造样本实跑
- 命令/API 类 → 能用则本地实跑(`--help`、最小样例),不能实跑则注明依据来源
- 判定规则同仓库既有做法:**报告主张逐条列出,逐条给反证或佐证**;证不成立即驳回,并写明「驳回也要有证据链」
- [ ] **Step 2: 落表并标注排序**
按目标技能聚合写入判定表;标注每条的结论与依赖(如「依赖 Task 2 的源侧结论」)。**C 类 3 条单列一节**,写明报告错在哪、仓库写法为何正确,供日后防止「照报告把正确内容改错」。
- [ ] **Step 3: 验证** — `node validate.mjs` → `OK: 122 skills validated`(判定表在 `docs/`,不影响技能结构)
- [ ] **Step 4: Commit** — `docs: 监控报告对账判定表——91 条未修项逐条实测`
- [ ] **Step 5: 用户确认(评审闸口)**
提交判定表摘要:采纳/驳回/部分采纳各多少条,其中拟驳回的条目与理由。**未获确认前不得进入 Task 2。**
### Task 2: rizin 安装矩阵收敛(源侧)
**Files:**
- Modify: `.claude/skills/re-radare2/SKILL.md`(定为 rizin 安装的**单一事实源**)
- Modify: `.claude/skills/re-radare2/references/gotchas.md`(radare2 版本代际)
**Interfaces:**
- Consumes: Task 1 判定表中 rizin Debian 包状态与 r2 当前版本的实测结论
- Produces: rizin 安装矩阵(Debian/Ubuntu、Kali、Arch、Fedora/RHEL 分列)+ r2 版本基线;Task 13 据此改写六个副本
- [ ] **Step 1: 定矩阵**
按判定表结论重写安装段:Debian/Ubuntu 用官方 release 二进制或 `rz-pm`(**删除无条件的 `apt install rizin`**);Kali 可 apt;Arch `pacman -S`;Fedora/RHEL 按当前仓库实际情况;每类给出 `rizin -v` 验证。**不保留未经核实的版本门槛猜测**(如「Debian 13+」)。同处修正被报告指为过时的 Fedora 行。
- [ ] **Step 2: 版本代际** — `references/gotchas.md` 的 r2 版本基线按实测更新,不写死 patch 号则改为「以官方 Releases Latest 为准」
- [ ] **Step 3: 验证** — `node validate.mjs`;`npm test` 全绿
- [ ] **Step 4: 回填** — `node bin/auditstate.mjs update re-radare2`
- [ ] **Step 5: Commit** — `fix: re-radare2 定为 rizin 安装单一事实源 + r2 版本基线更新`
### Task 3: binwalk 安装矩阵收敛(源侧)
**Files:**
- Modify: `.claude/skills/re-fw-extract/SKILL.md`(定为 binwalk 安装的**单一事实源**)
**Interfaces:**
- Consumes: Task 1 判定表中 binwalk 上游当前形态(v2 Python 包 vs v3 Rust 端口)的实测结论
- Produces: binwalk 安装段(含版本形态与验证命令);Task 8 / Task 9 / Task 14 据此改写副本
- [ ] **Step 1: 定矩阵** — 按实测结论重写安装段,删除「pip 版版本新、跨平台(推荐)」这类未经核实的比较,写明当前推荐形态与 `binwalk --version` 验证方式
- [ ] **Step 2: 验证** — `node validate.mjs`;`npm test` 全绿
- [ ] **Step 3: 回填** — `node bin/auditstate.mjs update re-fw-extract`
- [ ] **Step 4: Commit** — `fix: re-fw-extract 定为 binwalk 安装单一事实源`
### Task 4: 版本基线组(re-ghidra / re-angr / re-ai-model)
**Files:**
- Modify: `.claude/skills/re-ghidra/SKILL.md`
- Modify: `.claude/skills/re-angr/SKILL.md` + `.claude/skills/re-angr/references/gotchas.md`
- Modify: `.claude/skills/re-ai-model/SKILL.md`
**Interfaces:**
- Consumes: Task 1 判定表(Ghidra 12.1.4 已发布、angr 10.0.0 / `>=3.12`、onnx 1.23)
- Produces: 三处版本基线更新;re-angr 同时是 angr Python 矩阵的全库单一事实源
- [ ] **Step 1: re-ghidra** — 版本行改为按官方 Releases Latest 表述,不写死 patch 号(若确需 patch 号再写);JDK 要求按判定表结论(12.2 未进入正式 Releases 前不改)
- [ ] **Step 2: re-angr** — 主线版本与 Python 下限按实测更新;**同步检查**引用方 `re-crypto-decrypt` / `re-exploit` 是否已指向本技能(已指向,勿再复制矩阵)
- [ ] **Step 3: re-ai-model** — onnx 版本与 Python 下限
- [ ] **Step 4: 验证** — `node validate.mjs`;`npm test` 全绿
- [ ] **Step 5: 回填** — `node bin/auditstate.mjs update re-ghidra re-angr re-ai-model`
- [ ] **Step 6: Commit** — `fix: 版本基线——Ghidra / angr / onnx 三处按实测更新`
### Task 5: re-format-elf(字段语义组)
**Files:**
- Modify: `.claude/skills/re-format-elf/SKILL.md`
- Modify: `.claude/skills/re-format-elf/references/layout.md`
**Interfaces:**
- Consumes: Task 1 判定表(ELF gABI 字段定义、glibc `dlopen` 对缺 `PT_GNU_STACK` 的实际行为、`DT_SYMENT` 的 ELF32/64 差异)
- Produces: 修正后的字段表与步骤;**消除本技能内部的两处自相矛盾**
- [ ] **Step 1: `e_entry` 语义 — 已作废,不改**(判定表 F036/F047/F069/F110 驳回)
报告称「DYN 下为相对基址的偏移」是事实错误。实测反证:gABI ch5 定义 base address = 内存地址与文件
虚拟地址之差,对 executable/shared object 是同一常量;Linux `fs/binfmt_elf.c:1245` 即
`e_entry = elf_ex->e_entry + load_bias;`——DYN 下 `e_entry` 本就是相对 base 的值,仓库措辞与该模型
一致,且从未称其为文件偏移/RVA。`p_vaddr` 行同理。**本步骤不执行任何修改**,仅保留此记录防止
后续有人照报告把正确措辞改错。
- [ ] **Step 2: `DT_SYMENT`** — 删除固定 24 字节的写法,按 ELFCLASS 分别给出(或写明以 `DT_SYMENT` 实际值为准)
- [ ] **Step 3: `.fini_array` 定位** — `SKILL.md` 步骤 3 标题不再把 `.fini_array` 与 `.init_array` 并列为「main 之前执行」;与同文件坑项(fini 在退出清理阶段)对齐
- [ ] **Step 4: Canary 判定** — 删除「符号表出现 `__stack_chk_fail` ⇒ 有 Canary」的等价关系,改为「存在引用 ⇒ 有带该保护的编译单元」,并说明与"该二进制启用了栈保护"的区别
- [ ] **Step 5: `PT_GNU_STACK` 缺失** — `SKILL.md` 与 `references/layout.md` 两条表述统一到同一结论(缺失时的实际行为依 ABI/glibc 版本而异,不写成必然 `EINVAL`,也不写成必然可执行栈),按判定表实测结论落笔
- [ ] **Step 6: 验证** — `node validate.mjs`;`npm test` 全绿
- [ ] **Step 7: 回填** — `node bin/auditstate.mjs update re-format-elf`
- [ ] **Step 8: Commit** — `fix: ELF 字段语义 4 项——DT_SYMENT / fini_array / Canary / PT_GNU_STACK`
### Task 6: re-format-macho(load command 组)
**Files:**
- Modify: `.claude/skills/re-format-macho/SKILL.md`
- Modify: `.claude/skills/re-format-macho/references/layout.md` + `references/examples.md`
**Interfaces:**
- Consumes: Task 1 判定表(`LC_DYLD_INFO(_ONLY)` 的信息流条数、`cmdsize` 对齐规则)。注意 `LC_MAIN.entryoff` 一条已驳回,不在本任务范围
- Produces: 修正后的入口定位与 dyld 信息表描述
- [ ] **Step 1: `LC_MAIN.entryoff` — 已作废,不改**(判定表 F034 驳回)
报告称语义与入口 VA 公式写错。实测反证:Apple `loader.h` 注释 `file (__TEXT) offset of main()`;
dyld `common/MachOAnalyzer.cpp:627` 为 `startAddress = preferredLoadAddress() + mainCmd->entryoff`;
本机用 `ld64.lld` 造 Mach-O 实测 `__TEXT.vmaddr=0x100000000`、`entryoff=0x330`、`_main=0x100000330`
精确命中。仓库公式与 Apple 实现一致。**本步骤不执行任何修改**。
- [ ] **Step 2: LC 最小长度** — 修正「64 位下 LC 最小 16 字节」的说法(按结构体实际对齐规则)
- [ ] **Step 3: `LC_DYLD_INFO(_ONLY)`** — 补 `weak_bind`,删除「四张表」的计数表述;同步 `references/layout.md` 的三处
- [ ] **Step 4: 验证** — `node validate.mjs`;`npm test` 全绿
- [ ] **Step 5: 回填** — `node bin/auditstate.mjs update re-format-macho`
- [ ] **Step 6: Commit** — `fix: Mach-O load command 2 项——LC 最小长度 / LC_DYLD_INFO 信息流`
### Task 7: 格式判定组(re-format-pe / re-cpp-abi / re-unpack-simple / re-triage)
**Files:**
- Modify: `.claude/skills/re-format-pe/SKILL.md`
- Modify: `.claude/skills/re-cpp-abi/SKILL.md`
- Modify: `.claude/skills/re-unpack-simple/SKILL.md`
- Modify: `.claude/skills/re-triage/SKILL.md`
**Interfaces:**
- Consumes: Task 1 判定表(Delphi VMT 布局版本差异、Itanium RTTI 布局、PE `CheckSum` 的加载期作用、`DF_1_PIE` 判据)
- Produces: 四技能的判定规则修正
- [ ] **Step 1: re-format-pe** — Delphi VMT 负偏移表按版本分开(经典 vs XE2+),或改为「以自指指针双向校验为主、偏移仅作候选」;「死导入检测」不再由「IAT 项未被 `.text` 直接引用」单向推导动态解析,改为列出多因并给出区分判据
- [ ] **Step 2: re-cpp-abi** — `std::type_info` 布局不写死位宽;lambda closure type 的 RTTI 表述改为「按需发射」,明确「缺 `_ZTI` 不能排除 lambda」,并与步骤 5、坑项两处对齐
- [ ] **Step 3: re-unpack-simple** — 把 `CheckSum` 从「与 `SizeOfImage`/`NumberOfSections` 并列的加载失败原因」中拆出,写明各自的实际作用域
- [ ] **Step 4: re-triage** — PIE 判定补 `DF_1_PIE`(`readelf -d`)判据,删除「`ET_DYN` = PIE」的直接映射
- [ ] **Step 5: 验证** — `node validate.mjs`;`npm test` 全绿
- [ ] **Step 6: 回填** — `node bin/auditstate.mjs update re-format-pe re-cpp-abi re-unpack-simple re-triage`
- [ ] **Step 7: Commit** — `fix: 格式判定 4 技能——Delphi VMT / RTTI 与 lambda / PE CheckSum / PIE 判据`
### Task 8: CPU/ISA 组(re-arm / re-mips / re-riscv / re-console / re-tee)
**Files:**
- Modify: `.claude/skills/re-arm/SKILL.md`
- Modify: `.claude/skills/re-mips/SKILL.md`
- Modify: `.claude/skills/re-riscv/SKILL.md`
- Modify: `.claude/skills/re-console/SKILL.md`
- Modify: `.claude/skills/re-tee/references/gotchas.md`
**Interfaces:**
- Consumes: Task 1 判定表(Armv6-M 实际指令集、AAPCS32/64 的 Thumb 位规则、MIPS Branch Likely 的 annul 语义、RISC-V binutils 包名、SM83 ISA、SMCCC 调用约定)。**RISC-V 入口定位一条已驳回,不在本任务范围**、Task 3 的 binwalk 源侧结论
- Produces: 五处 ISA/ABI 判定修正;re-arm / re-mips / re-console 的 binwalk 副本指回 `[[re-fw-extract]]`
- [ ] **Step 1: re-arm** — 删除「Cortex-M0/M0+ 只有 16 位 Thumb」及「32 位指令是反汇编幻觉」的表述,按 Armv6-M 实际指令集改写(三处:变体说明、BL 距离、坑项);虚表函数指针的 Thumb 位规则限定到 AArch32 并写明 AAPCS64 下的差异(两处)
- [ ] **Step 2: re-mips** — 延迟槽不再写成「无条件执行」,补 Branch Likely 的 annul/nullify 语义(步骤 + 坑项两处)
- [ ] **Step 3: re-riscv** — 只改一处:binutils 安装与验证命令一一对应(装 `binutils-riscv64-linux-gnu` 就验 `riscv64-linux-gnu-objdump`;需要裸机 triplet 则单列 `binutils-riscv64-unknown-elf`)。**入口定位那句不改**——判定表 F052 驳回:该句本身已写「动态链接程序先经 ld.so(PT_INTERP)」,`gdb starti /bin/ls` 实测首条指令确在 ld.so
- [ ] **Step 4: re-console** — SM83 不再描述成 Z80 变体,删除「用 Z80 近似」的默认路径,改为专用 SM83 language/loader 或明确标注近似;与同文件坑项对齐
- [ ] **Step 5: re-tee** — `HVC`/`SMC` 不再简化成「EL2 用 HVC、EL3 用 SMC」,按调用者 EL 与目标 EL 拆开(并检查 x1–x17 的 SMCCC 版本限定)
- [ ] **Step 6: binwalk 副本** — re-arm / re-mips / re-console 三处改写为引用 `[[re-fw-extract]]` 的安装矩阵,删除各自复制的 `pip install binwalk` 比较性描述
- [ ] **Step 7: 验证** — `node validate.mjs`;`npm test` 全绿
- [ ] **Step 8: 回填** — `node bin/auditstate.mjs update re-arm re-mips re-riscv re-console re-tee`
- [ ] **Step 9: Commit** — `fix: CPU/ISA 判定 5 技能——Armv6-M / Thumb 位 / MIPS 延迟槽 / RISC-V binutils / SM83 / SMCCC`
### Task 9: 调用约定组(re-shellcode / re-pwn)
**Files:**
- Modify: `.claude/skills/re-shellcode/SKILL.md`
- Modify: `.claude/skills/re-pwn/SKILL.md`
**Interfaces:**
- Consumes: Task 1 判定表(x86-64 SysV 栈对齐的准确条件、`%N$` 参数槽语义、Windows x86 调用约定现状)、Task 3 的 binwalk 源侧结论
- Produces: 三处调用约定/栈布局修正
- [ ] **Step 1: re-shellcode** — 删除「Win32 默认 stdcall」的概括,按实际(编译器/调用约定声明)改写;binwalk 副本指回 `[[re-fw-extract]]`
- [ ] **Step 2: re-exploit — 栈对齐不改**(判定表 F111 驳回)。仓库「`call` 时 `$rsp % 16 == 0`」与 psABI 原文 "immediately before the call instruction is executed" 逐字对应;探针实测 `call printf` 前 `rsp%16==0` 正常、`==8` 触发 `movaps` SIGSEGV,`ret` 转移场景同样成立。本技能本波**无改动项**
- [ ] **Step 3: re-pwn** — `%N$...` 的参数槽描述改为「第 N 个位置参数(前若干走寄存器)」,删除自相矛盾的注释;**pwntools 版本保持现状**(判定表已驳回,勿改)
- [ ] **Step 4: 验证** — `node validate.mjs`;`npm test` 全绿
- [ ] **Step 5: 回填** — `node bin/auditstate.mjs update re-shellcode re-pwn`
- [ ] **Step 6: Commit** — `fix: 调用约定 2 技能——stdcall / printf 参数槽`
### Task 10: Frida 组(re-frida / re-frida-script-author)
**Files:**
- Modify: `.claude/skills/re-frida/SKILL.md`
- Modify: `.claude/skills/re-frida/references/frida-scripts.md`(如涉及)
- Modify: `.claude/skills/re-frida-script-author/SKILL.md`
**Interfaces:**
- Consumes: Task 1 判定表(Objection 当前 CLI 形态、Frida host 与 frida-server 的实际兼容规则、Frida 17 Java bridge 的实际情况)
- Produces: Frida 工具链用法与版本兼容表述修正
- [ ] **Step 1: Objection** — 启动命令按当前版本更新(两处);安装说明补 Python 下限或指向官方要求
- [ ] **Step 2: 版本兼容** — 删除「host 与 frida-server 版本必须完全一致」,按实际的兼容规则(major 一致 + 官方兼容矩阵)改写,协议错误不再单一归因版本号
- [ ] **Step 3: Java bridge** — 修正 Frida 17 后 Java bridge 的获取方式描述
- [ ] **Step 4: re-frida-script-author** — 删除/限定发行版包管理器作为 Frida CLI 等价安装方式的表述(注明非 upstream 渠道)
- [ ] **Step 5: 验证** — `node validate.mjs`;`npm test` 全绿
- [ ] **Step 6: 回填** — `node bin/auditstate.mjs update re-frida re-frida-script-author`
- [ ] **Step 7: Commit** — `fix: Frida 工具链 2 技能——Objection / 版本兼容 / Java bridge / 安装渠道`
### Task 11: iOS 组(re-ios / re-ios-jb)
**Files:**
- Modify: `.claude/skills/re-ios/SKILL.md`
- Modify: `.claude/skills/re-ios/references/gotchas.md` + `references/commands.md`
- Modify: `.claude/skills/re-ios-jb/SKILL.md`(引用点同步)
**Interfaces:**
- Consumes: Task 1 判定表(FairPlay 解密方案的当前实践、越狱工具与 iOS 版本对应关系)
- Produces: 脱壳路径改写 + 越狱矩阵更新
- [ ] **Step 1: 脱壳路径** — 原版 `frida-ios-dump` 从默认工具准备路径降级为 legacy/参考实现(写明所需 Frida 世代),默认流程改为按目标 iOS/jailbreak 选择当前适配的维护实现;删除「clone → pip install → 直接运行」的当前安装路径。**与 Task 10 的 Frida 版本结论保持一致**
- [ ] **Step 2: 越狱矩阵** — `references/gotchas.md` 的 unc0ver 版本范围按当前实际更新
- [ ] **Step 3: 引用点同步** — `re-ios-jb/SKILL.md` 中指向脱壳步骤的三处同步;`references/commands.md` 的工具族说明同步
- [ ] **Step 4: 验证** — `node validate.mjs`;`npm test` 全绿
- [ ] **Step 5: 回填** — `node bin/auditstate.mjs update re-ios re-ios-jb`
- [ ] **Step 6: Commit** — `fix: iOS 脱壳路径与越狱矩阵 2 技能`
### Task 12: 工具用法组(re-ida / re-gdb / re-patching / re-binaryninja)
**Files:**
- Modify: `.claude/skills/re-ida/SKILL.md` + `references/commands.md`
- Modify: `.claude/skills/re-gdb/SKILL.md`
- Modify: `.claude/skills/re-patching/SKILL.md`
- Modify: `.claude/skills/re-binaryninja/SKILL.md` + `references/gotchas.md`
**Interfaces:**
- Consumes: Task 1 判定表(IDA 无头可执行文件名、Pwndbg 当前安装方式、`pesign` 的删除签名用法、Binary Ninja 当前主版本与其 Python/扩展系统变化)
- Produces: 四处工具用法修正;re-ida 的传播面(`re-plugin-dev` / `re-deobfuscate` / `re-license`)以引用方式收敛
- [ ] **Step 1: re-ida** — 无头模式命令按实际可执行文件名与参数改写;**传播面**:`re-plugin-dev`、`re-deobfuscate`、`re-license` 三处不再各自复制命令,改为引用 `[[re-ida]]`
- [ ] **Step 2: re-gdb** — Pwndbg 安装方式按当前官方推荐更新;`re-pwn` 的引用说明同步(**注意与 Task 9 的文件集边界:`re-pwn/SKILL.md` 归 Task 9,本任务只改 `re-gdb`**,如需改 re-pwn 则在 Task 9 完成后再单独提一条修正)
- [ ] **Step 3: re-patching** — `pesign` 删除签名的正确用法
- [ ] **Step 4: re-binaryninja** — 版本说明按当前主版本与其 Python/扩展系统变化更新
- [ ] **Step 5: 验证** — `node validate.mjs`;`npm test` 全绿
- [ ] **Step 6: 回填** — `node bin/auditstate.mjs update re-ida re-gdb re-patching re-binaryninja`
- [ ] **Step 7: Commit** — `fix: 工具用法 4 技能——IDA 无头 / Pwndbg / pesign / Binary Ninja`
### Task 13: rizin 副本同步组(re-deobfuscate / re-unpack-advanced / re-variant / re-license / re-imports)
**Files:**
- Modify: `.claude/skills/re-deobfuscate/SKILL.md`
- Modify: `.claude/skills/re-unpack-advanced/SKILL.md`
- Modify: `.claude/skills/re-variant/SKILL.md`
- Modify: `.claude/skills/re-license/SKILL.md`
- Modify: `.claude/skills/re-imports/SKILL.md`
**Interfaces:**
- Consumes: **Task 2 的 rizin 安装矩阵**(本任务不得自行发明发行版结论)
- Produces: 五个副本收敛为引用 `[[re-radare2]]`;同仓库对 rizin 安装的结论归一
- [ ] **Step 1: 逐个改写** — 删除本地复制的 `apt install rizin` 矩阵,改为引用 `[[re-radare2]]` 的安装矩阵;`re-license` 作为替代工具入口的说明同步
- [ ] **Step 2: re-deobfuscate 的绑定** — 同一文件内 Rizin 自动化驱动改用 Rizin 侧绑定(`rzpipe`),删除 `r2pipe` 作为 Rizin 驱动方式的表述(三处)
- [ ] **Step 3: 验证** — `grep -rn "apt install rizin" .claude/skills/` 应只剩 `re-radare2` 内的说明性提及;`npm test` 全绿
- [ ] **Step 4: 回填** — `node bin/auditstate.mjs update re-deobfuscate re-unpack-advanced re-variant re-license re-imports`
- [ ] **Step 5: Commit** — `fix: rizin 安装五处副本收敛到 re-radare2 单一事实源`
### Task 14: 取证与固件组(re-rtos / re-packer-id / re-memdump / re-mem-forensics / re-fw-emulate / re-dotnet)
**Files:**
- Modify: `.claude/skills/re-rtos/SKILL.md`
- Modify: `.claude/skills/re-packer-id/SKILL.md`
- Modify: `.claude/skills/re-memdump/SKILL.md`
- Modify: `.claude/skills/re-mem-forensics/SKILL.md`
- Modify: `.claude/skills/re-fw-rootfs/SKILL.md`(同源 p7zip 行)
- Modify: `.claude/skills/re-fw-emulate/references/gotchas.md`
- Modify: `.claude/skills/re-dotnet/SKILL.md`
**Interfaces:**
- Consumes: Task 1 判定表(gcore 的适用边界、Volatility 2 的归档状态、qemu-system 的默认网络行为、Arch 包名现状)、Task 3 的 binwalk 源侧结论
- Produces: 六处取证/仿真类修正
- [ ] **Step 1: re-rtos / re-packer-id** — binwalk 副本指回 `[[re-fw-extract]]`
- [ ] **Step 2: re-memdump** — 默认转储方式改为符合平台经验的方案(gcore 的适用边界写明),传播面(`re-analyze/references/platform-tips.md`、`re-forensics`、`re-loader`)一并核对;Volatility 2 标注为已归档的兼容分支而非等价「按需」选项
- [ ] **Step 3: re-mem-forensics / re-fw-rootfs** — 7-Zip 包名按当前发行版现状(两处同源行一并处理)
- [ ] **Step 4: re-fw-emulate** — 删除「qemu-system 默认 `-net none`」的前提,改为按实际默认行为给隔离建议
- [ ] **Step 5: re-dotnet** — Arch 的 Mono 安装说明按当前官方仓库状态
- [ ] **Step 6: 验证** — `node validate.mjs`;`npm test` 全绿
- [ ] **Step 7: 回填** — `node bin/auditstate.mjs update re-rtos re-packer-id re-memdump re-mem-forensics re-fw-emulate re-dotnet`
- [ ] **Step 8: Commit** — `fix: 取证与仿真 6 技能——转储方式 / Volatility 2 / 包名 / qemu 网络 / Mono`
### Task 15: 协议与加密组(re-tls / re-proto-rev / re-crypto-decrypt / re-crypto-id / re-apk)
**Files:**
- Modify: `.claude/skills/re-tls/SKILL.md`
- Modify: `.claude/skills/re-proto-rev/SKILL.md`
- Modify: `.claude/skills/re-crypto-decrypt/SKILL.md`
- Modify: `.claude/skills/re-crypto-id/SKILL.md`
- Modify: `.claude/skills/re-apk/references/gotchas.md` + `references/commands.md`
**Interfaces:**
- Consumes: Task 1 判定表(TLS 1.3 的 ALPN 落点、TCP 字节流与应用层消息的边界、JPEG/PNG 结束标记的实际行为、分组/流密码的可区分特征、zipalign 与签名方案的当前关系)
- Produces: 五处协议/加密判定修正
- [ ] **Step 1: re-tls** — ALPN 最终协商结果的落点按 RFC 改写(TLS 1.3 与 1.2 分开表述)
- [ ] **Step 2: re-proto-rev** — 流程中补 TCP 流重组与应用层 framing 阶段,不再把 segment payload 当 message(步骤与示例同步)
- [ ] **Step 3: re-crypto-decrypt** — 结束标记的取法改为按格式规范(JPEG 需处理嵌入缩略图等情形),删除「第一个 vs 最后一个」的简化断言;`re-fw-extract` 内的同源表述一并核对(**注意文件集:如需改 `re-fw-extract` 则在 Task 3 已完成的基础上追加,勿与其他任务并发**)
- [ ] **Step 4: re-crypto-id** — 删除「按分组对齐区分分组/流密码」的决策规则,改为多判据并列(并说明反例)
- [ ] **Step 5: re-apk** — zipalign 与 v1/v2/v3 的关系按当前构建工具链实际行为改写(两处)
- [ ] **Step 6: 验证** — `node validate.mjs`;`npm test` 全绿
- [ ] **Step 7: 回填** — `node bin/auditstate.mjs update re-tls re-proto-rev re-crypto-decrypt re-crypto-id re-apk`
- [ ] **Step 8: Commit** — `fix: 协议与加密 5 技能——ALPN / TCP 重组 / 结束标记 / 密码分组 / zipalign`
### Task 16: 杂项组(re-go / re-android-native / re-ebpf / re-automotive / re-emulation)
**Files:**
- Modify: `.claude/skills/re-go/SKILL.md`
- Modify: `.claude/skills/re-android-native/SKILL.md` + `references/probes.md`
- Modify: `.claude/skills/re-ebpf/SKILL.md`
- Modify: `.claude/skills/re-automotive/SKILL.md`
- Modify: `.claude/skills/re-emulation/references/gotchas.md`
**Interfaces:**
- Consumes: Task 1 判定表(`LD_PRELOAD` 对 Go 程序的实际边界、`crypto/cipher.NewGCM` 的参数语义、JNI 函数表的规范布局、eBPF helper 号的稳定性、UDS 下载流程的实际状态机形态、Capstone 当前版本形态)
- Produces: 五处修正;**消除 re-android-native 的槽位自相矛盾**
- [ ] **Step 1: re-go** — `LD_PRELOAD` 条目按实际边界改写(Go 静态链接与否、`cgo` 参与时的差异),不再绝对化;加密密钥定位不再把 `NewGCM` 的第一个参数当 AES 密钥
- [ ] **Step 2: re-android-native** — `RegisterNatives` 等槽位按 JNI 规范的固定布局表述(写明 index 与「byte offset = index × 指针宽度」的换算),删除「槽号随 jni.h/NDK/ART 漂移」的建模;`references/probes.md` 的探测策略相应改为「确认 `JNIEnv*` 有效性 / hook 表检测 / 非标准实现」,与 `references/experience.md` 已写死的槽位值对齐
- [ ] **Step 3: re-ebpf** — helper 号的稳定性按规范改写(枚举为追加式,不以"漂移"描述),保留「以内核源码为准」的核对建议
- [ ] **Step 4: re-automotive** — UDS 下载流程不再写成固定四步序列,按实际可选路径(含 `0x31`/`0x37` 的变体)表述。**udsoncan 示例保持现状**(判定表已驳回,勿改)
- [ ] **Step 5: re-emulation — 不改**(判定表 F080 驳回)。PyPI 稳定版仍是 5.0.9,6.x 仅有 `6.0.0a1–a11` 预发行,仓库「当前 5.0.x」准确。6.0.0 正式发行后再复核
- [ ] **Step 6: 验证** — `node validate.mjs`;`npm test` 全绿
- [ ] **Step 7: 回填** — `node bin/auditstate.mjs update re-go re-android-native re-ebpf re-automotive re-emulation`
- [ ] **Step 8: Commit** — `fix: 杂项 4 技能——LD_PRELOAD / JNI 槽位 / eBPF helper / UDS 流程`
### Task 17: 运行时基线(Node)
**Files:**
- Modify: `package.json`(`engines.node`)
- Modify: `CLAUDE.md`
- Modify: `bin/wxsource.mjs`(注释中的版本表述)
- Modify: 其余 `>=18` 表述所在文件(先 `grep -rn ">=18" --include="*.md" --include="*.json" --include="*.mjs" .` 确认全集;`docs/superpowers/`、`analysis/` 为存档/本地产物,不改)
**Interfaces:**
- Consumes: Task 1 判定表(当前受支持 LTS 与 EOL 版本表)
- Produces: 全库运行时基线统一
- [ ] **Step 1: 定基线** — 按判定表结论提升 `engines.node`;同步文档表述与安装器/CI 的前置检查(如存在)
- [ ] **Step 2: 一致性** — `grep` 确认无残留旧基线;确认无代码依赖新基线以下版本才有的特性说明
- [ ] **Step 3: 验证** — `npm test` 全绿(本机 Node 版本需满足新基线)
- [ ] **Step 4: Commit** — `chore: 运行时基线提升——engines.node 与文档同步`
### Task 18: 终审波(断言 + 回填 + 审查记录)
**Files:**
- Modify: `tests/audit-regressions.test.mjs`(新增本波回归断言)
- Modify: `docs/audit/review-state.json`(Task 2-17 未回填项补齐)
- Modify: `docs/audit/2026-09-13-factual-audit.md`(追加「补充 34:监控报告对账波——落地与固化」)
- Modify: `docs/audit/tool-register.json`(如本波涉及工具的使用点/核验状态变化,跑 `node bin/toollife.mjs check` 后同步)
**Interfaces:**
- Consumes: Task 2-17 全部完成
- Produces: 回归断言、审查记录、状态回填闭环
- [ ] **Step 1: 补回归断言**
按仓库既有 `absent` / `present` 助手(注意 `NEGATION` 词表——迁移说明会刻意写出旧写法)为本波每条采纳项加断言:错的说法不得写回、修正后的表述必须在位。**每条断言注释里写明对应的判定表条目**(不含日期戳进技能内容,注释在测试文件内不受「技能不写审查历史」约束)。
- [ ] **Step 2: 变异测试** — 抽查 3-5 条:把技能写回旧表述,断言应精准失败;还原后全过(仓库既有做法,防止断言空转)
- [ ] **Step 3: 全库审查** — `node validate.mjs` → `OK: 122 skills validated`;`node bin/capindex.mjs --check`;`node bin/toollife.mjs check`;`node bin/probelist.mjs --check`;`npm test` 全绿
顺带修正一处既有计数漂移:`CLAUDE.md:45` 写「`npm test` = validate + **103** 项测试」,实际为 132 项(`tests/counts.test.mjs` 覆盖了技能计数但未覆盖测试计数)。改为实际值,并按仓库「把约定变成检查」的做法把该计数纳入 `counts.test.mjs`。
- [ ] **Step 4: 红线对照** — 抽查本波改动文件:无强推措辞、无对话残留(`filecite`、模型署名、日期戳、finding 编号)、无 emoji
- [ ] **Step 5: 回填与记录** — `node bin/auditstate.mjs status` 确认无遗漏;审查记录追加到 `docs/audit/`
- [ ] **Step 6: Commit** — `fix: 审查修复波——监控报告对账落地(回归断言 + 记录固化)`
---
**最终验证**:`node validate.mjs` → `OK: 122 skills validated`;`npm test` 全绿(现有 103 项 + 本波新增断言);`git log` 含本计划全部任务 commit;`node bin/auditstate.mjs status` 显示本波技能均为「已复核未变」。
**收尾提醒**:C 类 3 条(udsoncan `ClientConfig`、pwntools 4.15.0、Capstone 6)**不得**出现在任何 `fix:` 提交里——判定表已给出驳回证据,改动它们属于把正确内容改错。回归断言中应包含「这些正确表述不得被改错」的守护项(参照既有补充 30 的做法)。

View File

@@ -0,0 +1,412 @@
# DSH 预设就地化实施计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 把 rev-skills 的 DSH 独立预设从「仓库内第二个 npm 包(`dsh/`)」改为「根包自带的 bundle 声明(`dsh.patch.yml`)」,删掉重复包壳与随之而来的同步点,预设行为不变。
**Architecture:** DSH 的 bundle = 任意 npm 包 + manifest 里的 `dsh.bundle.patch`,profile 的 `dsh.profile.bundles` 填**包名**。因此根包 `rev-skills` 自己就能当 bundle:新增一个仓库根的补丁文件,在根 `package.json` 声明它并列入 `files`,删掉 `dsh/` 整个目录,`bin/dsh.mjs` 只改两个常量。
**Tech Stack:** 零依赖 Node.js ESM(>=22)、`node --test`、DSH 0.2.0-rc.2(本机 `/home/DslsDZC/.npm-global/bin/dsh`)。
## Global Constraints
- 分支:`dsh-preset`(跟踪 `dnfme/feat/dsh-preset`,PR #5 就地更新)
- commit message 中文,前缀 `feat:` / `fix:` / `chore:` / `docs:` / `enhance:` / `经验:`
- **每个 commit 只 `git add` 本任务 Files 列出的文件,严禁 `git add -A`**
- 呈现中性(禁用「最推荐」「强烈建议」等最高级强推措辞);不用 emoji
- 不改 `.claude/skills/` 下任何技能内容;不动 PR 中无关改动(`.gitattributes`、`lib/frontmatter.mjs`、`bin/install.mjs` 的 `--target dsh`)
- 保留 `bin/dsh.mjs` 的四个 `preset` 子命令
- 任一任务结束时 `node validate.mjs` 必须输出 `OK: 122 skills validated`,`npm test` 必须全绿
- `dsh.bundle.patch` 指向的文件**必须**出现在根 `package.json` 的 `files` 里(实测:漏列时 pnpm `file:` 安装被拒 `failed to read overlay … ENOENT` 并整体回滚)
- CLAUDE.md 的测试计数与实际顶层 `test(` 数一致(`tests/counts.test.mjs` 强制),增删测试必须在同一 commit 更新
---
### Task 1: 补丁就地化(文件迁移 + manifest 声明 + 常量 + 守卫测试)
**Files:**
- Create: `dsh.patch.yml`(由 `dsh/cordis.patch.yml` 移动并改写)
- Delete: `dsh/package.json`、`dsh/LICENSE`、`dsh/README.md`
- Modify: `package.json`(新增 `dsh` 字段,`files` 换条目)
- Modify: `bin/dsh.mjs:29-33`(两个常量)、`bin/dsh.mjs:425`(候选说明文案)、`bin/dsh.mjs:~430`(`仓库技能根` 候选的括号说明)
- Modify: `tests/dsh-preset.test.mjs:13-15`(路径常量)、`216-246`(manifest 与 LICENSE 守卫)、`293`(候选断言)、`335-350`(包解析夹具)、测试计数相关
- Modify: `tests/dsh.test.mjs:148`、`397`
**Interfaces:**
- Produces: `bin/dsh.mjs` 导出的 `BUNDLE_DIR` 语义变为「仓库根(即 bundle 包目录)」,`BUNDLE_PACKAGE` 变为 `'rev-skills'`;后续任务与文档全部按这两个值书写
- Consumes: 无
- [ ] **Step 1: 移动补丁文件到仓库根并改写头部注释**
```bash
git mv dsh/cordis.patch.yml dsh.patch.yml
```
把 `dsh.patch.yml` 开头到 `- insert:` 之前的注释块整体替换为:
```yaml
# rev-skills 的 DSH bundle 补丁:本仓库根包(rev-skills)自身即 bundle,根
# package.json 用 `"dsh": { "bundle": { "patch": "./dsh.patch.yml" } }` 指向本文件。
# 顶层一条 `- insert:` 行声明独立 agent preset `rev-skills`,其子条目对齐官方
# `cordis` 预设(去掉 Cordis 编写相关的行与 plan mode)。
# `skill-filesystem` 行设置 `includeDefaultRoots: false`,该 preset 贡献的是 rev-skills
# 技能根这一层,不继承项目与用户技能根;技能目录解析仍会把该层与查看作用域的项目/
# 用户根合并:同名条目以本 preset 层为准,其他 preset 不受影响。
# 技能根部进包内副本:`customSkillDirs` 表达式按顺序探测 `REV_SKILLS_DIR`(指向仓库根
# 或直接指向技能目录)、DSH 用户技能根(`$DSH_HOME/skills`,默认 `~/.dsh/skills`)、
# 本包目录(`rev-skills/package.json` 反解),取第一个存在且至少含一个 `re-*` 条目的候选。
```
- [ ] **Step 2: 从 `customSkillDirs` 表达式删掉最后一个候选**
把该行末尾的候选数组由:
```
const c = [tj(process.env.REV_SKILLS_DIR), process.env.REV_SKILLS_DIR, hd(), tj(pj('rev-skills/package.json')), tj(pt.join(pj('rev-skills-dsh-preset/package.json'), '..'))].filter((d) => d);
```
改为(删掉 `rev-skills-dsh-preset` 那项;原第 3 候选即本包自身):
```
const c = [tj(process.env.REV_SKILLS_DIR), process.env.REV_SKILLS_DIR, hd(), tj(pj('rev-skills/package.json'))].filter((d) => d);
```
- [ ] **Step 3: 根 `package.json` 声明 bundle 并换 `files` 条目**
`files` 数组里 `"dsh"` 换成 `"dsh.patch.yml"`;在 `"bin"` 块之后新增:
```json
"dsh": {
"bundle": {
"patch": "./dsh.patch.yml"
}
},
```
- [ ] **Step 4: 删掉包壳文件**
```bash
git rm dsh/package.json dsh/LICENSE dsh/README.md
```
(`dsh/README.md` 的面向 DSH 侧说明在 Task 3 并入 `docs/dsh-integration.md`,本步骤先记下其内容要点:bundle 安装方式、预设清单、技能根解析顺序。)
- [ ] **Step 5: 改 `bin/dsh.mjs` 的两个常量**
```js
export const BUNDLE_DIR = REPO_ROOT;
export const BUNDLE_PACKAGE = 'rev-skills';
```
- [ ] **Step 6: 改 `bin/dsh.mjs` 的两处说明文案**
`resolveLocalSkillRoot` 里:
```js
add('仓库技能根 <repo>/.claude/skills(补丁里由包解析得到)', join(repoRoot, '.claude', 'skills'));
candidates.push({ source: '从 rev-skills 的 package.json 反解(本包即 bundle)', root: null, exists: null, skills: null, resolvable: false });
```
- [ ] **Step 7: 同步 `tests/dsh-preset.test.mjs` 的路径常量**
```js
const DSH_DIR = fileURLToPath(new URL('../', import.meta.url));
const PACKAGE_FILE = join(DSH_DIR, 'package.json');
const PATCH_FILE = join(DSH_DIR, 'dsh.patch.yml');
```
- [ ] **Step 8: 改写 `tests/dsh-preset.test.mjs` 的 bundle 清单守卫**
把 `test('dsh/package.json 是合法 bundle 清单', …)` 整个替换为:
```js
test('根 package.json 是合法 bundle 清单', () => {
const pkg = JSON.parse(readFileSync(PACKAGE_FILE, 'utf8'));
assert.equal(pkg.name, 'rev-skills');
assert.match(pkg.version, /^\d+\.\d+\.\d+/);
assert.match(pkg.license, /Apache-2\.0/, 'bundle 随根包发布,许可证沿用根包');
assert.equal(pkg.type, 'module');
const rel = pkg.dsh?.bundle?.patch;
assert.equal(typeof rel, 'string', 'dsh.bundle.patch 必须存在');
const abs = join(DSH_DIR, rel);
assert.ok(existsSync(abs), `dsh.bundle.patch 指向不存在的文件:${rel}`);
assert.ok(abs.startsWith(DSH_DIR), 'dsh.bundle.patch 必须落在仓库内');
assert.ok(Array.isArray(pkg.files) && pkg.files.length > 0);
for (const f of pkg.files) {
assert.ok(existsSync(join(DSH_DIR, f)), `files 里列了未随包发布的文件:${f}`);
}
});
```
(删掉了原断言里对 `dependencies === undefined` 与 `main`/`exports`/`bin` 三项为空的检查:那是「包壳不得指向未发布文件」的守卫,根包本来就有 `bin`。`dependencies` 为空由 Task 2 单独守卫。)
- [ ] **Step 9: 把 LICENSE 守卫改指根 LICENSE**
把 `test('dsh/LICENSE 是仓库根 LICENSE 的 Apache-2.0 正文', …)` 整个替换为:
```js
test('根 LICENSE 是 Apache-2.0 全文,供随包发布的补丁使用', () => {
const license = readFileSync(join(DSH_DIR, 'LICENSE'), 'utf8');
assert.ok(license.includes('Apache License'), 'LICENSE 应含 Apache License 标题行');
assert.ok(license.includes('Version 2.0, January 2004'), 'LICENSE 应是 Apache-2.0 全文');
assert.ok(license.includes('END OF TERMS AND CONDITIONS'), 'LICENSE 应是全文而非节选');
});
```
- [ ] **Step 10: 改 `tests/dsh-preset.test.mjs` 的技能根表达式断言**
`assert.ok(expr.includes('rev-skills-dsh-preset/package.json'), …)` 一行删除,并把上一行改为:
```js
assert.ok(expr.includes('rev-skills/package.json'), '表达式应支持从本包(rev-skills 即 bundle)解析');
```
- [ ] **Step 11: 改包解析夹具的假目录**
```js
const app = mkdtempSync(join(tmpdir(), 'dsh-preset-app-'));
const fakeRepo = join(app, 'node_modules', 'rev-skills');
const fakeKeys = join(fakeRepo, '.claude', 'skills', 're-fake');
mkdirSync(fakeKeys, { recursive: true });
writeFileSync(join(fakeRepo, 'package.json'), '{}');
writeFileSync(join(fakeKeys, 'SKILL.md'), 'x');
try {
const baseUrl = join(fakeRepo, 'package.json');
// DSH_HOME 指向一个不存在的目录,确保回落到包解析候选
const viaPkg = evalExpr(expr, baseUrl, { revSkillsDir: '', dshHome: join(app, 'empty-dsh-home') });
assert.equal(viaPkg, join(fakeRepo, '.claude', 'skills'));
} finally {
rmSync(app, { recursive: true, force: true });
}
```
(删掉了原来额外创建的 `node_modules/rev-skills-dsh-preset` 目录与它的 `package.json`——bundle 即 `rev-skills` 自己,`baseUrl` 落在同一个包内。)
- [ ] **Step 12: 改 `tests/dsh.test.mjs` 的两处**
第 148 行:
```js
assert.equal(BUNDLE_PACKAGE, 'rev-skills');
```
第 397 行:
```js
assert.equal(bundleExists, true, '根包即 bundle(dsh.patch.yml + dsh.bundle.patch),install 用例依赖它');
```
- [ ] **Step 13: 跑测试**
Run: `node validate.mjs && npm test`
Expected: `OK: 122 skills validated`,且 `node --test` 汇总 `fail 0`;若出现 CLAUDE.md 计数不一致的失败(`CLAUDE.md 的测试计数与实际测试数一致`),记下实际数,Task 3 会统一同步——本任务不新增/删除顶层 `test(`,正常应仍是 202。
- [ ] **Step 14: 提交**
```bash
git add dsh.patch.yml package.json bin/dsh.mjs tests/dsh-preset.test.mjs tests/dsh.test.mjs
git commit -m "feat: DSH 预设就地化——根包自带 bundle,取消独立 dsh/ 包"
```
---
### Task 2: 把「patch 不在 files 里」的坑固化成回归断言
**Files:**
- Modify: `tests/dsh-preset.test.mjs`(新增一条测试)
- Modify: `CLAUDE.md`(测试计数)
**Interfaces:**
- Consumes: Task 1 产出的根 `package.json` 的 `dsh.bundle.patch` 与 `files`
- Produces: 无
- [ ] **Step 1: 写这条测试(先写出会通过的版本)**
在 `tests/dsh-preset.test.mjs` 的根 manifest 守卫测试之后追加:
```js
test('dsh.bundle.patch 指向的文件必须随包发布(files 里漏列即安装期失败)', () => {
const pkg = JSON.parse(readFileSync(PACKAGE_FILE, 'utf8'));
const rel = pkg.dsh?.bundle?.patch;
assert.equal(typeof rel, 'string', 'dsh.bundle.patch 必须存在');
// 归一成包内相对路径:'./dsh.patch.yml' 与 files 里的 'dsh.patch.yml' 视为同一项
const norm = (p) => p.replace(/^\.\//, '').split('\\').join('/');
const target = norm(rel);
const listed = (pkg.files ?? []).map(norm);
assert.ok(
listed.includes(target),
`dsh.bundle.patch 指向 ${rel},但 package.json 的 files 里没有它;`
+ 'pnpm 的 file: 安装按 files 复制,漏列会让 dsh plugin add 报 '
+ 'failed to read overlay … ENOENT 并整体回滚',
);
// bundle 会被整包装进 profile 的 node_modules,不得带上运行时依赖
assert.equal(pkg.dependencies, undefined, 'bundle 包不得有运行时依赖');
});
```
- [ ] **Step 2: 跑测试确认通过**
Run: `node --test tests/dsh-preset.test.mjs`
Expected: PASS(Task 1 已把 `dsh.patch.yml` 列进 `files`)。
- [ ] **Step 3: 验证这条断言真的会红(刻意的红-绿验证)**
临时把根 `package.json` 的 `files` 里 `"dsh.patch.yml"` 改为 `"dsh.patch.yml.bak"`,运行:
Run: `node --test tests/dsh-preset.test.mjs`
Expected: FAIL,报 `files 里列了未随包发布的文件` 或本测试的 `files 里没有它`。看到失败后**改回** `"dsh.patch.yml"`,重跑确认转绿。
- [ ] **Step 4: 同步 CLAUDE.md 的测试计数**
Run: `node --test tests/*.test.mjs 2>&1 | grep '^ℹ tests'`
把 CLAUDE.md 里 `` `npm test` = validate + N 项测试 `` 的 N 改为实测值(本任务新增 1 条,预期 202 → 203)。
- [ ] **Step 5: 跑全量**
Run: `npm test`
Expected: 全绿,且 `CLAUDE.md 的测试计数与实际测试数一致` 通过。
- [ ] **Step 6: 提交**
```bash
git add tests/dsh-preset.test.mjs CLAUDE.md
git commit -m "test: 固化 dsh.bundle.patch 必须随包发布的回归断言"
```
---
### Task 3: 文档同步
**Files:**
- Modify: `docs/dsh-integration.md`(第 1 节表述、第 2 节路线二、第 4 节验证、第 5 节排错表、第 6 节同步点表)
- Modify: `README.md:66-69`、`README_EN.md:66-69`、`AGENTS.md:14`、`CLAUDE.md`(DSH 段)
**Interfaces:**
- Consumes: Task 1 的 `BUNDLE_PACKAGE = 'rev-skills'`、补丁路径 `dsh.patch.yml`
- Produces: 无
- [ ] **Step 1: 改写 `docs/dsh-integration.md` 第 2 节「路线二」**
原来的三句描述与候选表:bundle 包名改为 `rev-skills`(根包自身即 bundle,`dsh.bundle.patch` → `./dsh.patch.yml`);技能根候选表**删掉第 4 行**(`<rev-skills-dsh-preset 包目录>/../.claude/skills`),第 3 行改为「`<rev-skills 包目录>/.claude/skills`(本包即 bundle,按包名解析)」。
手工路径的 jsonc 示例改为:
```jsonc
{
"dependencies": { "rev-skills": "link:/path/to/rev-skills" },
"dsh": { "profile": { "bundles": [ "@deepseek-ai/dsh-base", "rev-skills" ] } }
}
```
并补一句实测事实:从 registry 或本地路径安装时,`dsh plugin --profile <name> add rev-skills` 成功后会**自动把 `rev-skills` 追加进 `dsh.profile.bundles`**,失败则还原 `package.json`、`pnpm-lock.yaml` 与 `node_modules`。
- [ ] **Step 2: 改写 `docs/dsh-integration.md` 第 6 节「维护同步点」表**
把「版本号」(根 `package.json` ↔ `dsh/package.json`)一行删除(只剩根包一处,由仓库既有的版本同步规则覆盖);「bundle 名」一行的另一侧由 `dsh/package.json` → `name` 改为根 `package.json` → `name`;「补丁文件」一行改为:
| 项 | 一处 | 另一处 |
|---|---|---|
| 补丁文件 | 根 `package.json` → `dsh.bundle.patch` | `dsh.patch.yml` 实际路径,且必须出现在根 `package.json` 的 `files` 里 |
- [ ] **Step 3: 把 `dsh/README.md` 的要点并入文档**
`dsh/README.md` 里未被 `docs/dsh-integration.md` 覆盖的内容(bundle 的安装输入、预设清单概览)并入第 2 节路线二;重复内容不搬。原文件已在 Task 1 删除,内容以 `git show dnfme/feat/dsh-preset:dsh/README.md` 取回参考。
- [ ] **Step 4: 同步 README / README_EN / AGENTS / CLAUDE**
`README.md` 第 69 行那段改为:
```markdown
也可用 DSH 自带的插件管理器安装:`dsh plugin --profile <name> add rev-skills`(本地路径用 `link:` / `file:` 规格;成功后会自动登记进该 profile 的 `dsh.profile.bundles`)。技能目录可用环境变量 `REV_SKILLS_DIR` 覆盖。细节与排错见 [docs/dsh-integration.md](docs/dsh-integration.md)。
```
`README_EN.md` 第 69 行按同义改写(英文)。`AGENTS.md` 第 14 行把「bundle `dsh/`」改为「bundle 即根包 `rev-skills`(补丁 `dsh.patch.yml`)」。
`CLAUDE.md` 的 DSH 段(第 63-72 行):
- 「独立预设路线」条目改为:根包自身即 bundle(根 `package.json` 的 `dsh.bundle.patch` → `dsh.patch.yml`;该文件必须在 `files` 里),补丁插入预设行 `preset-rev-skills`(`config.id` = `rev-skills`),启用方式 `dsh plugin --profile <name> add rev-skills` 或 `node bin/dsh.mjs preset install --apply`
- 「必须成对同步的项」那句删掉所有 `dsh/package.json` 相关配对,改为:`dsh.bundle.patch` ↔ `dsh.patch.yml` 实际路径 ↔ 根 `package.json` 的 `files` 条目;补丁里的 `config.id`(`rev-skills`)↔ `docs/dsh-integration.md` 的说明
- [ ] **Step 5: 全库自检残留**
Run: `grep -rn "rev-skills-dsh-preset\|dsh/package.json\|dsh/cordis.patch.yml" --include="*.md" --include="*.json" --include="*.mjs" --include="*.yml" . | grep -v "^./docs/superpowers/"`
Expected: 无输出(`docs/superpowers/specs/2026-09-30-factual-audit-wave.md` 等历史存档允许保留旧表述,已由路径过滤排除;若命中历史存档以外的文件,逐个改正)。
- [ ] **Step 6: 跑测试并提交**
Run: `node validate.mjs && npm test`
Expected: 全绿(若 `tests/counts.test.mjs` 的 README 站点断言因措辞变化而红,按报错补齐缺失关键词)。
```bash
git add docs/dsh-integration.md README.md README_EN.md AGENTS.md CLAUDE.md
git commit -m "docs: DSH 集成文档与清单同步根包自带 bundle 的形态"
```
---
### Task 4: 端到端实机验证
**Files:**
- 不改文件;发现缺陷则回改对应文件并 `fix:` 提交
**Interfaces:**
- Consumes: Task 1-3 的全部产物
- Produces: 供 PR 描述引用的验证结论
- [ ] **Step 1: 静态闸口**
```bash
node validate.mjs
node bin/dsh.mjs check
```
Expected: `OK: 122 skills validated`;`OK: 122 skills DSH-compatible (32 warning(s))`。
- [ ] **Step 2: 补丁里的技能根表达式实测求值**
```bash
node -e '
const fs=require("fs"),pt=require("path");
const y=fs.readFileSync("dsh.patch.yml","utf8");
const expr=y.match(/customSkillDirs:\n\s*- !!js "([\s\S]*?)"\n/)[1].replace(/\\"/g,"\"");
const baseUrl=process.argv[1];
console.log(new Function("baseUrl","return ("+expr+")")(baseUrl));
' /tmp/nowhere/package.json
```
Expected: 打印 `REV_SKILLS_DIR` 未设、`DSH_HOME` 未设时的回落路径(`$HOME/.dsh/skills`);把 `baseUrl` 换成已安装 profile 里 `node_modules/rev-skills/package.json` 时,应打印该包的 `.claude/skills`。
- [ ] **Step 3: 真实 profile 上装一遍(宿主自带插件管理器)**
```bash
export DSHX=/tmp/dsh-verify && rm -rf $DSHX && mkdir -p $DSHX/profiles/e2e
printf '{"name":"dsh-profile-e2e","private":true,"dependencies":{},"dsh":{"profile":{"bundles":["@deepseek-ai/dsh-base"]}}}\n' > $DSHX/profiles/e2e/package.json
cd $DSHX/profiles/e2e && DSH_HOME=$DSHX dsh plugin --profile e2e add link:/home/DslsDZC/rev-skills
DSH_HOME=$DSHX dsh --profile e2e --dump-config | grep -c preset-rev-skills
```
Expected: 安装成功无告警;`dsh.profile.bundles` 自动变为 `["@deepseek-ai/dsh-base","rev-skills"]`;`grep -c` 输出 `1`(预设行在配置树末层);stderr 无 `skipping profile bundle`。
- [ ] **Step 4: `bin/dsh.mjs preset` 往返(本仓 CLI 路径)**
```bash
node bin/dsh.mjs preset spec
node bin/dsh.mjs preset status --profile-dir $DSHX/profiles/e2e --json
node bin/dsh.mjs preset install --profile-dir /tmp/dsh-verify/other # dry-run
node bin/dsh.mjs preset install --profile-dir /tmp/dsh-verify/other --apply
node bin/dsh.mjs preset status --profile-dir /tmp/dsh-verify/other --json # ok: true
node bin/dsh.mjs preset uninstall --profile-dir /tmp/dsh-verify/other --apply
```
Expected: `spec` 打印 bundle 绝对路径为仓库根、`link:` 规格与 profile 编辑;`status` 对 e2e profile 报 `ok: true`;dry-run 不写文件;`--apply` 生成备份;uninstall 从备份还原。
- [ ] **Step 5: 发布面检查**
```bash
npm pack --dry-run 2>&1 | grep -E "dsh\.patch\.yml|dsh/"
```
Expected: 输出含 `dsh.patch.yml`,不含 `dsh/` 目录条目。
- [ ] **Step 6: 清理临时目录并汇报**
```bash
rm -rf /tmp/dsh-verify
```
把 Step 1-5 的实际输出整理进 PR #5 的描述更新(不新建文件)。若任何一步暴露缺陷,回改对应文件并以 `fix:` 提交后重跑该步。