ARTICLE · 1178665
逆向一切,让 AI 替你逆向软件:REA 把 Hopper、Ghidra、IDA 接进了 Agent

我在某个软件里看到一个挺顺手的交互,想在自己项目里复刻一个。没有源码。
传统做法是装 IDA 或者 Hopper,找函数,读汇编,一坐一下午。后来我发现有个叫 REA 的开源项目,把这个活儿挪给了 AI Agent。
仓库在 morluto/rea,MIT 协议,TypeScript 写的,npm 包叫 rea-agents,版本 6.4.0。GitHub 上 20.7 万 star、5 万 fork。
20 万这个数我得说清楚。这仓库 2026 年 4 月才建,最早叫 betterBinaryMCP,是给 Hopper 反汇编器做的 MCP 服务器。四个月涨到这个量级,更像踩中了 MCP / Agent Skills 生态那波,而不是逆向圈十几年的口碑积累。别拿星数当它逆向能力强弱的证据,那是两回事。
它干的事其实很朴素:把 Hopper、Ghidra、IDA、GDB 这些逆向工具,用 MCP 协议接进你的编码 Agent,让 Agent 去读二进制,然后用人话告诉你这个功能是怎么实现的。
我真的跑了一下
光看文档看不出味道,我拿本地的花生公众号排版器目录喂给它试。
不需要任何逆向引擎,一条命令:
npx -y rea-agents@latest analyze-javascript-application /path/to/huasheng_editor --json它先把目录里 14 个源文件盘了一遍:app.js、index.html,还有十来个 load-*.html。然后建出一张 JavaScriptApplicationGraph。我看到的输出里,它认出 index.html 是 electron-renderer 角色,找到我通过 <script> 引的 https://cdn.jsdelivr.net/npm/vue@3.4.15/dist/vue.global.prod.js。接着按 event-emitter、child-process、promise-ownership、request、resource-lifecycle、timer 这几个"关系族"去归类代码里的关系,每一族都给了 retained_relations 的数量,外加一堆没解析出来的 unknown 节点 id。
最有意思的是它没把"没解析出来"这件事糊弄过去,直接甩给我 11 条 limitations,比如"Graph coverage is incomplete; unavailable facts remain explicit and must not be read as absence","JavaScript and HTML were parsed as inert text; bundle bootstrap code was never executed"。
翻译过来就是:图不完整,没看到的不许当成不存在;代码是当静态文本解析的,从没真正跑过。
它返回的不是一个答案,是一份结构化证据。一个 evidence_id 指向这次分析,normalized_result 里装着图、节点、关系族和它们各自的覆盖率,limitations 列出哪些没解析到。你要哪一段,就按那个 id 去翻。结论附在证据上,证据可以单独索引和复用,这是 REA 区别于普通"调个工具吐点字符串"的底子。
这是我觉得 REA 最值得讲的一点。它不替你把"不确定"美化成"确定"。一个会主动说"我不知道"的工具,比一个什么都答得头头是道的工具可信得多。
顺带说个尴尬事:这次跑完它报了个 cleanup_incomplete,原因是 sandbox 里"process table could not be inspected: spawn EPERM"。分析本身出结果了,证据也留了(一个 evidence_id 加一坨 partial_observation),只是清理这一步没走完。文档写了遇到 cleanup_incomplete 要先处理它报告的残留资源再开下一个目标,别硬来。
装和配
REA 只有一条硬要求:Node.js 22.19 以上(或 24.11+ / 26+)加 npm。注意 23 和 25 这两个奇数版本它不要,正好在用的话先换掉。
接进 Agent 就一条命令:
npx rea-agents@latest setup它不会上来就改你配置。先把计划列给你看:写哪个客户端的配置、装哪个 skill、装到哪、连什么外部来源。你点头它才动,动之前先给现有配置做备份、原子写入、写完再校验一遍。半路反悔或者 Ctrl-C,什么都不变。
支持的客户端拉得挺长,Claude Code、Codex、Cursor、Gemini CLI、Qwen Code、Kimi Code、VS Code、Copilot CLI 都在列。我只在终端用,所以走的是 npm install --global rea-agents。
原生二进制分析才需要逆向引擎,三选一。
Hopper 最省事,setup 会问你要不要装,批准后下官方 DMG、校验、装到 ~/Applications/Hopper Disassembler.app,不用 Homebrew 也不用管理员。但只在 macOS 12+ 和 Ubuntu 24.04+ / Fedora 41+ / Arch 这类发行版上能装,Windows 装不了。
Ghidra 走"连现有安装"的路子,不替你装 Ghidra、Java、Python。要 Ghidra 12.1.x 配 JDK 21 或更新。Apple Silicon 上如果 doctor 报告原生反编译器缺失,自己从源码编译:
cd"$GHIDRA_INSTALL_DIR/Ghidra/Features/Decompiler/src/decompile/cpp"make ghidra_opt ARCH_TYPE="-arch arm64" OSDIR=mac_arm_64decompiler_dir="$GHIDRA_INSTALL_DIR/Ghidra/Features/Decompiler/os/mac_arm_64"mkdir -p "$decompiler_dir"test ! -e "$decompiler_dir/decompile" && test ! -L "$decompiler_dir/decompile" && install -m 755 ghidra_opt "$decompiler_dir/decompile"rea doctor --jsonIDA 单独有配置文档。
我的建议是先从不需要引擎的 JS 路径起,像我刚才那样。一条 npx 命令就能看到它返回的证据长什么样,觉得对胃口再去配 Hopper 或 Ghidra,沉没成本最低。动手前先跑一次体检,严格只读:
rea doctor --jsonrea doctor --provider ghidra --jsonCLI 那几条
终端默认输出 TOON 格式,要给别的程序吃就加 --json。
看本机有什么引擎:rea providers --json。
原生分析那一组命令长得像这样:
rea analyze /path/to/program --provider ghidra --json # 概览rea function /path/to/program main --provider ghidra --jsonrea decompile /path/to/program 0x1000 --provider ghidra --jsonrea xrefs /path/to/program 0x1000 --provider ghidra --jsonrea trace /path/to/program "search" --provider ghidra --json分析很贵,能复用就复用。--snapshot 把结果存文件,下次同样查询直接读。证据还能拿来做 diff:rea compare left.json right.json。这一条对付"新版本改了哪里"特别顺手,把两次分析的证据丢进去,让它自己算差异。
三个官方案例,一个值得细看
官方放了几个能复现的例子。我挑计算器那个细讲,因为它最能体现 REA 和"直接问大模型"的差别。
问题是这个:Windows 计算器里 200 + 10% 得 220,200 × 10% 得 20,同一个 % 按钮,为什么行为不一样。
让 Agent 去读已安装的 Calculator 库,它定位到那个函数,逻辑是:遇到乘除时,百分比取 当前值 / 100;遇到加减时,百分比取 当前值 × 前一个数 / 100。答案还能跟微软公开源码里的 IDC_MUL、IDC_DIV 常量对上。
这就是关键。你直接问大模型"为什么计算器这么算",它给你的是猜的、读起来很像那么回事的答案,你没法验证,因为它依据的是哪一行你看不到。REA 是先去读真实二进制,把指令、调用、字符串原样取回来,再让模型解释。错了你能顺着证据往回查。
在"要复刻进自己项目"这个场景下,这个差别是决定性的。复刻要的是准确的规则,不是合理的猜测。
另外两个一笔带过:DX-Ball 把一个音效的"位置→声场"辅助函数从不完整伪代码还原成 C,过 3205 组原始用例、函数字节逐字节复现;Notion 那个顺着 renderer 的剪贴板 API 穿过 preload 和 IPC 追到主进程。都带可复现仓库链接。
几个得提前知道的坑
Ghidra 第一次查询容易超时。REA 服务端给 Ghidra 的启动预算是 330 秒,可 MCP 客户端 SDK 默认的请求超时只有 60 秒。冷启动跑不完,你先收到超时。解法是调用时把客户端超时显式拉长,比如设到 240 秒,再开 resetTimeoutOnProgress 让进度通知刷新计时。
大结果不会硬塞给你。MCP 传输有 10 MiB 帧预算,结果太大时它不截断给半份,而是转成一条留存证据引用,你再用 inspect_analysis_view 分页看,或者用 export_evidence_bundle 导到磁盘。
Kimi Code 这类客户端要开兼容。有些模型服务商对单个工具的 schema 大小有硬上限,一大就整包失败。REA 给了 REA_MCP_INPUT_SCHEMA_PROFILE=compact,把 schema 压到 13 KB 以内。变量在服务启动时读,改完要重启。
商业工具得自己买。文档写得很直白:IDA Pro / Hex-Rays、Hopper、JEB 都是商业软件,REA 不提供任何 license、密钥或激活,盗版、共享密钥、绕授权都不在允许范围内。
说句实在的
REA 现在更像给折腾党准备的螺丝刀,不是面向所有人的成品。它受众清楚:写代码的、做 CTF 的、天天泡在 AI Agent 里的那批人。愿意花半小时把环境和引擎理顺,之后"这个软件是怎么做到的"这个问题,处理方式就变了。
不愿意花这半小时也没关系。先跑一条不需要引擎的 JS 分析命令,看它返回的证据和那十几条 limitations 长什么样,再决定要不要往里投入。我现在能给的判断只到这。
资源:仓库 github.com/morluto/rea,官网 rea.tools,案例 rea.tools/showcase。















































































