夜雨聆风学习资料网

ARTICLE · 1179109

没有源码,也能让 AI 帮你弄懂软件功能:REA 从反编译、调用追踪到功能重建,安装与使用详解

没有源码,也能让 AI 帮你弄懂软件功能:REA 从反编译、调用追踪到功能重建,安装与使用详解

你可能遇到过这样的情况:一个桌面软件的离线搜索很顺手,一款笔记工具复制内容时总能保留复杂格式,老游戏里的某个计算逻辑又刚好适合自己的项目。

功能看得见,代码拿不到。

让 AI 按照描述写一个相似版本,它当然可以写。但它采用的算法、数据结构和边界处理,可能与原程序完全不同。遇到兼容性问题,你依然不知道该从哪里查起。

REA 提供了一条调查路径:让 AI 编程助手调用分析工具,检查程序本身,沿着证据追踪功能,再把弄清楚的规则写进你的项目。

这个项目的全名是 Reverse Engineer Anything,仓库地址为 morluto/rea。它以命令行工具和 MCP 服务的形式提供能力,能接入 Claude Code、Codex、Cursor、Gemini CLI 等编程助手。

它适合研究软件行为、梳理应用内部链路、维护缺少文档的程序,以及为功能重建寻找可靠依据。要用好它,先得理解它交给 AI 的到底是什么。

01|没有源码,怎么研究一个功能?

软件编译之后,很多原始信息会消失:变量名可能没有了,注释通常不会留下,代码结构也会受到编译器优化影响。

不过,程序仍然保留着可以调查的线索。

例如,一段“导出失败”的文字可能指向导出功能;一个文件扩展名可能提示它支持的格式;一次系统剪贴板调用可以暴露复制内容的最终出口。再沿着“谁调用它、它又调用谁”追下去,就有机会找到具体逻辑。

反汇编工具把机器码转成汇编指令;反编译工具再尝试生成接近高级语言的伪代码。伪代码有助于阅读,但其参数、类型和控制流程有时需要继续核实。

JavaScript 和 Electron 应用则有另一类入口:安装包中的脚本、模块、ASAR 归档和可能存在的 source map。分析这些文件,可以恢复一部分模块关系和通信路径。

REA 把这些专业工具的操作整理成 AI 可以调用的接口。

这里的 MCP,全称是 Model Context Protocol,可理解为编程助手调用外部工具的一套通用协议。助手提出分析请求,REA 处理目标并返回结果,助手再根据结果选择下一步调查。

对于原生程序,REA 可以连接 Hopper、Ghidra 或 IDA。对于 JavaScript、Electron、.NET、网站等对象,它有相应的分析路径。具体需要什么依赖,取决于你研究的目标。

02|一次调查怎样从线索走到实现?

以“弄清某个应用的导出功能”为例,可以把过程分成四步。

第一步,确认目标。

先明确应用版本、文件位置和包类型。是原生可执行文件,还是 Electron 的 ASAR?研究的是桌面端,还是浏览器页面?这些条件决定应该调用哪条分析路径。

第二步,找到功能入口。

助手搜索与导出有关的字符串、函数、模块和事件,从界面操作逐步连接到实际处理代码。入口找到之后,还需要查看调用者、被调用者和数据流向。

第三步,解释行为,并保留证据。

“这个模块负责导出”还不够。更有价值的结果是:导出请求从哪个入口发出,使用什么参数,经过哪些模块,在哪里生成文件,失败时会怎样处理。

REA 的结果会包含分析依据和限制,让助手能够引用相关代码位置、指令、引用关系或观察记录。数据不完整时,未知项也应保留下来。

第四步,按你的技术栈重写并检查。

规则弄清楚后,编程助手可以用项目中的语言和框架实现功能。接着用已知输入、输出和异常情况检查,确认实现覆盖了哪些行为。

这一步仍然需要开发、编译和测试。最终交付应该同时包括实现、验证结果,以及仍未解决的问题。

你可以要求助手把报告写成三个部分:已经确认的事实、目前合理的推断、还缺证据的问题。 这样比只拿到一段流畅的解释更方便复查。

03|能分析哪些东西?先按目标选择路径

REA 的覆盖范围较广,但不同对象返回的信息和环境要求有明显差异。

原生程序:研究算法与底层调用

对直接编译成机器码的程序,REA 可以通过分析引擎获取伪代码、汇编、字符串、符号、调用关系和交叉引用。

适合调查的问题包括:某个计算函数使用了哪些常量,某种文件格式如何解析,一个行为经过哪些函数,以及程序在哪里调用系统接口。

这条路径需要 Hopper、Ghidra 或 IDA 等引擎。它们的主机平台、架构和格式支持各有范围,不能只看文件扩展名就判断一定可用。

JavaScript / Electron:梳理模块和进程通信

Electron 桌面应用经常把程序代码放在 app.asar 中。REA 可以分析应用目录或 ASAR,整理模块、导入关系、source map、路由和进程间通信线索。

例如,点击“复制”之后,页面调用了哪个预加载接口?消息通过哪个 IPC 通道发送?主进程在哪里接收并写入系统剪贴板?

这种分析对桌面开发者很有用,因为一个功能往往横跨多个进程。只看到页面代码,很容易遗漏主进程里的真正操作。

静态 JavaScript 分析无需原生反编译引擎,读取目标文件时不运行该应用。 如果程序大量使用动态构造或混淆,仍可能出现无法确定的关系。

.NET:查看程序集和托管代码信息

REA 可以静态检查 .NET 程序集的元数据、CIL 指令、声明的原生依赖,以及不同构建之间的变化。

这类检查能帮助你了解程序集包含哪些成员、如何组织、在哪里连接原生组件。拿到的分析信息还需要结合目标问题解读。

网站与抓包记录:解释请求和前端行为

网站分析可以借助 Chrome 系浏览器查看页面结构、脚本、网络观察记录和按需截图。

对于已经保存的 HAR 抓包文件,REA 还可以检查请求、响应和其中保留的数据。这对排查“点击按钮之后到底发了什么请求”“一次操作涉及哪些接口”很有帮助。

需要分清两件事:客户端记录展示的是被捕获到的通信行为;服务器内部的完整实现,通常不会因此自动变得可见。抓包也只覆盖实际记录到的场景。

Android:从 APK 到设备现场

APK 分析可以查看 Manifest 声明、类、反编译方法和引用关系,需要 JADX 与完整 JDK 等相应依赖。

6.4.0 进一步加入通过 ADB 检查设备、获取拆分 APK、读取日志、截图和传输文件等能力,并提供明确的应用生命周期操作;Apktool 路径可以解码 Manifest 和多语言字符串。

这让分析入口从“手里有一个 APK 文件”延伸到“手里有一台设备或模拟器”。读取资料、传输文件和操作应用属于不同动作,使用时应按任务选择。

其他对象:按专门文档确认条件

REA 还提供固件、离线 ELF 布局、记录下来的 Linux 崩溃、EVM 字节码、软件包资源和进程行为等分析路径。

其中一些依赖 Linux、特定架构或外部工具。例如固件提取需要 Binwalk / Unblob 等工具;进程行为捕获路径在 Linux / macOS 使用原生终端能力。

入门时可以先选择你熟悉的一类目标,再按它的文档准备依赖。没有必要为一次简单的 Electron 分析把所有引擎全部装上。

04|三个官方案例,看看它怎样获得可信结论

官方展示了几个很具体的案例。它们的共同特点是:有明确问题、有可追踪的代码位置,也有办法检查结果。

DX-Ball:一个横坐标,如何变成左右声道?

经典打砖块游戏 DX-Ball 中,砖块被击中时,声音会根据位置偏向左边或右边。研究者要弄清楚的,是屏幕横坐标如何变成声道偏移值。

官方案例针对 DX-Ball 1.07 中的一个函数展开调查。

最初的伪代码只露出一个浮点转整数调用,甚至没有正确显示输入参数。继续读取汇编后,才发现函数从栈中取得整数输入,并依次进行乘法、减法和尺度调整。

再追到调用者,可以确认输入与砖块横坐标有关;读取原程序里的常量,得到 1.5625、500.0 和声道尺度的初始值。

恢复出的计算关系可以概括为:

声道偏移 = 将(横坐标 × 1.5625 − 500.0)× 声道尺度转成整数。

在尺度为 1 时,横坐标 0 对应 −500,320 对应 0,640 对应 500。这就把屏幕上的左右位置连接到了声音的位置。

官方案例记录了两类检查:

  • • 3,205 组行为比较:横坐标 0—640,共 641 个整数位置,分别使用 5 个声道尺度,与原始 x86 函数比较返回值。
  • • 63 个编译字节匹配:使用指定的 VC4.0 工具链回放编译,并按案例说明处理重定位、核对相关常量。

这些数据是作者对该函数的验证结果。它们说明这个问题有具体的核对依据;并不能推导出任意程序都能完整恢复,或整个 DX-Ball 项目已经完成。

这个案例也说明了为什么需要继续追证据:第一眼看到的伪代码不完整,汇编、调用者和常量读取共同补出了计算含义。

Notion:复制操作如何跨过多个进程?

Notion 的案例围绕 Desktop 7.6.1 的复制链路展开。

页面看到的是一个剪贴板方法;预加载脚本通过 Electron 的 IPC 发出请求;主进程注册对应处理器,检查发送方,再调用系统剪贴板写入接口。

也就是:

页面接口 → preload 包装 → IPC 通道 → 主进程处理器 → 系统剪贴板。

官方案例把通道名称和两端包装函数连接起来,让“复制按钮之后发生什么”有了具体的代码路径。

此外,案例还解释了一种保留块结构的方式:复制出去的 HTML 携带一个标识,本地保存的块数据使用对应标识;粘贴时,如果能匹配,就可以恢复块结构。

对开发者来说,这个例子能启发两个问题:哪些数据真正进入了系统剪贴板?哪些结构信息依赖应用自己的本地状态?理解它们,才能解释跨应用粘贴为什么可能表现不同。

需要保留范围:官网展示的是特定版本的包内代码、保存的网页资源和模块测试,不能把它当作所有 Notion 版本都完全一致的规则。

TH04:老游戏怎样生成朝向玩家的子弹环?

第三个案例来自 PC-98 上的《东方幻想乡》,也就是 TH04,目标涉及 16 位 DOS 指令。

研究的问题很直观:一圈子弹怎样均匀排开,又怎样整体转向玩家?

案例说明,游戏用 256 个角度单位表示一整圈。如果一圈有 16 发子弹,间隔就是 16 个单位,依次为 0、16、32……240。

加上玩家所在方向的角度,就可以把整圈一起转过去;发射模板还可以提供额外旋转量。

REA 提供原始指令、引用和分析证据,重建项目再把这些操作对应到可读 C++,并用项目自己的编译检查验证。

从声道计算、剪贴板通信到弹幕角度,三个案例研究的层次不同,却都从一个足够明确的问题出发。你第一次使用时,也可以采用这种范围。

05|怎样安装?先选一个能完成的小任务

REA 通过 npm 分发。6.4.0 的 GitHub Release 没有附带 EXE、MSI 等安装文件,主要入口是命令行安装与引导设置。

先检查 Node.js

当前正式版支持:

  • • Node.js 22.x,至少 22.19;
  • • Node.js 24.x,至少 24.11;
  • • Node.js 26 或更新版本。

Node.js 23、25 和预发行版本不在文档支持范围内。不能把要求简单理解为“随便一个大于 22 的版本”。

检查命令:

node --version
npm --version

连接编程助手

在终端运行:

npx rea-agents@latest setup

引导会让你选择需要连接的助手,显示拟修改的配置,并备份已有配置。检查计划后完成设置,再重启相应助手,让新的 MCP 服务和工作流指令生效。

如果要按本文核对版本固定安装,可把 @latest 改成 @6.4.0。以后更新时再阅读变更说明。

请留意:安装工作流指令、写入 MCP 注册、当前会话实际出现工具,是不同环节。只安装一个 skill,不能自动证明分析服务已经连接。

不通过助手,也可以用命令行

长期使用,可以全局安装:

npm install --global rea-agents
rea --help

先选一个你有权分析、结构相对简单的 Electron 应用目录或 ASAR,尝试静态分析:

npx -y rea-agents@6.4.0 analyze-javascript-application "D:/apps/example/app.asar" --json

这里的路径只是示例,需要替换成实际存在的绝对路径。返回内容可用于查看模块、导入、Electron 边界及相关证据。

如果选择原生程序分析,再准备相应引擎。setup 可以按计划使用已有引擎,某些支持的平台还可选择安装 Hopper;Ghidra 和 Java 需要自行准备。

或者直接把项目地址发给Ai,让Ai去给你安装并配置MCP服务

06|Windows 用户需要额外看清哪些条件?

Windows 上的原生 Ghidra 分析仍属于实验性的只读范围,不能默认所有平台功能都已对齐。

按正式版文档,这条路径要求 Windows 10 或更新的 x64 系统、固定本地 NTFS 的目标与临时存储位置、Ghidra 12.1.x,以及符合该 Ghidra 要求的 64 位完整 JDK。当前 12.1 系列要求 JDK 21 或更新版本,文档使用 12.1.4 与 JDK 21 验证。

完整 JDK 包括 Java 编译器;只有运行环境并不满足这项要求。

目标范围是原生 x86 / x64 的 PE 应用或 DLL。Windows 这条 Ghidra 路径不涵盖所有格式、所有架构、GUI 操作或注释修改。

下面是文档配置方式的示例,路径都要换成你自己的安装位置:

$env:GHIDRA_INSTALL_DIR = "C:\tools\ghidra_12.1.4_PUBLIC"
$env:JAVA_HOME = "C:\tools\jdk-21"
$env:REA_ANALYSIS_PROVIDER = "ghidra"

rea doctor --provider ghidra --json
rea providers --json

如果使用编程助手,还要让启动 MCP 服务的进程拿到相应配置。一个终端窗口里的临时环境变量,并不会自动改变已经运行的桌面助手或服务器。

先做与你任务对应的诊断。

例如检查 Codex 注册,可使用:

rea doctor --client codex --json

默认 rea doctor 会检查多个集成与可选引擎。某个你没有准备的可选项未就绪,并不一定意味着当前选择的 JavaScript 静态分析无法工作。

另外,大型原生程序导入和自动分析可能需要较长时间。Ghidra 的启动等待期限与 MCP 客户端单次工具调用的超时是两回事;客户端可能先超时。遇到这种情况,应查看对应文档和诊断,而不是反复启动同一个目标。

07|怎样提问,才能得到可用的调查结果?

提问时,把目标、功能、范围、证据和验收方法说清楚,会更容易形成有效调查。

例如,研究自己的 Electron 应用,可以这样写:

请用 REA 静态分析 D:/apps/example/app.asar。我想弄清复制富文本的实现:找出页面 API、preload、IPC 通道和主进程写入位置。逐步给出文件位置或代码范围,把已确认事实与未知项分开。先提交分析报告。

如果要研究一个算法,可以进一步缩小范围:

请调查这个程序中与横坐标转换有关的计算函数,追踪输入来源、调用者和相关常量。给出对应指令或代码证据,再设计一组能够与原函数比较的测试输入。

准备重建功能时,则加上自己的约束:

根据已确认的规则,为我的 TypeScript 项目实现相应功能。列出输入、输出、异常处理和未覆盖情况,给出验证结果。遇到证据不足的行为时,先记录问题。

这些都是提问模板,路径与项目条件需要自行替换。它们把调查拆成可检查的阶段,也方便你在一个阶段发现偏差后调整方向。

第一次可以选择“解释一条复制链路”或“恢复一个小函数”。当你确认依赖正常、证据可读、结果能核对,再扩大范围。

08|6.4.0 的变化,哪些值得关注?

如果你之前看到的是 6.3.0 介绍,6.4.0 有几项与实际使用直接相关的更新。

Android 的调查入口更完整。 新增 ADB 设备分析、拆分 APK 获取、日志、截图、文件传输等能力,Apktool 支持补充资源和多语言字符串解码。

加入 JEB 连接路径。 可以通过用户已经启动的本地 JEB MCP 服务浏览项目单元、对选定对象进行反编译。使用前仍要准备自己的 JEB 环境。

大型分析可以先看摘要。 新版增加保留证据的发现方式,以及 JavaScript 图、二进制布局和函数资料的摘要与选择性查看,方便把注意力放在相关部分。

JavaScript 分析的资源限制更明确。 分析在独立进程中进行,可配置堆内存和超时;资源不足时保留已完成事实,并报告未知项。

RPC 发现更细。 更新加入对支持的 tRPC 调用、HTTP 链接和命名 GraphQL 操作的识别。识别客户端调用仍需要继续核对服务端语义。

这类工具迭代很快。尤其是你准备编写自动化脚本读取 JSON 结果时,建议固定版本,并在升级前检查发布说明和实际工具契约。

09|使用前,把预期放在它能证明的范围内

反编译结果需要解释与验证。

编译优化、混淆、加壳、间接调用和缺失符号,都会增加分析难度。REA 能组织证据,编程助手能据此调查,但最后仍可能有无法确认的部分。

本地分析与模型的数据处理要分别理解。

项目说明 REA 在本地分析目标,不把目标应用上传到自己的分析服务。不过,工具结果会交给你连接的助手;其中的代码片段或证据可能进入助手背后的模型服务,具体取决于其数据政策。

静态检查与运行观察有不同影响。

静态 JavaScript、.NET 检查读取所给文件,不运行目标应用。运行捕获、浏览器操作和设备生命周期操作则会运行或交互。外部分析工具也使用当前用户权限,REA 的本地控制机制并不构成恶意样本沙箱。

开源工具与整体成本要分开算。

REA 本身采用 MIT 许可证;Hopper、IDA 等外部工具有各自授权方式,编程助手的模型调用也有对应费用。目标越大、调查越深,需要处理的信息通常越多。

目标软件的授权仍然需要确认。

研究自己拥有源码的编译产物、获授权的软件、互操作性问题或历史软件保存,有明确的实际用途。对第三方目标,则应确认协议、权限及适用法律;REA 自身的 MIT 许可证不会替你授予目标代码或素材的使用权。

10|哪些人更值得试?

如果你在维护缺文档的旧程序、调查 Electron 内部通信、研究闭源依赖的具体行为,或者做老游戏保存与功能重建,REA 提供的工具入口和证据组织值得关注。

如果目标已经有完整源码和文档,直接读源码通常更方便;如果只想做一个外观相似的界面,也不必从二进制分析开始。

选择它的理由,应该落在一个具体问题上:你需要知道程序里的某个行为为什么发生,以及哪些证据能够支持你的实现。

先选一个小问题,让助手给出可以复查的解释,再决定是否把它纳入长期工具链。

项目与入门入口:

  • • GitHub:https://github.com/morluto/rea
  • • 官网:https://rea.tools/
  • • 官方指南:https://rea.tools/guides/
  • • 官方案例:https://rea.tools/showcase/
  • • 正式版本:https://github.com/morluto/rea/releases
  • • npm:https://www.npmjs.com/package/rea-agents

你更想用它调查桌面软件的一条功能链路,还是恢复一个已经没有源码的老程序?

END

声明

公众号内容均来源于互联网收集整理,无法保证相关信息准确性、安全性,请您自行分辨,仅供参考、学习,不得用于任何商业目的与商业用途;如您发现有侵犯您权益的作品,请与我们联系,我们会及时修改或删除。


低价购物,精彩活动,一手线报

扫码关注,点菜单栏 “加群”

相关学习资料