# CLAUDE.md This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. ## 仓库性质 通用逆向工程 AI 技能库(122 个技能),发布形态有三个:npm 包(`bin/install.mjs` 安装器)、Claude Code 插件市场(`.claude-plugin/marketplace.json`)、以及可被任意 Agent Skills 兼容运行时读取的 `.claude/skills/` 目录。 内容主体是 Markdown 技能文档,工具代码是零依赖 Node.js(>=22,当前受支持 LTS,ESM)。**没有构建步骤**——技能即目录,改完跑校验即可。 仓库按 LF 存储(`.gitattributes`:`* text=auto eol=lf`)。校验与转换按 LF 解析 frontmatter 与能力注册表,Windows 上 `core.autocrlf=true` 的**旧检出**会把技能读成 CRLF 并让 `node validate.mjs` 整库报错(`missing frontmatter` + 能力标签全判未注册);重新检出即可,或把工作树按 LF 归一(`lib/frontmatter.mjs` 自身已容错 CRLF,但注册表读取还没有)。 双许可:技能文档内容 CC BY 4.0,工具代码(`bin/`、`validate.mjs`、`tests/`)Apache-2.0。新增文件注意落在正确一侧。 ## 常用命令 ```bash npm test # 全量:结构校验 + 单元测试 node validate.mjs # 只跑结构校验,输出 OK: 122 skills validated node --test tests/validate.test.mjs # 单跑一个测试文件 node --test --test-name-pattern="good-skill" tests/*.test.mjs # 按用例名过滤 node bin/capindex.mjs # 重新生成能力索引(改 capabilities 声明后必跑) node bin/capindex.mjs --check # 只校验索引是否过期(npm test 已含) node bin/toollife.mjs check # 命令/API 登记表一致性 + 时效(npm run toollife;npm test 已含一致性) node bin/toollife.mjs candidates # 技能里出现但未登记的命令候选 node bin/toollife.mjs stale # 按超期排序的待核验项 node bin/toollife.mjs smoke # 本机探测(仅报告,CI 机器不必装) node bin/examplecheck.mjs # 技能示例代码块语法检查(npm run examples;需 python3/bash,缺失时跳过) node bin/auditstate.mjs status # 增量审查:哪些技能内容在复核之后又变了(= 下一轮审查波的工作集) node bin/auditstate.mjs update <技能...> # 复核后回填(写当前 hash + 日期) node bin/probelist.mjs # 由登记表生成 probe.sh 的工具清单(--check 校验新鲜度,npm test 已含) npx rev-skills install --target \ [--global|--project] [--dry-run] [--link] [--force] node bin/convert.mjs --target --out # 技能 → 规则文件转换(调试用) node bin/dsh.mjs check [--dir ] [--json] # 按 DSH 发现规则校验技能根:通过则输出 OK: N skills DSH-compatible node bin/dsh.mjs preset spec # 打印预设配置(含技能根解析结果与 REV_SKILLS_DIR 覆盖) node bin/dsh.mjs preset status [--profile-dir ] [--json] # 只读检查 profile 是否已启用该 bundle node bin/dsh.mjs preset install [--profile-dir ] [--force] [--apply] # 默认 dry-run,--apply 才写(写前备份) node bin/dsh.mjs preset uninstall [--profile-dir ] [--apply] # 默认 dry-run,有备份时从备份还原 npx rev-skills install --target dsh --global # 技能装进 DSH 技能根(~/.dsh/skills) npx rev-skills install --target dsh --project # → .dsh/skills node bin/wxsource.mjs kanxue list [--board re] [--pages 2] [--md] # 看雪论坛列表(经验采集源) node bin/wxsource.mjs kanxue thread <帖子ID> [--md] node bin/wxsource.mjs wechat <文章URL> [--md] ``` `node validate.mjs` 输出的技能数必须等于 `.claude/skills/` 下 `re-` 目录数——**这条已有自动检查**(`tests/counts.test.mjs` 比对 README / README_EN / AGENTS / CLAUDE / package.json / marketplace.json 六处的计数),不必再靠人工 grep。 **检查分层**(`npm test` = validate + 203 项测试;该计数由 `tests/counts.test.mjs` 自校验,增删测试后需同步此处): | 层 | 查什么 | 落点 | |---|---|---| | 结构 | frontmatter / 命名 / 能力标签 / 链接 / guard / 章节 | `validate.mjs` | | 一致性 | 计数同步、指纹表覆盖、登记表与路由、审查状态覆盖 | `tests/counts` `tests/fingerprints` `tests/toollife` `tests/review-state` | | 语法 | 技能里 python / shell 示例块(含 sh 内嵌 python heredoc) | `tests/examples`(无解释器则跳过) | | 事实 | 已修缺陷的**回归断言**(错的说法不得写回)、格式断言 fixture | `tests/audit-regressions` `tests/format-fixtures` | | 预算 | SKILL.md ≤240 行、单分支 ≤600 行、必备章节仍在 | `tests/skill-budget` | ## DSH(DeepSeek Harness)集成 两种集成形态,改动时都要与计数/清单同步: - **技能目录路线**:`npx rev-skills install --target dsh [--global|--project]`——写入 DSH 技能根(全局 `/skills`,项目 `.dsh/skills`)。DSH 按 Agent Skills 风格扫描,一层深度(`//SKILL.md`),frontmatter 的 `---` 分界行与 YAML 合法性由 DSH 严格执行:不合法时记告警并**静默跳过该技能**(新技能要跑 `node validate.mjs`,别只看 `npm test` 的汇总行)。 - **独立预设路线**:**根包自身即 bundle**(`rev-skills`),根 `package.json` 用 `"dsh": { "bundle": { "patch": "./dsh.patch.yml" } }` 指向仓库根的补丁文件,补丁插入预设行 `preset-rev-skills`(`config.id` = `rev-skills`),该预设用 `includeDefaultRoots: false` + `customSkillDirs` 给预设自带本库 `.claude/skills` 技能层(该提供方实例不再重复扫描项目/用户技能根;技能服务读取时仍把预设层与全局层合并,同名以预设层为准,其他预设不受影响);目录可用环境变量 `REV_SKILLS_DIR` 覆盖。启用方式:`dsh plugin --profile add rev-skills`(宿主的包管理器会自动登记 `dsh.profile.bundles` 行;本地路径用 `link:` / `file:` 规格),或仓库自带 CLI `node bin/dsh.mjs preset install --apply`。 必须成对同步的项(历史上漏同步过):根 `package.json` 的 `dsh.bundle.patch` ↔ `dsh.patch.yml` 实际路径 ↔ **该路径必须出现在根 `package.json` 的 `files` 里**(pnpm 按 `files` 复制 `file:` 依赖,漏列则 `dsh plugin add` 报 `failed to read overlay … ENOENT` 并整体回滚,测试有回归断言);根 `package.json` 的 `name` ↔ profile 里 `dsh.profile.bundles` 的对应行与同名依赖;补丁里的 `config.id`(`rev-skills`)↔ `docs/dsh-integration.md` 的说明。 标准预设会裁剪超过 8192 字符的工具结果,本库 32 个 `SKILL.md` 的文件字符数超过该阈值(CRLF 检出下为 34;`node bin/dsh.mjs check` 会逐条报出),被加载时可能被截断(完整内容直接读文件)。集成全貌与排错表见 `docs/dsh-integration.md`。 ## 架构:三层技能图,按状态机运转 ``` re-analyze(entry,唯一入口) └─ 12 个大类网关(type: gateway):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 └─ 原子技能(type: atomic,109 个) ``` **这不是调用链,是状态转移**:`triage → route → skill 执行 → 产出证据 → 再路由(循环)`。每个技能执行后产出新证据,证据决定下一跳。技能之间靠 `[[技能名]]` 链接互引,靠会话变量(`RE_OS`/`RE_TOOLS`/`RE_GOAL`/`RE_DECOMPILER`/`RE_DEPTH`/`RE_REPORT`/`RE_AUTH`/`RE_VISITED`)传状态。 **控制文件是单一事实源**,改路由逻辑只需改这些文件,不要散落到各技能: | 文件 | 职责 | |---|---| | `.claude/skills/re-analyze/SKILL.md` | 入口四步:环境探测 → 偏好分级询问 → 任务识别 → 路由 | | `re-analyze/references/triage.md` | 入口决策表:目标 + 输入文件 → 编排路径;第 0 步定 `RE_AUTH` | | `re-analyze/references/rerouting.md` | 中途再路由:A 表「证据特征 → 触发技能」,B 表「卡住信号 → 换路」 | | `re-analyze/references/preferences.md` | 偏好询问分级(Level 0 用默认值直接开始 / Level 1 完整问 5 项) | | `re-analyze/references/analysis-contract.md` | 分析契约:上下文清单(按域展开)、数据契约(核心字段 + 域扩展字段两层)、独立复核、调查预算 | | `re-analyze/references/platform-tips.md` | 平台经验库(最高原则:默认沙箱;内存读取默认转储优先) | | `re-analyze/references/system-fingerprints.md` | 系统识别指纹表(载体格式 → 家族 → 系统 → 易混淆对 → 负判据;新增系统分支须同步加行) | | `re-analyze/references/cross-system-models.md` | 跨系统误判总表(十类误判 / 共同规律 A–F / 异常速查表;判定 hook·dead code·恶意 前的强制前置) | | `re-analyze/references/capabilities.md` | 能力注册表(`capabilities` frontmatter 的合法标签全集) | | `re-analyze/references/probe.sh` | 环境探测脚本(OS/ARCH/CORES/MEM/工具清单) | **能力层**:技能用 `capabilities: [tag1, tag2]` 声明「提供哪些可执行分析动作」,标签必须在 `capabilities.md` 注册表内。**原子技能必须声明**(入口/元网关可省略)。声明的消费端是 `re-analyze/references/capability-index.md`(机器生成的「能力 → 技能」反查表:`node bin/capindex.mjs` 生成、`npm test` 校验过期、`--check` 单查)。**路由已按能力匹配**:`triage.md` 与 `rerouting.md` 的表格带「需要能力」列,技能列是索引反查结果——新增/修改路由行时必须先定能力标签再反查技能,不能只写领域名。CI 四条防漂移:标签不得悬空|原子技能必须声明|路由能力列须在注册表内|路由标称能力须被本行技能声明|索引须与声明同步。**网关选择树**里的技能链接用 `[[re-xxx]](能力:`tag`)` 标注(选择树段内强制,`npm test` 校验标注与声明一致;无「能力:」前缀的括号视为普通说明,不参与校验)。 **guard 字段**:敏感技能必须带机器可读安全前置声明,JSON 格式 `{"require_authorization": true, "forbidden": ["行为标签"]}`。入参与 `RE_AUTH`(owned / ctf / research / unknown)联动——`require_authorization: true` 时仅 owned/ctf/research 可执行,unknown 只做静态分析并先询问归属。 **技能目录布局**:每技能一个目录,必含 `SKILL.md`,可选 `references/*.md`(深度知识、坑、探针)。`references/*.md` 的文件名(去扩展名)本身是合法的 `[[链接]]` 目标。 ## validate.mjs 校验规则(改技能前必读) frontmatter 解析的唯一实现在 `lib/frontmatter.mjs`(`validate.mjs` 与 `bin/convert.mjs` 共用;支持简单 scalar / 块标量 `>` `|` / 内联 flow list 与 JSON,其余 YAML 特性不支持)。**新增 frontmatter 写法前先扩展该模块并补测试**——历史上校验与转换各写一套解析,104 个技能的 `description` 因此在校验侧被解析成字面量 `>`,非空校验空转。 `validate.mjs` 是结构闸口,以下任一不满足即 `npm test` 失败: - frontmatter 必须有 `name`(**必须等于目录名**)与非空 `description`;`name` 以 `re-` 前缀 - `description` 必须**同时含 CJK 与拉丁字母**(中英触发词约定——英文环境也要能命中该技能) - `type` 只认 `atomic` / `entry` / `gateway`(缺省视为 atomic) - **原子技能且是叶子目录**(无子技能目录)必须含 `## 工具准备` 章节;入口/网关豁免 - 正文所有 `[[xxx]]` 必须解析:技能链接 `[[re-xxx]]` 指向技能;**裸 references 链接 `[[文件名]]` 必须落在本技能自己的 `references/` 内**;跨技能引用别人的 references 必须限定前缀 `[[re-xxx/文件名]]`——**先建文件再加链接**,否则断链(同名 references 普遍:`gotchas.md` 33 个、`decision-tree.md` 13 个) - `capabilities` 必须是非空 YAML 内联 list,且每个标签在 `capabilities.md` 注册表内(新标签要先注册) - `guard` 必须严格是 `{"require_authorization": , "forbidden": [<非空字符串>]}`,否则报错 技能正文结构规范见 `docs/skill-template.md`(原子技能固定章节顺序:任务分类器 → 何时使用/何时不用 → 工具准备 → 操作步骤 → 跨域联合 → 常见坑与陷阱;网关另有一套)。 ## 新增/修改技能的标准流程 1. 按 `docs/skill-template.md` 建 `.claude/skills/re-xxx/SKILL.md`(知识/操作分离:机制原理留正文,易变参数如槽位索引/offset 放 `references/probes.md` 探针层) 2. **挂载**(缺一即孤儿技能):网关 SKILL.md 的子技能清单 + `triage.md` 路由表;若是「看到某证据就该触发」的技能,还要挂 `rerouting.md` A 表 3. 声明 `capabilities`(新标签先加进 `capabilities.md` 注册表);敏感技能加 `guard` 4. **同步计数与导航**——计数散落多处,**按清单逐处核对**(曾因只改"记得的几处"漏过 5 处): - `README.md`:技能总数(首段)、「技能导航(N)」标题、前言「12 大类网关 → N 原子技能」、对应网关的技能行 - `README_EN.md`:同上 4 处(`## Skill map (N)`、`N atomic skills`) - `AGENTS.md`:技能总数、原子技能数 - `package.json` / `.claude-plugin/marketplace.json`:description 里的技能数 - `CLAUDE.md`:技能总数(仓库性质段)、`OK: N skills validated` 示例、架构图里的原子技能数 - 自查方式:`grep -rln "<旧数>\|<旧原子数>" --include="*.md" --include="*.json" .`,**逐个候选文件人工核**(不要用"旧数+单位"的复合模式,全角括号/措辞差异会造成假阴性);`TODO.md`、`docs/audit/`、历史注释里的旧值是当时事实,保留不动 5. `npm test` 必须输出 `OK: N skills validated` 且 N 与实际目录数一致 ## 开发工作流:spec → plan → 波次 → 审查波 本仓库按「波次」推进,历史全在 `docs/superpowers/`: - `specs/YYYY-MM-DD-*-design.md` —— 设计文档(用户批准后落地) - `plans/YYYY-MM-DD-*.md` —— 实施计划(任务拆解,带 `- [ ]` 复选框与逐步 commit 点,供 subagent 逐任务执行) - **这两个目录是历史存档**(冻结于各自日期,不随技能修订同步)——可能保留已修正的过时表述,**不要当现行技术指引检索/引用**;当前事实一律以 `.claude/skills/` 为准,已修正错误与核验依据见 `docs/audit/` - 每任务一张 Files 清单,**commit 只 `git add` 本任务列出的文件,严禁 `git add -A`** - 多计划并行时约定「文件集隔离」——不交叉修改对方文件 - 变更后收尾是**审查波**:grep/抽查断言事实性(命令是否可执行、字段值是否与官方文档一致),发现的错误以 `fix:` 提交;TODO.md 记录了「增量审查机制」待办(用内容 hash 跳过未变技能,把审查成本从 O(技能总数) 降到 O(变更数)) commit message 用中文,前缀:`feat:` / `fix:` / `chore:` / `enhance:` / `docs:` / `经验:`。 发布流程:`npm test` 通过 → git tag → npm publish → 同步 `package.json` 与 `marketplace.json` 的版本号(历史上常见漏同步,需成对检查)。 ## 仓库红线(内容与输出) 1. **呈现中性**:选项/建议禁用「最推荐」「强烈建议」等最高级强推措辞,最多用「推荐」,由用户自决 2. **隐私脱敏**:内容禁止具体到某个项目/公司/产品,暗示也不行(行业+规模+地域组合、专有协议名、内部代号);本库公开发布,本地入库同样受约束 3. **不用 emoji**:文档与输出一律纯文本表达 4. **事实核验**:命令必须可执行、字段/格式断言以官方文档为准——本库多处断言曾因想当然出错(如 dex opcode 值、pclntab 头长度),写断言前先验证 5. **授权边界**:全库面向授权范围内的安全研究;破解/绕过类路径受 `RE_AUTH` 与 `re-cracking` 授权边界约束,不得写成无条件可用的操作指引 6. **内容边界**:`.claude/skills/` 是随库发布的分析内容——**不写审查历史**(日期戳、"本次补录/已完成"叙事、finding 编号、`✅` 进度标记、`docs/audit/` 引用);那类内容进 `docs/audit/`,开发约定进 `CLAUDE.md`。技能内容只写"是什么/怎么做",不写"何时改的/谁审的" ## 本地分析产物(勿提交) `.gitignore` 已排除 `/aaa/`、`/analysis/`、`demo_target.*`、`sandbox.sh`——这些是本地逆向产物与沙箱脚本,不得提交到公开仓库。新增本地工作目录时同步加进 `.gitignore`。 ## 经验采集 `bin/wxsource.mjs` 抓取看雪论坛/微信技术文章 → 按 `re-feedback` 网关蒸馏(坑格式:`**标题**:现象——…;原因——…;对策——…`)→ 归域 → 追加到目标技能的 `references/experience.md`(SKILL.md 保留精选条目 + 链接)→ `npm test` 校验 → 提交 `经验: 第N轮扫描入库X篇——<篇目>`。入库前必须脱敏自检与 grep 去重。