rea 逆向编排层:三条命令装好体检,15 分钟还原第一个 stripped 二进制
【免费下载链接】reaReverse engineer anything with agents, from app behavior down to native binaries.项目地址: https://gitcode.com/GitHub_Trending/rea2/rea
你手上多了一个来路不明的.so,打开 IDA,Functions 窗口一片空白,光标在空白处闪了很久。rea 把这种局面压成一条终端命令:同一个 CLI 加一个 MCP 服务,让 AI Agent 和你走同样的命令去逆向原生二进制、JavaScript/Electron 应用和 .NET 程序集,返回的每个结论都带着证据。接下来先花一分钟把它的边界钉死,再按「装、验、跑」把最短链路走完,最后在一个 stripped 目标上把analyze到xrefs整条链路走通。
它不是反编译器,而是给 Agent 用的逆向编排层
先说清楚它不是什么:不是反编译器,不是调试器,也不是 IDE。它解决的核心问题只有一个——把「谁来当分析引擎」和「谁来提问」解耦:
- 引擎可插拔:Hopper、Ghidra、IDA、Kuna,装哪个用哪个
- 双入口:Agent 走 MCP,人走终端
- 证据先行:每个结论附观察、推断和未解问题,不确定的不装懂
项目已在 GitHub 拿到三万 star,Discord 日常答疑。最典型的形态是:引擎 GUI 照常打开,但操作与取数全部由桥接层代劳。
三条命令跑通安装与体检
运行时要求Node.js 22.x(>=22.23.4)、24.x(>=24.22.1)或 26.12.1+,23、25 与预发布版不支持。包名是rea-agents。
① 装。不装全局也能先用npx -y rea-agents@latest跑一次性命令;想长期用rea这个命令,就装全局。装完注册 MCP,setup先列出要改的每个配置路径和备份方式,你确认后才写入,覆盖 Claude Code、Codex、Cursor、Gemini CLI 等客户端。它从不替你装 Node、Java、Ghidra 这类外部依赖。
# 安装 CLI,再把 MCP 注册到你的 agent 客户端 npm install --global rea-agents npx rea-agents setup② 验。doctor严格只读,逐项查宿主平台、Node 版本、各引擎可执行文件;失败项后面直接跟修复命令,不替你改任何东西。
# 只读体检:全量或指定引擎 rea doctor --json rea doctor --provider ghidra --json③ 指认引擎。原生分析要告诉它 Ghidra 在哪:设GHIDRA_INSTALL_DIR即可,Java 已在 PATH 就不必再设JAVA_HOME。
环境就绪。下面选一个最小目标,把整条逆向链路跑一遍。
逆向一个 stripped 二进制的完整链路
练手目标用仓库自带的 scripts/fixtures/binary-layout.c:17 行 C,两个全局变量、一个线程局部变量、一个read_values()辅助函数和main。
#include <stdio.h> #include <stdlib.h> int stored_value = 7; char zero_backing[8192]; __thread int tls_value; int common_value; __attribute__((noinline)) int read_values(const char *text) { char buffer[32]; snprintf(buffer, sizeof(buffer), "%s", text); return buffer[0] + stored_value + tls_value + common_value; } int main(int argc, char **argv) { return read_values(argc > 1 ? argv[1] : "source-owned"); }# 编译出调试版与 stripped 版;stripped 版最能体现 rea 的价值 gcc -O0 -g -o hello_debug scripts/fixtures/binary-layout.c gcc -O0 -s -o hello_stripped scripts/fixtures/binary-layout.c没有符号表,rea 依然能还原函数边界。四条命令由浅入深。
A. analyze:拿概览,先钉住目标身份
# 原生概览:身份、符号、字符串、函数 rea analyze /absolute/path/to/hello_stripped --provider ghidra --json返回的 JSON 里,artifact段是后面所有结论的锚点:路径、SHA-256、大小,目标字节一变,身份就失配。coverage说明哪些分析完整、哪些只是部分观察;unknowns列的是「确实没解出来」,而不是被悄悄忽略。limitations还会反复提醒你:伪代码是反编译器输出,永远不是原始源码。
B. function / decompile / instructions:给 main 建档案
# main 的完整档案,以及伪代码与原始指令 rea function /absolute/path/to/hello_stripped main --provider ghidra --json rea decompile /absolute/path/to/hello_stripped 0x401146 --provider ghidra --json rea instructions /absolute/path/to/hello_stripped main --provider ghidra --jsonfunction返回档案(dossier):入口地址、调用者与被调用者、控制流图,外加最多 3000 条 p-code 操作与 12000 条 def-use 边。decompile给可读伪代码。instructions只读 Ghidra Listing 的原始指令,不启动反编译器。三者语义边界严格分开——这是它和「一把梭反编译」最大的不同。
C. xrefs 与 search:从入口追到数据
# main 的引用,加上字面量与正则两种搜索 rea xrefs /absolute/path/to/hello_stripped 0x401146 --provider ghidra --json rea search /absolute/path/to/hello_stripped "source-owned" --provider ghidra --json rea search /absolute/path/to/hello_stripped "^read_" --mode regex --kind procedures --provider ghidra --jsonxrefs返回有界列表,调用、跳转、数据、读写分类保留原始 ReferenceManager 类型;search用--kind strings|procedures选范围、--mode literal|regex选匹配。在这个 stripped 目标上,你能看到main到read_values的调用边,以及"source-owned"字符串的落点——从入口到数据,一条证据链闭环。
不用引擎的轻量路径
不是每次都值得拉起 Ghidra,两条路径零引擎。
第一条是 JavaScript/Electron 静态解析:
# 静态解析 JS/Electron 应用,不启动任何分析引擎 npx -y rea-agents@latest analyze-javascript-application /absolute/path/to/app --json返回模块、导入、Electron IPC 边界及各自证据。对目录或.asar文件,rea analyze在未指定--provider/--snapshot时会自动路由到这条工作流。
第二条是离线 ELF 布局诊断,需要一个自带 pwntools 4.15.0、pyelftools 0.33 与 Unicorn 2.1.2 的隔离 Python 环境:
# 离线 ELF 布局诊断:不启动反汇编器数据库 REA_PWNTOOLS_PYTHON=/absolute/isolated-env/bin/python \ rea inspect-binary-layout /absolute/path/to/hello_stripped --json它直接回答「这个文件里有什么」:节区/段布局、原始符号与重定位,外加 canary、PIE、NX、RELRO 的静态推断,官方验证目前覆盖 Linux x64 的 ELF64。刚编译的hello_stripped就是它的标准练手目标。
七条命令速查表
| 命令 | 参数 | 一句话作用 |
|---|---|---|
analyze | --provider ghidra | 概览:符号、字符串、函数、调用 |
search | --kind strings\|procedures | 搜字符串或函数名 |
--mode literal\|regex | 字面量或正则匹配 | |
function | 函数名 | 单函数档案:调用者、调用、CFG |
decompile | 入口地址 | 指定过程的伪代码 |
xrefs | 地址 | 谁引用了这个地址 |
trace | 搜索词 | 沿引用追踪一个功能 |
instructions | 函数名 | 只读汇编,不反编译 |
三个全局参数:--json切结构化输出,默认终端格式是 TOON,适合人读;--provider显式绑定引擎,不传则按确定性规则自动选,REA_ANALYSIS_PROVIDER是默认提供方环境变量,命令行--provider优先;--snapshot /abs/path/program.json把结果缓存到本地快照,相同目标加同样参数直接复用,缓存命中时连引擎进程都不启动。
退出码速查与三个高频坑
| 退出码 | 含义 |
|---|---|
0 | 完成;结果仍可能含部分证据、警告 |
1 | 未完成:输入无效、权限、取消、超时 |
128 + N | 被信号 N 终止,如 SIGINT 为 130 |
引擎选择歧义:analyze报capability_unavailable,details.selection_reason是ambiguous——多个引擎都支持该目标。
# 诊断指定引擎;doctor 严格只读 rea doctor --provider ghidra --json从details.candidate_ids里挑一个,用--provider显式指定即可。
大二进制超时:Ghidra 启动期限默认 330000ms(约 5.5 分钟),覆盖导入、自动分析与桥接。
# 把 Ghidra 启动期限拉到 15 分钟 export REA_GHIDRA_STARTUP_TIMEOUT_MS=900000小目标、小内存机器可另设GHIDRA_HEADLESS_MAXMEM=512M压低 JVM 堆。
行为与预期不符:多半是版本漂移,rea update把 npm 安装的 CLI 更新到最新。错误里提示 "Retry once; if it continues, runrea doctor" 时照做即可——仓库维护着一张逐条审核的用户可见错误清单。
追完第一个main,快照复用与导入导出机制看 docs/cli.md;想把 Agent 侧的会话生命周期和证据契约吃透,读 docs/mcp-contracts.md。
下次再遇空白的 Functions 窗口,别发呆了——敲下analyze。
【免费下载链接】reaReverse engineer anything with agents, from app behavior down to native binaries.项目地址: https://gitcode.com/GitHub_Trending/rea2/rea
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考