為什麼 Windows 計算機按 200 + 10% 會得到 220,而不是 200.1 或 10?REA(Reverse Engineer Anything)的官網拿這個問題示範:讓 coding agent 直接讀計算機安裝檔裡的機器碼,找出 % 按鈕的規則。答案是:% 前面是加號時,它取的是第一個數的百分比;前面是乘除時,才只把 10 變成 0.1。
這個例子剛好說明 REA 的分工:REA 不負責「想」,只把指令、呼叫關係和執行時的觀察交給 agent,由 agent 推理、對照、驗證。看懂這個分工,就知道這類工具能做到哪裡。
REA 是一層 MCP,不是一個會思考的反編譯器
逆向工程(reverse engineering)是在沒有原始碼時,從程式本身推回它怎麼運作。傳統上是人開著 Ghidra、IDA、Hopper 這類反組譯工具逐個函式讀。
REA 把這些工具包成 MCP(Model Context Protocol,讓模型呼叫外部工具的協定)伺服器。執行 npx rea-agents setup 後,Claude Code、Codex、Cursor 等 agent 就能呼叫它。回傳內容依目標而定:
- 原生執行檔:虛擬碼、組合語言、字串、符號與呼叫關係,需要搭配 Hopper、Ghidra 或 IDA
- JavaScript/Electron 應用:模組、import、IPC(行程間通訊)與原生擴充的關係,靜態分析不用執行程式
- 網站與執行中的程式:頁面結構、載入的腳本、網路請求,以及多次執行的比較
另有 .NET、Android APK、韌體等目標。README 強調每個結論都附上證據與限制。
跟著 % 按鈕走一遍
第一步:從問題出發。 使用者只問「為什麼 200 + 10% 是 220」。REA 啟動計算機,agent 挑出負責計算的 DLL。
第二步:拿到指令。 REA 回傳 % 處理函式的組合語言,關鍵只有幾行:
CMP EAX, 0x5c
JZ 0x180124aba
CMP EAX, 0x5b
JZ 0x180124aba
MOV EDX, 0x64
意思是:運算子代號是 0x5c 或 0x5b 就跳到同一處;否則把 0x64(十進位 100)當參數往下呼叫。
第三步:替數字命名。 機器碼只有代號,沒有名字,這是讀者最容易卡住的地方。agent 拿代號去對照微軟公開的計算機原始碼,發現 IDC_MUL 是 92(0x5c)、IDC_DIV 是 91(0x5b),所以那兩個跳躍代表「乘或除走另一條路」。再追下去,非乘除(例如加法)那條路做的是「目前值 × 前一個值 ÷ 100」,也就是 10 × 200 ÷ 100 = 20,最後 200 + 20 = 220。
整理成可讀的形式就是:
if (operation == multiply || operation == divide) {
percent = current / 100;
} else {
percent = current * previous / 100;
}
要注意,這段的變數名稱借自微軟公開原始碼,不是從二進位檔直接冒出來的。**REA 給的是位址和常數,意義是 agent 對照外部資料補上的。**官網也標明,agent 的思考和回答是示意。
驗證:讓原程式當裁判
光是「讀懂」還不夠,REA 的案例都會回頭跟原程式比對。Chrome 恐龍遊戲的例子中,REA 透過本機除錯連線讀到實際載入的 index.js,找出速度從 6 開始、每次更新加 0.001、上限 13。接著在受控瀏覽器裡呼叫原遊戲的更新函式:4,000 次後速度 10.0,10,000 次後 13.0,與規則一致。
DX-Ball 的案例更嚴格:重建出來的 C 程式通過 3,205 組與原始 x86 程式對照的測試,並重現了該函式全部 63 個編譯後的位元組。HN 上也有留言者分享,用 Claude 移植沒有原始碼的 Linux 遊戲時,只要有「能不能跑」這種明確訊號,模型就摸得出來。
適合拿來做什麼,又卡在哪裡
從這幾個例子看,REA 最順手的場景是:問題很具體、答案能驗證。「這個按鈕怎麼算」「這個速度怎麼變」都有明確的輸入輸出可以比對。反過來,像留言區有人挑戰的「逆向 iPhone 與 Siri 溝通的內部 API」,目標龐大又缺公開對照,現有案例還證明不了。
實務上還有幾個條件:
- 深入的原生分析仍要靠 Hopper、Ghidra 或 IDA,商業工具得自己合法取得授權
- 執行期擷取會用你的使用者權限真的跑目標程式
- 分析在本機,但工具回傳的結果會送給 agent 背後的模型供應商,適用對方的資料政策
- 專案聲明只用於合法研究、教育、互通性、軟體保存,以及你擁有或被授權檢查的軟體
把 REA 想成替 agent 準備的放大鏡比較貼切:它讓模型看得到程式內部,但看到的東西代表什麼、重建得對不對,仍要靠對照與測試確認。
回應
還沒有回應,成為第一個留言的人吧。