懶人包:REA(Reverse Engineer Anything)是 morluto 在 2026-04-14 開源的 MIT 專案,npm 套件叫rea-agents,用 MCP 把 Hopper、Ghidra、IDA、JADX 這類逆向工具接給 Claude Code、Codex。截至 2026-10-15 有 24.7 萬顆星、最新版 6.5.0。我用 6.5.0 對一個自己加了 IPC 功能的 Electron 範例跑靜態分析,它把 renderer → preload → main 的兩條呼叫鏈完整配對出來,連「哪些關係只是候選」都標清楚。要注意:它需要 Node 22.19 以上、setup 會寫進全域~/.claude.json,原生二進位分析還得另外有反組譯引擎。
我是在 Instagram 上看到一支 reel 介紹這個工具,說法是「跟 Claude Code 講一句話,它就會去拆那個 App」。這句話聽起來很神,所以我把 repo clone 下來讀文件,再用 CLI 實際跑一次,看它到底交出什麼。
REA 是什麼?
REA 是一個 MCP server 加 CLI。MCP(Model Context Protocol)是 AI agent 呼叫外部工具的標準介面,REA 做的事是把一堆既有的逆向工程工具包成 agent 能叫的工具,再附一份「怎麼調查」的 skill 指示給 agent。
README 的定位寫得很直白:看到某個 App 的功能,想知道它怎麼運作,就請 agent 用 REA 去查。agent 拿到的是有證據的分析結果,再由 agent 解釋、寫出自己的實作、跑測試。
我在 2026-10-15 查到的專案狀態:
| 項目 | 數值 | 來源 |
|---|---|---|
| Repo | morluto/rea,MIT,TypeScript | GitHub API |
| 建立日期 | 2026-04-14 | GitHub API |
| Stars/Forks | 247,362/62,010 | GitHub API |
| 最新版 | rea-agents 6.5.0(2026-10-14 發布) | GitHub release、npm |
| Commit 數 | 3,234,貢獻者 228 人 | 本機 git log |
| npm 週下載 | 231,579(10/06–10/12) | npm downloads API |
| Open issues | 811 | GitHub API |
官方網站是 rea.tools。README 特別提醒只認 GitHub morluto/rea、rea.tools 跟 npm 的 rea-agents 三個來源,名字相近的 repo 或抄來的 README 都不算官方。
REA 可以分析哪些東西?
README 的支援表很長,我挑一般開發者最可能碰到的幾類:
| 目標 | REA 回傳什麼 | 需要什麼 |
|---|---|---|
| JavaScript/Electron App | 模組、import、source map、IPC、preload 與 contextBridge 關係 | 只要 Node.js |
| 原生二進位(Mach-O、ELF、PE) | 偽代碼、組合語言、字串、符號、呼叫關係 | Hopper、Ghidra 或 IDA 擇一 |
| .NET 組件 | metadata、CIL 指令、原生相依 | 不用額外工具 |
| Android APK | Manifest、類別、反編譯後的方法 | 無頭模式 JADX + 完整 JDK |
| 網站 | 頁面結構、script、網路請求、截圖 | Chrome 系瀏覽器 |
| 已存的網路封包 | request、response、payload 來源 | HAR 或 Fiddler SAZ 檔 |
怎麼安裝 REA 到 Claude Code?
官方安裝只有一行:
npx rea-agents setup
它會讓你勾選要設定哪些 agent(Claude Code、Codex、Cursor、Gemini CLI 等),列出要改的檔案,你同意後才寫入,改之前會先備份。裝完要重啟 agent。
前置需求:Node 版本
README 寫的是 Node.js 22.x(≥22.19)、24.x(≥24.11)或 26 以上。我機器預設的 node 是 v18.12.1,所以我用 nvm 切到 v24.18.0 才跑。
node -v # 要 v22.19+、v24.11+ 或 v26+
nvm use 24
setup 實際會改什麼?
我沒有直接套用,先用 --dry-run 看計畫:
npx -y rea-agents@6.5.0 setup --client claude_code --dry-run
輸出的計畫有兩個動作(節錄):
status: planned
plannedActions[2]:
- id: "configure_client:claude_code"
target: /Users/<you>/.claude.json
detail: "Add the REA MCP registration for Claude Code; preserve unrelated configuration. ...
Command: \"npx\" \"-y\" \"rea-agents@6.5.0\" \"mcp\". ..."
backupPath: /Users/<you>/.claude.json.rea.backup
- id: "install_skill:claude_code"
target: /Users/<you>/.claude/skills/reverse-engineer-anything
appliedActions: []
也就是說,它在 ~/.claude.json 加一筆 mcpServers.rea,並把 skill 裝進 ~/.claude/skills/reverse-engineer-anything。這是全域設定,之後你開的每個 Claude Code 專案都看得到 REA 的工具。官方安裝文件有一節專講只給單一專案或獨立 profile 用的做法,不想全域就照那節走。
同一份輸出裡的 doctor 區塊也顯示我機器上 Ghidra、IDA、JADX 都是 not_configured,所以這次我只測不需要引擎的 JavaScript 分析。
我怎麼實測 REA 的 Electron 分析?
我要確認的是 reel 那句「把功能怎麼運作、證據在哪裡整理給你」到底兌不兌現。所以測試目標要是我知道答案的東西,才能對答案。
我拿 Electron 官方的 electron-quick-start(CC0 授權)當底,自己加了一個「筆記搜尋」功能:
// preload.js:把 API 暴露給網頁
contextBridge.exposeInMainWorld('notes', {
search: (query) => ipcRenderer.invoke('notes:search', query),
save: (note) => ipcRenderer.send('notes:save', note)
})
// main.js:主程序處理 IPC
ipcMain.handle('notes:search', (_event, query) =>
notes.filter((n) => n.includes(query))
)
ipcMain.on('notes:save', (_event, note) => {
notes.push(note)
})
// renderer.js:網頁端呼叫
window.notes.save('hello rea')
window.notes.search('rea').then((hits) => console.log(hits))
這是典型 Electron 功能的資料流:網頁端呼叫 → preload 暴露的 API → IPC 頻道 → 主程序的 handler。
然後跑:
npx -y rea-agents@6.5.0 analyze-javascript-application /absolute/path/to/target-ipc --json > ipc.json
第一次對原版 quick-start 跑花了 2 分 38 秒,第二次對加了功能的版本跑是 30 秒。輸出是一份完整的 JSON evidence,加了功能的版本約 490 KB。
它找到了什麼?
我寫了一小段 Python 把 JSON 裡的 summary 和關鍵關係抽出來:
跟我寫的程式碼逐項對:
| 我寫的 | REA 回報 | 對不對 |
|---|---|---|
1 個 exposeInMainWorld('notes') | context_bridge_apis: 1、exposes api_key: notes | 對 |
暴露 search、save 兩個成員 | exposed_api_members: 2 | 對 |
notes:search 用 invoke/handle | invokes 配對到 main.js 的 handle | 對 |
notes:save 用 send/on | sends 配對到 main.js 的 on | 對 |
renderer 呼叫 window.notes.* | calls entry: notes.search / notes.save,標 candidate | 對,但標為候選 |
ipc.operations 是 0,context_bridge_apis 也是 0,沒有亂生關係出來。
它怎麼標示「不確定」?
這是我覺得 REA 設計最紮實的地方。每份結果都帶 confidence、authority 和一串 limitations。這次的結果是 confidence: derived、authority: shipped-artifact,limitations 裡明寫:
- JavaScript 和 HTML 被當成惰性文字解析,bundle 的啟動程式碼從沒被執行。
- Electron 關係是從語法推出來的,執行期是否真的註冊、是否可達都未證明。
- 動態或混淆過的表達式可能解不出來,找不到不代表不存在。
calls 標的是 candidate,而 preload 到 main 的 IPC 配對標的是 unique-exact-literal-channel(頻道字串完全一致且唯一)。它把「確定配上」和「推得出來但沒證明」分開講,agent 拿到這份資料時就知道哪些話能說滿。
REA 有什麼限制?
它是給 agent 的證據,不是給你的程式碼。原生分析回傳偽代碼和組合語言,JS 分析回傳模組關係,真正寫出「自己的版本」的是 agent。README 的 FAQ 也是這樣定義的。
靜態分析的天花板很明顯。我的範例頻道名都是字串常數,所以能精準配對;真實商業 App 經過打包、壓縮甚至混淆,頻道名可能是動態組出來的,這時 REA 會照實標成 unresolved,而不是瞎猜。
我只驗了 CLI,沒驗 agent 對話流程。這次我沒有真的執行 setup,所以「在 Claude Code 裡講一句話」那條路我沒跑。CLI 和 MCP 用的是同一套 workflow(README 這樣寫),但 agent 怎麼串多次呼叫、花多少 token,我沒有數據。
分析在本機,模型不在本機。REA 本身不上傳你的目標檔案,但 FAQ 也講明:agent 拿到的工具結果會送給模型供應商,適用對方的資料政策。分析公司內部程式前要想清楚。
版本變動快。一個月內進了兩千多個 commit,release 是 6.x,README 自己也叫你常跑 rea update。要寫進腳本就把版本釘死,例如 rea-agents@6.5.0。
法律邊界:哪些事 REA 明確不幫
reel 最後一句「記得只用在自己有權限分析的軟體」不是客套。REA 的 DISCLAIMER 列得很清楚,它不支援:繞過 DRM、授權檢查、反作弊,做外掛,繞過認證或存取控制,以及複製專有軟體或重製它受保護的程式碼與素材。
所以「看到別人 App 的功能就照著做一個」這件事,合理的範圍是理解運作原理後自己重新設計實作,不是把對方的程式邏輯搬過來。各國對逆向工程的法律規範不同,軟體的授權條款也可能直接禁止,這部分要自己確認,REA 不替你負責。
什麼情況值得裝 REA?
適合:
- 分析自己的 Electron App,快速畫出 IPC 與 preload 的暴露面,做安全檢查。
- 研究開源或你有授權的軟體,想讓 agent 幫你從二進位層面理解某段邏輯。
- CTF、資安研究、惡意程式分析這類本來就在用 Ghidra 的工作,想讓 agent 幫忙串工具。
- 想拿到別人產品的「原始碼」。它不會給你,而且 DISCLAIMER 明說不支援。
- 只是想看某個網站的前端怎麼寫。瀏覽器 DevTools 就夠了,不用多裝一個全域 MCP。
npx -y rea-agents@6.5.0 analyze-javascript-application /absolute/path/to/your-electron-app --json > result.json
拿自己的專案跑一次,對照你知道的答案,看它找得準不準,再決定要不要 setup 進 Claude Code。
延伸資源
- REA GitHub:morluto/rea
- 官方網站與案例:rea.tools、Showcases
- 繁中 README:README_zh-TW
- 測試用範例:electron/electron-quick-start
- 同樣是讓 Claude Code 長出新能力的工具:find-skills 是什麼?讓 Claude Code 自己找 skill