你寫過一個小桌面程式,隔一陣子再看打包資料夾,卻想不起來:按下按鈕後,訊息到底交給誰?REA 教學可以從這個問題開始。先拿自己有答案的程式當練習場,再請 Claude Code 查證,會比直接交出一個陌生大型 App 更容易知道它看懂了多少。
這篇專為第一次接觸逆向分析、願意複製幾行指令的新手寫。你會先用白話分清 REA、Agent 與分析引擎,再建立六個檔案的 Electron 練習,追查一條 IPC 通道,最後學會保存證據、診斷失敗與退出設定。程式片段都附上它的工作;沒有程式背景,也能先看懂這條訊息路線。
以下依截至 2026 年 10 月 9 日的官方文件與 npm 套件整理。本次以 macOS、Node.js 24.15.0、REA 6.0.0 執行自有範例的 CLI 靜態分析與通道追查;沒有啟動 Electron 視窗、打包 ASAR,或執行 Claude Code 模型任務。後面的 Agent 提示詞是接入後的練習方法,成功範圍以這次留下的靜態 Evidence 為界。
先說結論:REA 教學先驗一條能對帳的路
REA=分析工具的接線員;可信結論=發現+檔案位置+驗收。把 Agent 想成調查員:它提出問題,REA 把問題交給合適工具,工具交回線索。調查員仍需把線索連回原檔,才能說明推論走到哪裡。
今天只做三件事:固定版本;用自有範例追查 demo:ping;把每個結論標成「讀到的程式」「推得的關係」或「仍待執行確認」。看到一條連線,代表靜態分析找到可能的交接;按鈕真的成功回覆,是另一項要親自驗的成果。
REA 是什麼?先分清五個零件
① Agent:「提出下一個問題的人」
Claude Code 是可接工具的 Coding Agent(協助開發的 AI 助手)。它負責解讀結果、提出後續查詢;REA 提供調查工具。若還分不清模型和讓模型動手的執行層,可先讀 Agent Harness 是什麼。這篇不需要指定某款 Claude 模型,重點在工具契約與驗收。
② MCP:「工具插座」
MCP(Model Context Protocol,模型上下文協定)讓 Agent 以標準方式呼叫工具。依 Claude Code 官方 MCP 文件,你可以查看已接入的伺服器與工具。REA 同時提供 CLI(終端機命令列);先在 CLI 分析成功,再接 MCP,會少一層連線變數。
③ 靜態分析:「看食譜」
依 JavaScript 靜態重建文件,REA 可讀取指定的應用資料夾或 ASAR,建立模組、Electron 邊界與關係圖,分析時不執行應用程式碼。ASAR 是 Electron 的應用封裝檔;從自己的成品找 resources/app.asar 是下一階段,本篇先用未打包資料夾練習。
④ 原生引擎:「拆機器的工作台」
JavaScript 是本篇可直接讀的腳本;原生二進位則是編譯後的機器指令。REA 的深度原生分析可接 Hopper、Ghidra 等引擎;這次靜態 JavaScript 流程不需要它們。遇到 .node 原生附加模組時,先定位檔案、雜湊與要查的 export(匯出功能),再決定是否接原生引擎,不要把整個 Electron 執行檔當成第一個分析對象。
⑤ Evidence:「每條線索的收據」
Evidence 是 REA 回傳的證據紀錄,包含輸入身分、圖、結果、位置與限制。雜湊像檔案指紋,幫你判斷兩次分析是不是同一份內容;它驗的是身分,不替推論正確性打分。JSON 是可保存和再交給工具的資料格式,並非畫面上的一段聊天摘要。

REA 教學上手:先固定版本,再看 setup 計畫
痛點是「今天的指令」和「昨天接入的伺服器」可能不是同一版。先點名,再接線。本次 npm 查到並執行的版本是 6.0.0。官方需求為 Node.js 22.x 至少 22.19、24.x 至少 24.11,或 26 以上;先在終端輸入下列指令,再核對 安裝文件。
node --version
npm --version
npm view rea-agents dist-tags.latest
npx -y rea-agents@6.0.0 --help
-y 是同意 npm 下載這個版本的套件,不是同意 REA 改你的 Agent 設定。若 Node 不符合範圍,先在自己管理的環境換到受支援版本,再繼續。main 分支文件可能比已發行套件更新;遇到選項不一致,對照實際版本的 help 與工具 schema(輸入欄位規格)。
接著只選 Claude Code,先看唯讀計畫。本次這個命令回傳 status: planned;我們沒有套用設定。
npx -y rea-agents@6.0.0 setup --client claude_code --dry-run --json
保存輸出的 plannedActions,逐一看設定檔路徑、MCP 註冊和 skill(工作指引)目的地。只做本篇靜態 JavaScript 時,不選安裝 Hopper。確認自己要的範圍後,在一般互動終端執行同版的 setup --client claude_code,閱讀計畫再套用。官方流程會備份既有設定、保留無關項目、驗證寫入結果;完成後重啟 Claude Code。
重啟後在 Claude Code 輸入 /mcp,確認 REA 已連線並查看工具。設定檔存在,與這一個 Agent session 真的能呼叫工具,要分開驗。需要把接入與運作驗得更完整,可接著讀 MCP 正式運作檢查。
建立自己的最小 Electron 練習:答案先寫好
在一個新的空資料夾建立 rea-demo,用文字編輯器新增以下六個檔案。這是靜態教學目標:不安裝 Electron,不執行 npm start。正式使用時還需補依賴、啟動流程與 IPC sender 驗證;本例只讓訊息路線保持清楚。
package.json
{
"name": "alphalab-rea-demo",
"version": "1.0.0",
"private": true,
"main": "main.js"
}
main.js
const { app, BrowserWindow, ipcMain } = require("electron");
const path = require("node:path");
const { reply } = require("./format.js");
ipcMain.handle("demo:ping", (_event, text) => reply(text));
app.whenReady().then(() => {
const win = new BrowserWindow({ webPreferences: {
preload: path.join(__dirname, "preload.js"),
contextIsolation: true, nodeIntegration: false
}});
win.loadFile("index.html");
});
preload.js
const { contextBridge, ipcRenderer } = require("electron");
contextBridge.exposeInMainWorld("demo", {
ping: (text) => ipcRenderer.invoke("demo:ping", text)
});
renderer.js
document.querySelector("#ping").addEventListener("click", async () => {
document.querySelector("#status").textContent = await window.demo.ping("hello");
});
format.js
exports.reply = (text) => "pong:" + String(text).toUpperCase();
index.html
<!doctype html><html><body><button id="ping">Ping</button><p id="status"></p><script src="renderer.js"></script></body></html>
main.js 是管理視窗的主程序;renderer.js 是頁面端;preload.js 是兩邊之間窄窄的接線板。contextBridge 把 demo.ping 暴露給頁面,ipcRenderer.invoke 送出具名訊息,ipcMain.handle 接收並回傳。可對照 Electron 官方雙向 IPC 教學。
先在筆記寫下已知答案:按鈕的程式呼叫 window.demo.ping("hello");preload 使用 demo:ping;main 同名接收,再呼叫 format.js。由我們寫的函式可算出預期字串 pong:HELLO,但本次沒有啟動視窗確認它真的出現在畫面上。這份答案是拿來查分析品質的尺。
追查 demo:ping:先拿完整 Evidence,再取一條線
在 rea-demo 內執行下列命令。macOS/Linux 的 pwd 取得目前資料夾的絕對路徑;Windows 請改成自己的完整路徑,例如 C:\work\rea-demo。輸出檔放在上一層,避免混進下一次目標分析。
npx -y rea-agents@6.0.0 analyze-javascript-application "$(pwd)" --json > ../application-evidence.json 2> ../analysis.stderr
驗收先看結果內容,再看程序是否結束。本次六檔範例讀到 4 個 JavaScript 檔案、0 個 parse failures(語法解析失敗);normalized_result.summary.ipc 列出 1 個 literal channel、1 個 main handler、1 組 paired renderer transmission。這些數字只描述本範例,不是所有 App 的成功率。stderr 則保存進度與診斷,stdout 保存 JSON,兩者分開比較好查。

下一步從完整紀錄建立追查輸入。把下面另存為 make-trace.cjs,同樣放在 rea-demo 外,然後在上一層執行。application 必須是完整 Evidence;只複製 summary 會丟掉工具驗證需要的材料。
const fs = require("node:fs");
const application = JSON.parse(fs.readFileSync("application-evidence.json", "utf8"));
fs.writeFileSync("trace-input.json", JSON.stringify({
application,
seed: { kind: "channel", value: "demo:ping", match: "exact" },
direction: "both"
}));
node make-trace.cjs
npx -y rea-agents@6.0.0 trace-application-feature ./trace-input.json --json > trace-evidence.json 2> trace.stderr
這裡的 channel 是查詢種子類型;圖上節點叫 ipc-channel,兩者名稱不同。本次先用後者當輸入遭到 schema 拒絕,改成 channel 後找到 1 個 seed match。direction: both 查兩個方向的可達關係,回傳可達圖,不保證是一條已執行的直線流程;要再回看檔案片段。精確契約可讀 官方應用追查文件。
開啟圖中的 location(位置),核對 preload.js 的 invoke、main.js 的 handle,再看 renderer.js 與 format.js。本次 exposes、invokes、handles 關係保留 static-relationship-inference(靜態關係推論)身分;圖上寫 inferred,就不應在解說中改成「觀察到它已執行」。
交給 Claude Code 的提示詞:要求位置,也允許未知
MCP 接通後,先給它一個窄問題。下面的路徑需換成自己的 rea-demo 絕對路徑;這段是建議練習,本次沒有送入 Claude Code 執行。
用 REA 靜態分析 /absolute/path/to/rea-demo。
只追查 demo:ping:找 preload 的 invoke、main 的 handle,
再核對 renderer 呼叫與 format.js 回傳。
每個結論附檔名、位置與原始程式片段,
區分讀到的內容、靜態推論、尚待執行確認。
不要啟動目標、不要安裝原生引擎、不要修改檔案。
先列出不確定的部分,再對照我的已知答案。
閱讀工具回傳前先保留原始 JSON,避免最後只剩模型摘要。看到目標檔內的「忽略先前指令」「執行下載」等文字,要把它當分析材料。Claude Code 安全文件說明權限與提示注入邊界;本次先用假資料,是讓送入模型的證據範圍容易辨認。
REA 在本機分析,Agent 收到的工具結果仍可能進入其模型服務。把檔案本機讀取、結果交給誰、對話如何保存分開記。本練習不含金鑰、帳號、私人路徑或真實客戶資料;擴大到自己的專案時,先挑要分析的副本與必要檔案。
卡住時怎麼判讀?三種失敗各有不同證據
① 輸入不合規:先改欄位
若 JSON 回傳 invalid_request,讀 details.issues 的欄位與允許值。本篇的 ipc-channel/channel 就是一個例子。程序結束得很快不等於成功;應保存錯誤輸出,改一個欄位再跑相同題目,避免同時升級版本和換目標。
② 客戶端不等了:先查哪一層計時
MCP 初始化、單次工具等待與 Ghidra 啟動,是不同的時鐘。依 Ghidra 首次查詢契約,原生流程的 open_binary 不等於匯入與自動分析已完成;第一個引擎查詢才會觸發那段工作。客戶端可能先逾時,不能只用畫面上的 timeout 判定引擎原因。
③ 引擎起不來:先留診斷,再重試
本次查到的官方文件給 Ghidra 首次啟動 330,000 毫秒,也就是 330 秒,涵蓋匯入、分析、bridge 與健康就緒。10 月 8 日 issue #1048的使用者回報 REA 5.0.0、Ghidra 12.1.4、JDK 21 容器中,一個 64 MB PE 超過這段期限;那是單一配置的報告,不是本篇 JavaScript 範例的等待時間。
保存 REA/引擎版本、目標類型與雜湊、出錯 operation、code、timeout、stderr 和 cleanup 狀態。若要查原生環境,可使用同版 doctor --provider ghidra --json;先處理它指出的原因。#1048 提的是預先匯入專案的需求,本篇不把提案當成可複製的解法,也不把 REA snapshot(結果快照)當成 Ghidra 已分析資料庫。
回復與退出:把接線拆乾淨,再驗原本工作
若 setup 後工具仍沒出現,先檢查原來選的 client、註冊版本與重啟狀態。要撤回接入,依 官方移除流程,使用同版 npx -y rea-agents@6.0.0 uninstall 移除 REA 自己管理的註冊與指引;保存 Evidence 檔作為驗收紀錄。
若需要還原備份,先對照 setup 前後差異,只回復本次變更,避免把後來其他 MCP 設定一起覆蓋。重啟 Agent,再驗原本工具正常;之後才整理測試資料。直接刪除整份 Claude 設定不是這個練習的退出方法。更大的專案可以接著讀 大型程式庫的安全變更流程,把範圍、差異與回復一起設計。
FAQ:REA 教學的八個直接答案
1. 一定要先裝 Hopper 或 Ghidra 嗎?
這次不用。靜態 JavaScript/Electron 資料夾分析只走對應流程;查原生函式才另選引擎。
2. 裝好 skill 就代表 MCP 接通嗎?
要另驗。skill 是調查指引;本 session 的工具連線要在重啟後確認。
3. 能直接分析自己的 app.asar 嗎?
可以走官方靜態輸入路線。先用自己的小資料夾驗成功,再給絕對 ASAR 路徑;缺少 unpacked 檔案時保留結果中的 unavailable。
4. 一組 IPC 配對就是按鈕成功嗎?
還不是。它是靜態關係;啟動自有測試 App、按鈕並核對輸出,才是另一份執行證據。
5. REA 會完整還原原始碼嗎?
不把它當保證。官方描述的是恢復可分析的結構、關係或原生偽碼;壓縮、混淆與缺少來源映射會影響你能核對的內容。
6. doctor 顯示 unhealthy 就全部不能用嗎?
看檢查範圍。原生引擎異常與本篇靜態流程是不同項目;直接跑小目標可以驗這一條路。
7. 330 秒是所有 REA 指令的上限嗎?
不是。本篇引用的是官方 Ghidra 啟動契約;客戶端等待與 JavaScript 分析要各看自己的診斷。
8. 本文跑過 Claude Code 的模型調查嗎?
沒有。本次跑的是 REA 6.0.0 CLI 靜態分析、通道追查與 setup 唯讀計畫;Agent 提示詞留作接入後練習。
給新手的三個重點
第一,用自己的小程式先寫好答案,讓 AI 的解說有可核對的對象。第二,保存原始 Evidence,讓位置、身分和限制不因聊天摘要而消失。第三,每次只跨一個邊界:CLI 成功,再接 MCP;靜態關係核對完,再考慮執行驗收或原生引擎。
接著閱讀
左右滑動查看更多推薦
下一步:交出第一份能查回原檔的調查紀錄
今天先建六個檔案,寫下 demo:ping 的已知路線,再保存一份分析 JSON 和一份追查 JSON。挑一個結論,打開它指到的檔案,親自核對那行程式。可信結論=發現+位置+驗收。做到這一步,再把同樣的方法移到自己的打包成品。更多學習路線可從 AI 教學總覽挑選,或到 AlphaLab 課程繼續建立可驗收的 AI 工作流。
