REA源码分析
前言
4eeK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6E0L8%4u0D9N6i4c8G2i4K6u0r3M7X3g2S2
这个 agent 有点神秘:172 个 MCP,明明 r2 能解决的跨平台问题,偏要加上 IDA MCP、Ghidra MCP、Hopper MCP 去解决二进制逆向,其它的我没学过就不去评价了。(MCP 先干飞 1/5 上下文,search_tool 要默认开啊肯定。) 3天就有100k的stars, 请输入文本。
正文
1. skill 部分
这套 skill 的骨架是整个仓库里质量最高的东西——progressive disclosure、路由表、证据纪律、可复制的 recipe 全部在线。额但是这个作者搞的几乎全是软约束
1.1 可以借鉴的地方
结构上 SKILL.md(237 行)只做路由,把细节拆成 6 篇 reference,并在结尾(SKILL.md:219-230)明确"只读相关的那篇"。这是 Anthropic 推荐的 skill 范式,很多 skill 连 frontmatter 的 negative trigger 都不写,它写了(SKILL.md:3:Skip REA for ordinary source-repository architecture analysis)。
真正有价值的是三块:
- 路由表(
SKILL.md:41-101):给定 target 类型 → 该调哪个第一个工具。ASAR→analyze_javascript_application、APK→inspect_android_package、firmware→inspect_firmware_regions、Go→inspect_go_binary……对 agent 来说这是最省事的部分。
- 证据纪律:observation / inference / unknown 三分,引用 Evidence ID,静态不得冒充运行时(
runtime-observation.md:11-13),"缺失 ≠ 等价"(SKILL.md:173-176)。这是它区别于"让模型瞎编"的核心。
- 可复制的 recipe:
inspect_analysis_view 的 page/item JSON 模板带占位 ID(javascript-applications.md:62-86)、DOS COM entry 0x10100(native-and-artifacts.md:169)、@rpath 解析、Codex per-tool approval 的 TOML(connection-and-recovery.md:80-86)、恢复决策表(connection-and-recovery.md:14-21)。这些是从血里熬出来的,抄得动。
1.2 但它写成了"文档",不是"skill"
- 体量本身就是在复制它自己抱怨的病。 全套约 1003 行,
SKILL.md 一激活就吃 237 行再加至少一篇 reference。它和 172 个工具描述叠加,正是它在 installation.md:202 承认的 autocompact is thrashing 的来源之一。用文档解决"文档太多",循环了。
- 满篇 hedge,说明它自己不信自己的版本。
when advertised / when the connected schema advertises / when advertised by the connected server(SKILL.md、javascript-applications.md:13,27,35)。skill 本应对"当前安装版本"是权威,结果它教 agent 运行时去探测能力——根因就是 main 与 npm release 的 schema 分裂。
- 冗余。
binary_session 的 tool_availability 段落在 SKILL.md:121-131 和 native-and-artifacts.md:62-76 几乎逐字重复;oversized-response 恢复在 SKILL.md:147-171、javascript-applications.md:112-128、evidence-workflows.md:3-12 出现三遍。reference 之间重复尚可(各读各的),但 SKILL.md 正文复制 reference 纯烧 token。
- 双写漂移。 它是
src/contracts/ 的散文副本,靠满篇 hedge 掩盖不同步。metadata.version: "39" 这个手动修订号,本身就是"内容反复改、但没人保证和代码一致"的证据。
1.3 工作流是软约束,不是硬约束
没有在代码里面强行让大模型提交证据和结果, 塞了一个skill然后全靠自觉可还行。
1.4 "reverse anything":广度真、深度假
README.md:153-171 那张能力表,一行一行读 requirements 列,规律:
| 目标 |
真正干活的是谁 |
| Native binaries |
Hopper / Ghidra / IDA(自带) |
| Offline ELF layout |
caller-supplied pwntools,仅 Linux x64 |
| WASM |
caller-supplied WABT 1.0.42 |
| EVM |
本地 raw/hex carrier,仅 Linux x64,EVMole |
| Recorded crashes |
caller-supplied pwntools,仅 Linux x64 |
| Firmware |
Binwalk / Unblob,仅 Linux |
| Android APK |
Headless JADX + 完整 JDK |
| Android devices |
caller-supplied adb |
| JEB projects |
caller-started JEB MCP |
| Android resources |
caller-supplied Apktool |
| HAR captures |
mitmdump(Linux) |
| Websites |
Chrome 系浏览器 |
| Process behavior |
Linux/macOS 的 native PTY |
| Go |
内置,但只做元数据 |
| .NET |
内置,但静态 only |
| Packages / resources |
内置解析 |
全部依靠外部助力而且还塞了一堆重复的东西是真的有点猎奇。
再叠加 docs/windows-ghidra-p0.md:10(experimental … read-only P0 boundary)、IDA 只读、docs/roadmap.md:11-18 里"扩展原生架构/类型/间接调用验证、打通静态与运行时"这些还没做完的事——所谓 anything,准确翻译是:
anything,前提是你本来就已经装好了对应的专业工具、目标又恰好在它验证过的平台上、而且你只问符号/元数据这一层的问题。
所以 reverse anything 不算纯标题党(广度是真的,文件类型覆盖确实多),但它是典型的标题党式营销:用"anything"盖住了"BYO 引擎 + 平台窄 + 深度浅"这三条脚注。它真正卖的不是反编译引擎,而是一套跨工具的统一证据/权威协议——这个定位值得说清楚,但绝不是"reverse anything"。
2. MCP 部分:172 个工具,先干飞 1/5 上下文
installation.md:198-200 是项目自己给的数据:
- 172 个工具,默认 profile 的
tools/list 约 496 KB ≈ 120k tokens;compact profile 约 290 KB ≈ 68k tokens。
- 项目在
installation.md:200 亲口承认:Compaction cannot remove tool definitions;installation.md:202 承认会触发 Claude Code 的 autocompact thrashing。
也就是说,一个逆向工具,先把自己的工具清单变成了上下文杀手。 更要命的是它没打算自己解决:deferred loading / tool search 是客户端的功能,不是 REA 的。仓库里所有 tool_search 都出现在验证脚本里(scripts/verify-native-agent-client.mjs:301-302:Hermes native deferred tool_search must be available),服务端 capabilities: {}、没有 tools/list_changed、172 个工具无条件全注册。它唯一的瘦身手段是 compact 广告 schema(EvidenceMcpServer.ts:70-112),工具一个都没少。
所以"search 默认要开"这件事,在 REA 这边根本不存在开关——因为服务端压根没实现,全靠客户端施舍。
3. provider 部分:真的假的3个重复mcp
r2 本身就能覆盖多架构(x86/ARM/MIPS/PPC/…)的反汇编,配 r2ghidra 还能反编译,交叉引用、patch、调试也都在一个进程里。REA 的路线是反过来的(可能大佬的思维跟我不太一样):
- Hopper(商业、macOS 为主)+ Ghidra(重型、headless 桥接、P0 只读)+ IDA(只读、需要 mrexodia/ida-pro-mcp) 三套并存,各自一套适配器、协议、生命周期、schema;
- 外加 JADX、Apktool、JEB、adb、WABT、EVMole、binwalk、unblob、pwntools、pwndbg/GDB、mitmdump、Chrome 一大串
caller-supplied;
这套 provider 矩阵就是 172 个工具的来源:几十种底层能力 × 每个都被"证据契约 + 客户端适配"放大成独立端点。为了证明每个客户端都接好,scripts/ 里躺着一排 verify-claude-client / verify-qwen-client / verify-opencode-client / verify-omp-client / verify-gemini-client / verify-deepseek-client / verify-grok-client ...。
代价是:36 个运行时依赖、178 个 npm script、1568 个 TS 文件、32 万行代码、915 个测试文件(占源文件 58%)。一个"调用别人工具"的项目,一半以上的代码在描述"我返回的证据长什么样"。
4. 源码部分
src/ 1568 个文件、323,724 行,tests/ 713 个文件、153,433 行,scripts/ 258 个文件、53,919 行,bridge/ 30 个文件、8,998 行。加起来近 54 万行,去包装一堆本来自带的反编译工具。
5. 总结
- skill:真的不打算搞成硬约束吗
- MCP:172 个工具、120k tokens,服务端不做 search 激活,把问题甩给客户端。
- provider:该用 r2 一把梭的地方,堆成了 Hopper+Ghidra+IDA 三套胶水(其实可以放设置里的)。
- 源码:工程质量上游、工程判断下游;54 万行里很多是过度设计与适配器重复。
- 本质:它不是逆向引擎,是套在一堆自带工具外面的统一证据/权威协议层。这个价值是真的(溯源、权限边界、unknown 显式化),但它用"reverse anything"的口号、172 个端点和 32 万行,把这点真价值埋了。
碎碎念
(2026-10-12):
| 指标 |
数值 |
| Stars |
128,205 |
| Forks |
28,706 |
| Watchers |
399 |
| Open issues |
234 |
| 创建时间 |
2026-04-14 |
| 最后 push |
2026-10-12 |
| README 自称 |
110,000 stars |
宣传的力量还是太强大了, 半成品能有100k+ stars说不羡慕绝对是假话。一堆造神的、乱吹的哪里都有, 不吃流量会死是吗。