如何验证 REA 的反编译结果可信:用真实 Hopper、Ghidra 和 IDA 完整跑一遍端到端验证
【免费下载链接】reaReverse engineer anything with agents, from app behavior down to native binaries.项目地址: https://gitcode.com/GitHub_Trending/rea2/rea
你让反编译器吐出一段伪代码,格式漂亮、逻辑自洽——但它凭什么值得写进结论?REA 是一套面向 AI Agent 的逆向工程 MCP 工具集,针对"引擎到底说了真话还是在糊弄"这个问题,它内置了真实引擎验证流程:用你本机已装好的 Hopper、Ghidra 或 IDA 把完整分析链路跑一遍,逐条核对结果、交叉引用、目标切换和进程清理。这篇指南写给还没跑过这套验证的新手:三条流程各要备什么、怎么跑、报告里哪几个字段最重要。
它到底解决了什么问题
引擎能启动,不代表结果可信。这套验证要回答的就是:反编译、引用分析和资源清理,是否都和真实引擎的行为对得上,而不是只检查了一个 mock。
开始之前,把准备工作一次列清
三条流程都写在仓库根目录package.json的 scripts 里,都在仓库根目录运行,命令内部会先构建产物,不需要你手动 build。差异在外部依赖上,先对照这张表自查:
| 命令 | 前置条件 | 验证对象 |
|---|---|---|
npm run verify:hopper | 已安装 Hopper;测试夹具由命令自动构建 | 真实 Hopper 全流程:工具清单对账、分析与 C 预言机比对、目标切换、彻底清场 |
npm run verify:ghidra | GHIDRA_INSTALL_DIR指向解包好的 Ghidra 12.1.4;JAVA_HOME或 PATH 里能用到 64 位 JDK 21+;主机装有cc | 只读操作集、stripped 符号行为、间接调用与 CFG、异常路径与进程/项目清理 |
npm run verify:ida | 已有 IDA(GUI 或 headless)与上游 ida-pro-mcp 服务;REA_IDA_MCP_CONFIG指向 MCP 注册 JSON | CLI 与 MCP 的结果一致性、上游数据库与工作区清理、原始二进制未被修改且从未被执行 |
跟着跑一遍:npm run verify:hopper 全流程
Hopper 这条覆盖面最广,就拿它完整走一次。装好 Hopper 后,在仓库根目录敲下:
npm run verify:hopper
命令会先构建测试夹具与产物,再启动验证脚本。跑起来之后,你会看到脚本第一件事是对当前 Hopper 运行状态做快照——后面判断"有没有残留"全靠这个基线。
接下来它从夹具清单里取三个目标:主目标、次目标和一个大型符号目标,每个都带 SHA-256 校验,一个字节对不上就停。随后脚本启动生产版 MCP 服务器并连上,先做对账:会话声明的工具可用性必须与服务端的实际工具清单逐项一致,多一个、少一个都算失败。对完账,才谈得上分析。
然后打开主目标,依次执行list_procedures、read_bytes、xrefs、batch_decompile、analyze_function,把每一项结果与 C 夹具里预先写好的"标准答案"(oracle)逐条比对。跑完主目标后切到次目标:文档必须被替换而不是叠加,重复打开同一目标也不许出现重复文档。大型符号目标则用来验证完整清单。
最后一段是最有分量的清场检查:Hopper 自带的 MCP 服务没有运行、与验证无关的 Hopper 实例还活着、临时会话目录全部清掉、验证器自己拉起的子进程归零。四项全过,报告里才会出现cleanShutdown: true。任何一步失败,脚本会带着失败信息退出,不会给你一个含糊的绿勾。
另外两条流程套路相同:构建产物、真跑一遍、出 JSON 报告。
| 命令 | 跑什么 |
|---|---|
npm run verify:ghidra | 现场用cc把带版本号的 C 预言机源码编成 debug 与 stripped 两个原生目标,再核对 25 个只读操作(清单、搜索、反编译、汇编、调用/被调用、引用、CFG、类型恢复)、外部函数与解析后的 thunk、导出符号、strip 后的符号行为、含无目标计算跳转的间接调用,以及取消、启动超时、并发串行化、畸形目标在 provider 启动前被拒、进程与项目清理。更完整的 Ghidra 契约见 docs/ghidra-provider.md |
npm run verify:ida | 不装任何工具链,复用你已有的 IDA 与上游 ida-pro-mcp 服务。先跑生产 CLIrea function <target> <procedure> --provider ida --json(procedure 默认rea_fixture_add),断言伪代码与汇编非空、Evidence 结构完整;再在单条 MCP 连接里完成open_binary、analyze_function、xrefs与字符串搜索,确认 CLI 与 MCP 的函数身份、伪代码、汇编完全一致;收尾验证 attached 模式 GUI 目标仍是原始输入,headless 模式自建数据库已从上游会话消失、私有工作区已删除,原始二进制全程未被修改、从未被执行。接入方式见 docs/ida-provider.md |
Ghidra 还有几条扩展命令:verify:ghidra:cross-format(AArch64 ELF、x86-64 PE、Mach-O 跨格式)、verify:ghidra:switch、verify:ghidra:dos、verify:ghidra:nativeaot,跑法一致,只是目标不同。
报告怎么看:4 个字段定去留
三条流程结束时都会输出一份 JSON 报告,不用逐行读,盯住这几个:
passed/cleanShutdown:总体结论。IDA 报告看passed,Hopper 报告看cleanShutdown——清场没做完时它是false,脚本同时报错,这份报告等于事故现场。checks:逐条通过的断言,比如 IDA 报告里的 "original binary unchanged and never executed"。少了哪条,就知道哪个阶段没跑完。targets/targetHashes:被分析的目标路径与 SHA-256。拿它和自己手头的文件对一下,就能确认证据出自哪一份二进制。verifier_run.process_lineage:验证器自身拉起的子进程谱系,status必须是verified且descendants为空,否则连验证器自己都漏了进程。
报告里的结论不靠嘴说:每一条 check 背后,都是对真实引擎的一次调用加一次比对。
⚠️ 常见卡点:引擎没装、环境变量漏配
verify:ghidra一启动就报 GHIDRA_INSTALL_DIR 错误:原因——脚本只接受指向 Ghidra 12.1.4 安装根目录的绝对路径,相对路径或指错目录都会被拒。解法:export GHIDRA_INSTALL_DIR=/绝对/路径/ghidra_12.1.4_PUBLIC后再跑。- 卡在 JDK 或 Ghidra 版本检查:原因——这条流程只承诺 Ghidra 12.1.4 + 64 位 JDK 21+,系统默认 Java 太老或 Ghidra 版本漂移都会在此停下。解法:用
JAVA_HOME明确指到 JDK 21,别依赖 PATH 里的默认版本。 verify:ida提示缺--target或REA_IDA_MCP_CONFIG:原因——这是故意的守卫:该流程不替你装任何工具链,目标与注册文件缺一即拒。解法:先按 docs/ida-provider.md 的说明生成上游 MCP 注册 JSON,再导出REA_IDA_MCP_CONFIG并带上--target <二进制路径>。- 仓库刚 clone 下来就跑,构建步骤失败:原因——没装依赖,产物构建跑不通;本地没有对应引擎时,对应的验证流程本来就跑不了。解法:先
npm ci、装好引擎;只想先熟悉流程的,可以先git clone https://gitcode.com/GitHub_Trending/rea2/rea把验证脚本读一遍。
一句话:引擎说真话,报告里才有证据。想继续深入,测试方法论在 docs/testing.md,三个引擎的适配器源码分别在 src/hopper/、src/ghidra/、src/ida/。
【免费下载链接】reaReverse engineer anything with agents, from app behavior down to native binaries.项目地址: https://gitcode.com/GitHub_Trending/rea2/rea
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考