ARTICLE · 1271036
AI Agent 逆向软件?REA 实测与踩坑
拿个没源码的二进制,流程大家都背得出来:file 认出是 ELF 还是 PE,strings 捞点可疑常量,objdump -d 导出汇编,然后一头扎进 IDA,对着交叉引用一个个函数啃。中间还得不停在反汇编窗口和十六进制视图之间来回瞟,纯体力活。
有人试过偷懒——把汇编贴进大模型问“这函数干啥的”。结果很尴尬:模型连 0x401000 是个地址还是一条指令都分不清,更别说跟着跳转跟到第三个 call 之后还记得栈上放了什么。上下文一长,它就编。
REA(Reverse Engineer Anything)走的是另一条路。它没打算让模型“看懂”汇编,而是把反汇编、符号检索、调用图构造这些硬能力封装成 MCP 工具,交给 Claude Code、Cursor 这类 coding agent 自己按需调用。模型负责决策和串联,工具负责精确执行。
项目在 github.com/ringozzt/rea-research。四天里 star 涨了约 3.1 倍,冲到 24.7 万这个量级——这数字本身就有点耐人寻味。npm 周下载 23 万上下,版本号几乎天天在动,看得出作者在猛推。
不过有件事得先摆出来:它走红的时间点,刚好撞上 AI agent 攻击金融机构那波事件。所以授权边界和安全风险,后面会单独拎出来说,这里先埋个雷。
先说个容易误会的地方:REA 并不是一个“会逆向的 AI”。它本质上是给 AI coding agent 配了一套逆向工具箱——通过 MCP(Model Context Protocol,一种让模型按统一格式调用外部工具的标准协议)把 radare2、objdump、Ghidra 这些老牌家伙包了一层,拆成 list_functions、decompile、xrefs 这类粒度很细的调用接口。agent 自己决定什么时候查符号、什么时候拉伪代码、什么时候顺着交叉引用往下走。
所以它擅长的事很具体:函数与符号识别、字符串和交叉引用检索、伪代码还原、patch 前后对比。动态调试这块目前偏薄,别指望它替你单步跟寄存器。
真正用得上的场景,基本都长这样:接手一套没源码的老系统要排查崩溃、核验第三方 SDK 到底偷偷干了什么、在授权范围内看恶意样本的落地行为、CTF 赛前练手、漏洞复现时快速定位关键分支。共同点是——你手里有个二进制,但没有对应的那行源码。
用下来的直观感受有点意外:它最像的不是“智能”,而是老师傅的排查习惯被整理成了固定流程。先看导入表,再看字符串,再顺着 xref 回溯,卡住了就回头验证假设。流程感比聪明劲儿重要得多。它替掉的是那些机械的翻找和跳转,判断仍然在你这边。
MCP 说白了就是让 AI 调用外部工具的接口协议。在 Cursor 的 ~/.cursor/mcp.json 或 Claude Code 里加一段:
{"mcpServers":{"rea":{"command":"npx","args":["-y","@rea/mcp-server"],"env":{"REA_WORKSPACE":"/tmp/rea"}}}} 重启后让 agent 调一次 list_tools,能看到函数、字符串、反编译几组工具,就算挂通了。
实测 Node 低于 20 直接起不来,报的却是跟 MCP 八竿子打不着的 ERR_REQUIRE_ESM,很容易查错方向。首次运行还要拉几百 MB 的符号与类型库,公司网络没配代理就会卡在 initialize 那一步——既不超时也不报错,就那么干等。老实用 nvm 切到 20 LTS,再挂上代理,世界安静了。
错误示范:帮我逆向这个 elf。正确做法是拆步骤——先 file + strings 摸清它是什么,再让它定位输入校验相关函数,最后只对那两三个函数要伪代码。再补一句关键提示词:
每个结论都要附上你调用的工具和返回片段,不要凭函数名猜。
这句能挡掉一大半幻觉。拿个自己编译的 32 位小 demo 走一遍:strings 找到校验字符串,顺着 xrefs 摸到比较函数,反编译出那段 if-else。用 objdump -d 人工对一遍,分支顺序基本对得上,但变量名几乎全是它自己编的,别当真。
先说最硬的那条边界:授权。REA 这波热度本身就带着点灰——它是被 AI agent 攻击金融机构的事件顺带推上风口口的,工具中立,用的人未必中立。拿它去碰别人家的生产二进制,不管技术多漂亮,后果自己兜。这条不是免责声明,是真正决定你敢不敢在团队里推它的前提。
体积一上来就露怯。几十 MB 的二进制,符号和字符串一倒就是几万行,光塞进上下文就能把 token 烧干净,最后给出的结论还不如人肉盯半小时。我试过一个中等体量的样本,agent 在字符串表里绕了三圈,回来告诉你"这像个网络程序"——废话。
语言和加壳也是分水岭。Go、Rust 编出来的产物函数名还在,但控制流被大量内联和优化,伪代码还原质量肉眼可见地掉。至于加壳、混淆过的样本,基本可以直接放弃,别指望它替你脱壳。
还有个一线顾虑容易被忽略:MCP 工具调用是串行的,agent 每问一次都要重新组织上下文,跑完一个中等样本的耗时和成本,比想象中高不少。跨架构同样不齐,ARM、MIPS 固件这类场景,眼下还是老老实实开 IDA 更稳。
REA 真正挪动的东西,其实不是“能不能逆向”,而是那道门槛被换了位置。以前卡在会不会看汇编、认不认得那几个跳转;现在卡在你会不会把问题问对、拿到答案之后会不会验证。前一种靠时间能堆出来,后一种只能靠一次次踩坑慢慢长。
所以手上要是有没源码的老项目想查,拿它做第一遍粗筛挺合适——先把可疑函数圈出来,剩下的人工往下挖。但要把它的结论直接当定论,还早了点。它给的每条判断,最好都当成“待验证的线索”,不是“结论”。
最后问个事儿:你拿到一个陌生二进制,第一件事是把它丢进 IDA,还是先 strings 扫一眼?有没有哪次是 AI 给的结论,让你回头把自己原来的判断改掉了?评论区聊聊。















































































