把 Hopper、Ghidra、IDA 接进编码 Agent:REA 逆向工作流实战
【免费下载链接】reaReverse engineer anything with agents, from app behavior down to native binaries.项目地址: https://gitcode.com/GitHub_Trending/rea2/rea
你手上有一个 .so 或 Mach-O,想弄清某个功能怎么实现,却没有源码。让 AI Agent 替你翻反汇编,一直缺合适的接口。REA 就是为此而生:一个 npm 包,把对原生二进制、JS/Electron、.NET、APK、固件与网页的本地逆向分析,打包成 CLI 命令加 MCP 服务器,供你和编码 Agent 共用。
能逆向哪些目标,哪些必须自备引擎
按目标类型,REA 能直接给出的结果大致分两档。
- 原生二进制:伪代码、汇编、字符串、符号、调用与交叉引用,前提是本机装有 Hopper、Ghidra 或 IDA。
- JS / Electron:模块清单、导入关系、源映射、IPC 与原生插件关系,纯静态、不需要任何原生引擎。
- .NET 程序集:PE/CLI 元数据、成员与 IL,同样静态、无外部依赖。
- 安卓 APK:清单声明、类、反编译方法与引用,走自带的 headless JADX。
- 网页 / 固件 / 进程 / SQLite / pcap等也各有对应路径。
和手动开引擎翻窗口相比,差别在于:你不用自己点反汇编窗口,而是让 Agent 经 MCP 拿到带证据、局限性和未知项的结构化结果,并能连续追问。它也不会运行你的目标应用——静态路径只读文件,运行时捕获才以你当前权限去跑/交互,且不上传目标。
内部机制走查:从一条命令到分析证据
入口:分发器先分流 CLI 与 MCP 双通道
一切先过scripts/rea.mjs。它不急着加载业务代码,而是先确认dist/编译产物是否存在(缺失就提示重新构建),再看参数:是mcp就走 stdio 长会话服务器,其余参数交给src/cli.ts这个一次性 CLI 适配层。两条通道最后落到同一套底层工作流,所以你在终端和让 Agent 调用,看到的是一致的。
选择:确定性选引擎,不静默回退
到了应用层,src/application/binary/里的SessionProviderRouter配AnalysisProviderRegistry负责选引擎。规则很死:只有一个可用引擎支持该目标就自动用它;多个候选都支持却没指定,就返回ambiguous错误并把candidate_ids列给你挑。这是故意的——避免你以为结果来自 Ghidra、实际来自别的引擎。
桥接:私有套接字 + 引擎内桥接代码
选定引擎后,src/hopper/这类适配模块通过 Unix 套接字,和跑在引擎内部的桥接代码对话:Hopper 侧是bridge/hopper_bridge.py,把请求翻译成 Hopper 自己的 Python API;Ghidra 侧则是一个打包进bridge/ghidra/ReaGhidraBridge.java的 HeadlessScript。src/process/统一负责进程组、截止时间和清理,保证引擎进程不会失控。
并列的执行层适配,各自靠不同方式拿结果(下表只描述机制,不重复列路径):
| 目标 / 能力 | 怎么拿结果 | 备注 |
|---|---|---|
| Hopper 适配 | Unix 套接字 + 引擎内 Python 桥 | 需本机 Hopper |
| Ghidra 适配 | 打包 HeadlessScript 桥,支持 16 位 DOS | 需本机 Ghidra |
| IDA 适配 | 接管现有会话(GUI 绑定或自带 headless 库) | 经上游 ida-pro-mcp |
| .NET 静态 | 进程内解析 PE/CLI 元数据 | 无外部引擎 |
| 安卓 APK | 自带 headless JADX | 需完整 JDK |
| 固件 | Binwalk / Unblob 分区提取 | 仅 Linux |
| 进程行为 | 本地 PTY 捕获 | Linux/macOS |
输出:结构化证据 + 快照缓存
结果不是裸伪代码,而是带证据、局限性和未知项的结构化输出。同一进程之间没有共享内存,想让后续命令复用前面的结果,就用--snapshot落盘一份快照文件;当目标字节、操作、参数、Provider 和设置完全一致时,REA 会直接命中缓存而不重启引擎。
最小可跑通路径:四条命令到第一次输出
先注册,让编码 Agent 拿到 REA 的 MCP 工具。
npx rea-agents setup你会看到:可多选的 Agent 列表、拟议的配置变更与备份提示,确认后重启你的 Agent 即可。
装一个常驻命令,后面几条命令更短。
npm install --global rea-agents你会看到:安装完成,rea --help列出setup/analyze/doctor等命令组。
先跑一条不需要原生引擎的静态分析,用来熟悉输出结构。
rea analyze-javascript-application /绝对路径/应用 --json你会看到:模块清单、导入关系、Electron 边界及其对应证据。
确认本机引擎是否就绪,再碰原生目标。
rea doctor --json你会看到:按任务范围给出的引擎可用性与 Agent 注册状态(对齐 / 缺失 / 失效等),只读不改任何东西。
真正跑一次原生逆向,并顺手存一份快照。
rea analyze /绝对路径/程序 --provider ghidra --snapshot /绝对路径/analysis/program.json你会看到:二进制总览——伪代码、汇编、字符串、符号与交叉引用,同时落盘一份快照;重复同一查询可直接复用缓存。
边界与代价
- 需要自备引擎:深度原生分析要本机有 Hopper/Ghidra/IDA;没有引擎时只有静态 JS 与 .NET 路径可用。
setup可在批准后帮你装 Hopper,Ghidra/IDA 用你已有的(见docs/installation.md)。 - Provider 选择无回退:多引擎都支持目标而没指定时,会收到
ambiguous错误并列出candidate_ids,从中显式挑一个——这是有意设计,避免结果来源混淆。 - JS 证据文件可能巨大:README 有真实案例,一个 334 MB 的 Obsidian 应用证据文件,建议先落盘,再用 summary view 投影出约 10 KB 的摘要(见
docs/cli.md):jq -c '{source:{kind:"inline",evidence:.},view:{kind:"summary"}}' app-evidence.json > app-view.json - 每次 CLI 是独立进程:想让后续命令复用前面的结果,要靠
--snapshot存快照文件,别指望内存状态。 - 大二进制易撞超时:用
REA_GHIDRA_STARTUP_TIMEOUT_MS或REA_HOPPER_STARTUP_TIMEOUT_MS调高启动截止。 - 平台限制:进程捕获要原生 PTY(仅 Linux/macOS);Linux 上 Ghidra/JADX/静态 JS 还需要
PATH里有 procps 的ps。 - 本地分析是承诺也是边界:目标不上传,但你的 Agent 会拿到工具返回内容;敏感目标要留意 Agent 侧的上下文管控。
适用人群与下一步
如果你要"用编码 Agent 逆向一个没有源码的目标,并且要能拿证据说话"——竞品功能调研、安全排查、旧二进制行为考证——REA 是少数把 Hopper/Ghidra/IDA 这类重引擎完整接进 Agent 工作流的开源方案;如果你只是偶尔手动反汇编,直接开引擎反而更轻便。
- 先跑
rea doctor --json,确认本机引擎已就绪。 - 读
docs/cli.md的快照与证据投影小节,把一条分析结果存下来再投影出摘要。 - 顺
docs/architecture.mermaid的分层图读应用层会话路由,重点看引擎选择与桥接两层,基本就能掌握它的全部内部逻辑。
【免费下载链接】reaReverse engineer anything with agents, from app behavior down to native binaries.项目地址: https://gitcode.com/GitHub_Trending/rea2/rea
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考