33 KiB
事实核查波(监控报告对账后修复)实施计划
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、Linuxelf.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(); dyldcommon/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触发movapsSIGSEGV,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 的做法)。