一个开源项目,让 AI 做逆向不再靠猜reverse-skill 架构解析与本地实战

01. 为什么还需要一套"逆向 Skill"?

把一份 ELF 可执行文件交给 AI,说"帮我分析这个校验函数",它可能直接写一堆 objdump 命令;换成 Android APK,又可能随意推荐 Frida;碰到前端 JavaScript,它可能在缺少网络观察的情况下开始推测签名算法。

问题不一定出在模型的语言理解能力,而在于缺乏跨项目、可执行、可检查的方法论:什么时候先做静态分析?什么时候需要动态观察?本机到底有没有 Ghidra、jadx?什么操作需要授权?分析结论如何追溯?

zhaoxuya520/reverse-skill 给出的解决思路,是把这些决策从零散提示词中抽出来,放进规则配置、场景 Skill、工具索引、案件工作流和证据契约里。

先澄清它的边界:reverse-skill 不是一个新的反编译引擎,也不是内置所有逆向工具的万能执行程序。 它更准确的定位,是为 AI 编程助手提供安全任务的路由与作业规范。是否能够执行真实反编译、调试或抓取,仍取决于本地工具、MCP 连接、系统权限和目标格式。

项目 README 在核对时列出了 44 条路由、175 条回归用例和 45 个受跟踪技能模块,以及 Windows、Ubuntu 的持续集成。它们是仓库公开声明的工程覆盖数据,并不等于对逆向成功率的承诺。

02. 从源码看架构:六个模块组成一条分析链

可以把这套架构划分为六层:

层次 核心文件或目录 解决的问题
入口与规则 RULES.md、AGENTS.md、skills/SKILL.md 告诉 Agent 何时激活流程、如何守住授权边界
结构化路由 skills/config/routing.json、master-route.ps1/.sh 根据任务描述确定 PRIMARY Skill
专业技能 skills/apk-reverse/、js-reverse/、ghidra-reverse/ 等 给不同分析场景提供专门的步骤和工具选择
工具环境 refresh-tool-index.*、bootstrap-reverse.* 发现已有工具,缺少能力时执行经批准的安装计划
工作与审计 case-init.*、case-guard.*、skills/ops/ 记录 Scope、WorkItem、Timeline、Evidence、Finding、Path
复用与质量 skills/field-journal/、测试脚本、CI 沉淀脱敏经验、校验路由配置并减少重复踩坑

整个项目最值得学习的,是它没有让每个 Skill 自己处理所有事情:路由统一、授权统一、工具状态统一、证据字段统一,具体分析方法下沉到专属 Skill。 这与后台架构中"网关负责路由、工作流负责状态、领域服务负责业务逻辑"的分层思想相通。

2.1 为什么使用 Skill,而不只写一份总提示词?

总提示词的常见问题是越写越长,模块之间互相干扰。APK、ELF、JavaScript、.NET、固件的分析入口各不相同。将其拆为多个 SKILL.md,能够让 Agent 按当前任务读取所需方法,而不是把一大堆工具命令一次性塞进上下文。

以三个常用方向为例:

  • apk-reverse:围绕 APK、Manifest、Smali、jadx、apktool 等 Android 产物展开。
  • go-rust-reverse:关注 Go/Rust 二进制的语言特征、符号恢复与编译器行为。
  • js-reverse:强调观察、证据采集、局部复现与运行时分析的先后顺序。

注意:Skill 是工作规范,不保证工具已经安装。 例如某个 Skill 提到了 Frida,不代表此时 Agent 真的具备可调用的 Frida 服务。

03. 原理一:PRIMARY 路由是确定性的结构化规则

源码里最关键的配置是 skills/config/routing.json。它保存 routes、priority、fallbackId 等内容。master-route.ps1 和 master-route.sh 分别提供 Windows 与 Linux/macOS 的调用入口。

其主要逻辑可以概括为:

  1. 遍历各条路由的 keywords 规则,使用正则表达式检查用户任务描述。
  2. 一条规则的 must 命中后,继续检查 mustAll;如果命中 exclude,则排除此规则。
  3. 对同一路由,将命中的规则数累加成分数。
  4. 选择分数最高的路由;分数相同,按 priority 数组中的先后顺序决胜。
  5. 没有候选时使用配置中的兜底路由(当前是 R0),并提示人工检查。

下面是便于理解的简化伪代码,不是可直接替换仓库脚本的实现:

python 复制代码
scores = {}
for route_id, route in routes.items():
    for rule in route['keywords']:
        if match(rule['must'], task_text) \
           and all(match(x, task_text) for x in rule.get('mustAll', [])) \
           and not match(rule.get('exclude'), task_text):
            scores[route_id] = scores.get(route_id, 0) + 1

primary = pick_highest_score_then_priority(scores, priority)
primary = primary or fallback_id

例如任务写成"使用 Ghidra 反编译自己编译的 demo.elf,定位校验函数":按照核对到的规则,Ghidra 会命中 R22,.elf 或"反编译"会命中 R6,两条路由各有一条规则计分。在分数相同的条件下,R22 在优先级表中排得更早,因此选择 Ghidra 的 Skill。

这一细节很重要:路由中的优先级不是固定覆盖分数的强制顺序,而是同分时才用来决胜。 如果后续修改配置,应重新运行路由回归测试,避免新增关键词影响原有任务。

04. 原理二:工具链发现和安装是两回事

很多"AI 一键逆向"类介绍把工具选择和工具安装混在一起,容易产生两个问题:模型幻想本地存在一个程序,或者不经检查就下载执行脚本。

reverse-skill 在设计上把两者分开:

  • refresh-tool-index.sh/.ps1:检测当前机器的工具路径、版本或能力信息,并生成 skills/tool-index.md、skills/tool-index.json。检测脚本不是通用自动安装器。
  • bootstrap-reverse.sh/.ps1:根据明确的能力需求按需准备依赖;涉及安装、下载、启动服务和 MCP 注册时,应先阅读执行计划并取得用户批准。
  • bootstrap-manifest.json:定义可以自举的能力,不能任由 Agent 猜测任意下载来源或安装命令。

这里还有一个容易忽视的安全细节:读取 README 或 Skill 文本不等于同意执行仓库中的脚本。 作者在 README_AI.md 和 RULES.md 中对首次副作用、全局配置变更和第三方工具安装专门设置了同意要求。真实团队使用时,最好把这条要求落实到代码助手的操作确认机制和受限执行环境中。

05. 原理三:Scope Gate 是正式分析之前的门槛

即使路由正确、工具齐全,也不意味着任何目标都可以开始扫描、Hook 或修改。

case-init 会为当前任务建立案件目录。scope.md 需要记录授权、目标范围、允许的活动、网络档案和交付约束。case-guard 负责检查关键字段;当前脚本中未就绪会以非零状态退出,--force 不会绕过硬门槛。

针对自有的本地可执行文件,仓库提供了 offline-sample 预设。它能将活动限定在显式指定的离线样本上。

这是一层工作流约束,而不是内核级沙箱。 它不会自动阻止某个完全绕开流程的进程访问网络。企业落地时还应配合:最小系统权限、网络隔离、独立容器/虚拟机、操作审计和可复核的目标授权。

06. 原理四:Evidence、Finding、Path 让 AI 的结论可复查

很多 AI 分析报告有一个共同缺陷:写出很完整的结论,却无法解释结论如何得出。

reverse-skill 使用三类明确区分的记录:

记录 含义 典型字段
Evidence 原始观察与可重复的操作记录 E-001、时间、来源、路径、SHA-256、重现命令
Finding 对证据作出的判断 F-001、关联证据、状态、置信度、影响与建议
Path 模块调用路径、行为路径或其他关系链 P-001、相关 Finding、前后关系

在一次自有程序分析中,E-001 可以记录 sha256sum demo.elf 的结果,E-002 可以记录函数的反汇编片段或截图,F-001 再描述"函数执行 FNV-1a 风格的 32 位计算",并附上源码和独立测试来交叉验证。

这个设计没有要求 AI 每次必须"发现漏洞"。如果只是功能理解,Finding 可以是行为结论,Path 可以是一个正常的调用路径。case-review 可以只读检查 Scope、证据引用、工作项和可选的文件 Hash 完整性。

07. 从零实战:自己编译 ELF,让路由、授权和分析串起来

这个实验只使用一个自己编写的 C 程序,不涉及远程网络目标。Linux、Ubuntu 或 WSL 都可以跟着操作。Windows 原生 PowerShell 的对应入口放在后文。

步骤 1:获取仓库并检查源码

bash 复制代码
git clone https://github.com/zhaoxuya520/reverse-skill.git
cd reverse-skill

git rev-parse HEAD
sed -n '1,150p' README_AI.md
sed -n '1,150p' skills/MASTER-ROUTING.md

先审核脚本计划,再自行决定是否执行。本实验后续写入的文件均放入明确指定的本地 lab/ 项目目录中。

步骤 2:编译一个可控的教学样本

创建 lab/demo.c:

c 复制代码
#include <stdint.h>
#include <stddef.h>
#include <stdio.h>

__attribute__((noinline))
uint32_t fnv1a(const unsigned char *data, size_t length) {
    uint32_t hash = UINT32_C(2166136261);
    for (size_t i = 0; i < length; ++i) {
        hash ^= data[i];
        hash *= UINT32_C(16777619);
    }
    return hash;
}

int main(int argc, char **argv) {
    if (argc != 2) {
        fprintf(stderr, "Usage: %s <text>\n", argv[0]);
        return 2;
    }
    const unsigned char *input = (const unsigned char *)argv[1];
    size_t length = 0;
    while (input[length] != 0) ++length;
    printf("%08x\n", fnv1a(input, length));
    return 0;
}

编译两个版本,然后比较执行输出:

bash 复制代码
mkdir -p lab
# 将上面的代码保存为 lab/demo.c
gcc -std=c11 -Wall -Wextra -O0 -g lab/demo.c -o lab/demo.elf
gcc -std=c11 -Wall -Wextra -O2 lab/demo.c -o lab/demo-optimized.elf

./lab/demo.elf hello
./lab/demo-optimized.elf hello

file lab/demo.elf
sha256sum lab/demo.elf

在本次独立编译检查中,两个版本对 hello 都输出 4f9f2cab,符合 FNV-1a 32 位计算。这个结果验证的是自制样本,不代表已经运行 reverse-skill 的路由或 Ghidra 分析。

步骤 3:刷新本机工具索引

在明确了解写入位置并批准本地运行后,执行:

bash 复制代码
bash skills/scripts/refresh-tool-index.sh

随后查看 skills/tool-index.md。它反映本机检测到的工具,不等于所有技能依赖均已就绪。如果没有 Ghidra,可以先只完成路由和 ELF 只读检查;不要因为 Skill 提到了工具就假定它已安装。

步骤 4:执行 PRIMARY 路由

bash 复制代码
bash skills/scripts/master-route.sh \
  --hint "使用 Ghidra 反编译自编译的 demo.elf,定位校验函数" \
  --project-root "$PWD/lab"

根据当前 routing.json 的匹配规则,预计 PRIMARY 为 skills/ghidra-reverse/SKILL.md。命令会在指定项目的 work/master-route-.../ 目录中写出 route-scope.md。这个文件是路由决策记录,还不是授权完成的 scope.md。

步骤 5:初始化只允许离线分析的 Case

bash 复制代码
bash skills/scripts/case-init.sh \
  --hint "使用 Ghidra 分析自编译的 demo.elf" \
  --case-name fnv-local \
  --preset offline-sample \
  --sample "$PWD/lab/demo.elf" \
  --project-root "$PWD/lab"

检查生成的 Scope 内容是否准确记录了自有样本、离线模式、权限依据,随后执行:

bash 复制代码
bash skills/scripts/case-guard.sh \
  --case-root "$PWD/lab/work/fnv-local"

只有在 CASE-GUARD OK 时,才进入后续约定范围内的分析。若提示 Not Ready,应修正 Scope,不要把 --force 当作绕过授权的办法。

步骤 6:分析文件与验证函数

先使用本地通用只读命令:

bash 复制代码
nm lab/demo.elf | grep fnv1a
objdump -d -M intel lab/demo.elf | less
sha256sum lab/demo.elf

如果本机已有可用的 Ghidra,并且已经在 Tool Index 里确认了安装情况,再按 skills/ghidra-reverse/SKILL.md 的步骤导入这个自有文件 ,定位 fnv1a,检查乘法常量 16777619、初始状态 2166136261 和逐字节异或的循环。

一个有意义的核验任务是:对照 -O0 与 -O2 版本,观察反汇编的指令和控制流如何变化,而输出结果为何保持一致。

这里没有虚构"AI 已定位某地址""Ghidra 已生成某伪代码"之类的结果。具体地址、基本块和指令以读者自己编译出的二进制和工具实际输出为准。

步骤 7:整理 Evidence 并进行案件审查

可以保存 sha256sum、nm、必要的反汇编截图和对照测试日志,写入 work/fnv-local/evidence/,按 skills/ops/evidence-finding-path.md 建立 E-xxx、F-xxx 引用,补齐 timeline.md 和 workitems.md。

完成有效记录后,再执行只读审查:

bash 复制代码
python3 skills/case-review/scripts/review_case.py \
  "$PWD/lab/work/fnv-local" --verify-hashes --strict

审查失败通常意味着 Scope、引用或 Hash 信息不完整;不应该被解读为"逆向过程本身失败"。

08. Windows、Codex、Cursor:怎么接才实用?

Windows 原生脚本入口是 PowerShell 版本。仓库 README 给出的基础检测命令为:

powershell 复制代码
powershell -NoProfile -ExecutionPolicy Bypass -File skills/scripts/refresh-tool-index.ps1

路由和 Case 初始化也有对应入口:

powershell 复制代码
powershell -File skills/scripts/master-route.ps1 -Hint "使用 Ghidra 分析自有 ELF 示例"
powershell -File skills/scripts/case-init.ps1 -Hint "离线本地样本分析" -CaseName "local-review"

上面第二行没有提供授权信息,只用于初始化待检查的 Scope,不代表可以立即对目标 ACT 。本地样本的完整 PowerShell 参数和批准流程请以 skills/MASTER-ROUTING.md 为准。

对于 Codex、Cursor、Antigravity 等 Agent,最通用的接法是:在项目工作区 明确引用这个仓库的根目录和 skills/SKILL.md,让 AI 按 routing.json 选择分析路径,并以单独批准的步骤运行本地命令。

仓库的 plugins/reverse-skill/ 提供了可选的 Codex 适配入口;它不会仅因为存在而自动注册 Ghidra、Frida 等外部 MCP 服务。Antigravity 的实际接入应以当前客户端支持的 Skills/工作区规则机制为准,不应臆造"一键官方插件"。

一个可直接复制的 Agent 指令模板:

请仅针对我拥有或已明确授权的样本工作。先只读检查 reverse-skill 的规则与当前机器工具状态,告诉我本次任务的 PRIMARY Skill、必要依赖、准备执行的命令以及预期文件写入。没有我的确认不要运行仓库脚本、下载依赖、启动服务、修改全局配置或接触外部目标。获得批准后,按 Scope、Timeline、Evidence、Finding、Path 记录结果,区分观察、推断和未知项,并输出可复现的测试与报告。

09. field-journal:所谓"自动进化",具体进化的是什么?

项目通过 skills/field-journal/ 保存复盘记录,内容包括某类样本的处理步骤、工具兼容性问题、错误修正和可复用模式。_index.md 用来帮助后续任务更快查找先例。

它的价值不是"AI 自动训练了一个更强的新模型",而是把经验以文档形式积累到下一次任务可以读取的知识库中。如果写回仓库或贡献到公共 GitHub,还应先脱敏并经过用户同意。

建议在团队使用时额外加入三项约束:所有 Journal 都记录来源和验证状态;任何含有 Token、客户信息、真实 IP/域名的内容必须脱敏;历史经验只能作为参考,不能代替当前证据和授权范围。

10. 它与 REA 是竞争关系,还是互补关系?

对比维度 REA(morluto/rea) reverse-skill(zhaoxuya520/reverse-skill)
核心定位 分析能力接口,提供 CLI 与 MCP 路由与作业规范,组织 Skill 和外部工具
主要输出 结构化分析事实、关系与 Evidence PRIMARY、Scope、执行记录、Evidence/报告
是否自带反编译引擎 不自研代替所有引擎,依赖 Ghidra/Hopper/IDA 等 不自带万能反编译引擎,调用现有工具或服务
适合解决的问题 如何提取并关联程序中的分析事实 应当先做什么、使用哪个方法、如何管理风险与交付
一起使用 可作为某种分析工具能力来源 可作为上层分析工作流管理方式

我的建议是把二者看成可组合的两层,而不是简单二选一:reverse-skill 负责安排正确的方法与 Scope,REA 在适用目标上提供标准化分析能力,最终再由测试和 Evidence 判断结论能否成立。但这只是集成架构建议,并不是 reverse-skill 已经原生集成 REA 的声明。

11. 工程落地时还需要注意什么?

第一,Skill 不等于权限。 给 Agent 一个任务路由规范,并不代表它拥有执行危险操作的授权。必须结合用户批准、最小权限和系统隔离。

第二,工具自举存在供应链风险。 任何下载或自动安装都应核对软件来源、版本、校验信息、依赖许可证以及预期变更,尤其不要把未知脚本直接放进生产主机执行。

第三,路由是基于当前关键词规则的。 它不是深度语义理解器。含糊的任务可能进入兜底或产生交叉命中,复杂任务仍然需要人工复核 PRIMARY。

第四,证据链需要真实数据。 仅有 Markdown 模板不意味着结论已经被验证;需要具体的源文件、日志、哈希值、反编译结果或独立复现。

第五,维护成本不可忽略。 Skill 数量多了以后,版本、路径、测试基准和文档都会发生漂移。仓库自带的路由回归和一致性检查,是把 Skill 项目从"提示词合集"提高到工程化水准的重要基础。

12. 结语

reverse-skill 最值得借鉴的,不是哪一条破解命令,而是它给出了一个思路:让 AI 的逆向调查有入口、有规则、有授权、有工具状态、有证据,也有可复用的复盘。

对于个人开发者,可以先从一份离线 ELF 或自己的 Android APK 开始;对于团队,更适合进一步把 Scope Gate、案例审查和工具版本管理纳入统一开发流程。

归根结底,AI 负责辅助推理,工具负责真实观察,证据负责约束结论,最终测试负责验收。

参考资料

许可提醒:reverse-skill 主仓库采用 MIT 许可,但部分子模块与第三方工具可能有独立许可证。本文只讨论合法授权的软件分析、教学实验与防御研究。

相关推荐
wespaul1 小时前
VeapAI 自然语言操作实战|第 05 篇:向量与召回——从知识条目到可检索资产
大数据·数据库·人工智能·milvus
mingbaiceping1 小时前
复旦-华盛顿大学EMBA:2026年AI课程矩阵解析
人工智能
李福春2 小时前
技术思考问题17:上了LangChain框架就等于AI-Agent工程化吗?
大数据·人工智能·langchain·深圳同盟·腾讯云架构师技术同盟·llm应用架构·编排抽象
揽秀亭长2 小时前
AIGC 检测原理拆解与论文降 AI 率的可复现处理流程(2026版)
人工智能·aigc
羞儿2 小时前
【DSH】为什么需要-Harness
人工智能·大模型·harness·认知构建
JackLam4 小时前
AI-安装ChatGpt Codex
人工智能
强哥聊算力4 小时前
《算力江湖·英伟达传奇》第七集:ChatGPT出现前夜,英伟达发生了什么?
服务器·人工智能·算法·ai·chatgpt·gpu算力
吴佳浩5 小时前
Run:ai 开源了,我把 GPU 编排摆回 AI 栈里看了一遍
人工智能
IT_Octopus6 小时前
【零基础入门 LLM 开发 · Day 13】:LangChain 的对话记忆——Message 对象版
人工智能·python·langchain