← 返回列表

逆向一切軟件:REA 衝上 GitHub 5.8 萬 Star,agent 把逆向變成了提問

itadol5j

GitHub 最近又火了一個項目:REA(Reverse Engineer Anything)。用戶丟過來的說法是“衝到 4.2 萬 Star”,但截至今天(2026 年 10 月 10 日)實測,這個數字已經漲到 5.8 萬 Star、1.1 萬 Fork——比傳聞裏的還要猛。它做的事一句話能說完:讓你用 agent 去逆向任何軟件,從應用行爲一路挖到原生二進制。

逆向工程與 agent 協作概念圖

一、REA 到底解決什麼問題

傳統逆向是“人坐在反彙編器裏讀幾天彙編”。REA 的思路是把 agent 接到反彙編器上(原生代碼用 Hopper、Ghidra 或 IDA),再接上針對 JavaScript 與 .NET 的靜態分析器。agent 負責向工具提問、收集結論,並把證據一併交回來。

它的 README 示例提示詞就是整個賣點:“搞清楚 Notes 應用裏的搜索是怎麼實現的,把證據給我看,再爲我的項目做一個類似功能。”tracing 由 agent 完成,你拿到的是解釋、代碼位置,以及一份“目前還不知道什麼”的清單。

關鍵點在於分析全部本地運行,結論會附上證據與侷限性——不是讓模型憑空編一個解釋給你。

二、能啃哪些目標

REA 的支持面相當寬,基本覆蓋了常見逆向對象:

  • 原生二進制:僞代碼、彙編、字符串、符號、調用與引用(需 Hopper/Ghidra/IDA)
  • 離線 ELF 佈局:段、節、原始符號/重定位、靜態緩解候選
  • JavaScript / Electron:模塊、導入、source map、路由、IPC 與原生插件關係(靜態分析無需原生引擎)
  • 網站:頁面結構、腳本、網絡觀察與截圖
  • .NET 程序集:元數據、CIL 指令、聲明的原生依賴與構建對比(純靜態)
  • Android APK:清單聲明、類、反編譯方法與引用(需 headless JADX + 完整 JDK)
  • 固件:分區、提取結果與原生分析交接(需 Binwalk / Unblob)
  • EVM 字節碼、記錄的 Linux 崩潰、HAR 抓包、進程行爲等

環境要求:Node.js 22.x(≥22.19)、24.x(≥24.11)或 26+,外加 npm。支持的 agent 包括 Claude Code、Codex、Cursor、Gemini CLI、Grok Build 等——凡是支持本地 MCP server 的 agent 基本都能用。安裝一條命令:npx rea-agents setup,它會註冊 MCP server 並寫入配套工作流說明,之後重啓 agent 即可。

agent 經 MCP 調用逆向工具鏈示意

三、三個公開案例:它到底能證明什麼

Star 數代表熱度,案例才代表結果。REA 官方放了三個 showcase,把“能做什麼”和“還不能做什麼”都擺出來了。

案例 1:DX-Ball 的音效聲場公式

問題:1990 年代的 DX-Ball 如何把磚塊的橫向位置換算成左/右聲場?反編譯器在 0x406400 只看到一個沒有可見輸入的 __ftol() 調用;指令裏露出了缺失的實參 [EBP+8]。順着調用者 0x411f40 找到座標公式 20 + 30 × tile_x,再從內存裏讀出三個常量 1.5625、500.0 和初始聲場縮放 1.0。

最終還原出的規則是:座標轉 double,乘 1.5625,減 500.0,乘存儲的聲場縮放,再截斷。縮放爲 1 時,左邊緣得 −500、中心 0、右邊緣 500。真正建立信任的是驗證方式:作者把 3205 個用例同時跑過原始 x86 函數和新 C 版本(覆蓋 0–640 全部位置、縮放 0/0.5/1/20/−1),在固定 VC4.0 工具鏈下,編譯字節也匹配了原始 63 字節。整個項目報告維護了 55 個 C 函數、45380 次對比。

它沒證明的:把聲場接進遊戲聲音後端這一步仍待完成,可玩的成品還不完整;工作綁定在 DX-Ball 1.07 的固定哈希上;編譯復現“依賴人工複覈的重定位與覈對過的常量”,並非全自動。

案例 2:Notion 怎麼把內容複製到剪貼板

從 90 年代二進制跳到現代 Electron 應用。問題:Notion Desktop 7.6.1 如何把文本和 HTML 寫進系統剪貼板?路徑分四段:preload 腳本向頁面暴露 clipboard.write;一個 wrapper 在某個 channel 上調用 ipcRenderer.invoke;主進程的 ipcMain.handle 接收;通過發送方校驗後,Electron 的 clipboard.write 落盤。兩側用的是同一個 channel 名 notion:clipboard:write。

兩個發現值得記一下:一是主進程 handler 會校驗是哪個頁面發的請求,只有 Notion 自己的 web contents 能觸達剪貼板寫入——這是 Electron 應用該有的正確姿勢;二是複製內容裏藏着塊數據,HTML 中帶一條註釋指向 Notion 以自定義 MIME 類型 text/_notion-blocks-v3-production 本地存儲的塊數據,粘貼時按 ID 還原,條目過期則退回純文本+HTML。

它沒證明的:REA 4.1.0 只分析了標籤頁 preload、找到暴露的 API 與 invoke 調用,wrapper 實現是作者手工閱讀後把 channel 與接收端連起來的;剪貼板格式的結論來自 2026 年 7 月 13 日緩存的 web 資源與保存的探針,而非實機桌面會話抓取。

案例 3:PC-98 遊戲的彈幕環

回到 16 位 DOS 代碼。REA 的 Ghidra provider 支持 16 位 DOS 分析。作者還原了某個彈幕環背後的固定角與瞄準角計算,用 C++ 重建,再與歷史編譯器的輸出對比。形狀和 DX-Ball 一樣:還原一小段計算,重建,然後拿原始產物驗證,而不是相信那段解釋。

四、把三個案例放一起看,規律很清楚

  • 問題都很窄:一個聲場公式、一條剪貼板路徑、一個彈幕環,沒有一個案例說“把整個應用重造一遍”。
  • 證據都附上了:地址、常量、3205 個測試、channel 名、保存的探針、編譯器對比。
  • 都承認了人工步驟:人工複覈的重定位、手工閱讀的 wrapper、編譯器匹配。
  • 目標都固定了版本:DX-Ball 1.07 帶哈希、Notion 7.6.1、原始 PC-98 二進制。

這就是今天誠實的邊界:agent 是追蹤單個行爲的快速、不知疲倦的助手,而證明來自你能重跑的測試。

案例驗證與證據鏈示意

五、對開發者意味着什麼

如果你在做 agent 應用,REA 代表了一類新形態:不是讓模型直接“猜”一個程序怎麼跑,而是把模型接到專業逆向工具上,讓它按證據說話。它的價值不在“一鍵逆向整個軟件”,而在把逆向的門檻從“會讀彙編”降到“會提問 + 會驗證”。

但要清醒兩點。第一,本地分析不等於數據不外流——你的 agent 會把工具輸出送到模型供應商,數據政策仍適用。第二,證據質量取決於驗證環節,案例裏的可信度來自 3205 次對比和字節匹配,而不是模型的口頭解釋。

本地分析、證據與驗證閉環

六、怎麼上手

  • 環境:Node.js 22.x(≥22.19)/ 24.x(≥24.11)/ 26+,外加 npm
  • 一鍵安裝:npx rea-agents setup,選擇你的 agent、審閱改動並批准,然後重啓 agent
  • 全局安裝:npm install --global rea-agents,之後可用 rea --help
  • 靜態 JS/Electron 分析:npx -y rea-agents@latest analyze-javascript-application /abs/path --json
  • 原生分析:需先配置 provider(Hopper/Ghidra/IDA)
  • 更新:rea update,或重跑 npx rea-agents@latest setup

逆向正在從“讀彙編”變成“提問 + 驗證”——工具把門檻壓低了,但證據仍然得靠測試說話。