大多數嘗試逆向工程二進位檔案的人,都是把它丟進 hex editor,滾了二十分鐘畫面,然後放棄。
他們不知道該用哪個工具載入檔案,不知道該下什麼 prompt 才能把邏輯抽出來,更不知道怎麼把一整面牆的組合語言,變成真正能重新實作的東西。
這套 11 個步驟的課程,會把 Claude Opus 5.5 變成一台「什麼都能開源」的機器。
追蹤我的 Substack,取得最新的 AI alpha:
逆向工程的重點不是破解,而是把一個東西理解得夠透徹,好讓你能自己造出一個。
2026 年 10 月 7 日,Replit 執行長 Amjad Masad 只發了一行字:
https://x.com/amasad/status/2107671204639465961
底下,一位名叫 @morluto 的開發者直接貼出證明:一套能讓 Agent 驅動 Hopper 與 Ghidra、而且走得很遠的工具。
那個專案就是 REA,幾天內就衝破 110,000 顆 GitHub stars。

https://github.com/morluto/rea
這不是吹牛。同一週,一個叫 WordCraft 的開源專案,用純 Rust 交出了一份 Microsoft 與 Adobe 的 clean-room 重製版:

它的做法是觀察 Word 與 Adobe 的行為、閱讀公開的檔案格式規格,完全沒碰過原始碼。

這門課會帶你走完從封閉的二進位檔到這種重製版的完整路徑,而負責讀檔的是 Opus 5.5。
01. 引擎 - Agent 如何讀取二進位檔
Opus 5.5 沒辦法自己跑 disassembler。它只能讀文字、寫文字。
用 Agent 做逆向工程之所以行得通,是因為模型與二進位檔之間卡了一個工具:它把檔案載入真正的反組譯引擎,把結果包裝成可呼叫的函式,讓模型可以一直提問。

這個工具就是 REA,底下的引擎則是 Hopper、Ghidra 或 IDA。
迴圈很簡單,而且不斷重複:模型請 REA 檢查目標,REA 回傳發現與背後的確切證據(位址、位元組、偽代碼、呼叫點),模型再拿這些發現去問下一個問題,或是寫出並測試重製版本。

所有東西都在你的本機跑。除了模型推理需要的發現之外,什麼都不會上傳;而且每個結論都會被標記為觀察、推論或未知。
**
02. 安裝 - rea-agents 加上一個 disassembler
設定流程會把 REA 的 MCP server 註冊給你的 Agent,並安裝對應的工作流指令。
一行指令就搞定,它會在寫入任何東西之前先列出所有變更,也會備份動到的檔案。

Disassembler 要自備:macOS 上最省事的是 Hopper,Ghidra 免費又跨平台,如果你已經有 IDA 就用 IDA。
1# 1. 將 REA 註冊到你的 Agent(Claude Code、Codex、Cursor、Gemini CLI...)2npx rea-agents setup # 顯示預計變更,寫入前會先詢問34# 2. 深度分析提供者。macOS 上 Hopper 最順;5# setup 可以在你同意後幫你裝。Ghidra 和 IDA 要自備。6# 3. 安裝 rea CLI,方便在終端機使用與寫腳本7npm install --global rea-agents8rea --help910# 4. 重啟你的 Agent,然後確認工具已上線11claude12> /mcp13 rea: connected14 open_binary, binary_overview, analyze_function, decompile,15 list_procedures, search, xrefs, trace, inspect_artifact,16 analyze_javascript_application, inspect_managed_artifact ...
需求很低:Node.js 22 以上加上 npm。原生分析需要三套引擎之一;靜態 JavaScript 與 .NET 檢查則完全不需要引擎。記得保持 REA 更新,因為新版本修得很勤。
1# 逆向工程守則( CLAUDE.MD )23## 權限4- 只分析我擁有或有權檢查的目標。說明一次依據即可。5- 每個主張都要標記:觀察(親眼看到)、推論(推理得出)或未知。6- 引用證據:位址、位元組、偽代碼或呼叫點。不接受無來源的主張。78## 工作流程9- 從最小的總覽開始,不要一次全倒出來。只在有明確缺口時才展開。10- 沿用已開啟的 session;絕對不要重複跑一模一樣的分析。11- 分開靜態事實與執行期事實。絕對不要從靜態讀取暗示程式有被執行。1213## 重建14- 根據「行為」與公開規格來打造,絕不複製程式碼或素材。15- 記一份待辦帳本:每個還原出來的行為,都要有通過的測試才算「完成」。
Opus 5.5 提供五種 effort 等級:low、medium、high、xhigh、max。用法如下:
- Medium 用來檢查與導覽
- High 用來標註一般函式
- Max 用來對付混淆過的程式碼,以及大量指標運算的東西。
在這整門課裡,effort 是影響品質最大的一個旋鈕。
03. 路由器 - 20 種目標類型,各配一個工具
新手最常犯的錯,就是目標明明是 Electron app、JavaScript 就擺在那邊,卻還是跑去開 disassembler。
REA 會把目標導向正確的工具,你的第一個 prompt 也該這麼做。講清楚檔名、講清楚功能,然後讓 Agent 自己挑入口工具。

1我想了解 [APP] 裡的 [FEATURE] 是怎麼運作的,它的路徑是 [ABSOLUTE PATH]。23首先,告訴我這是哪一種目標(native、Electron/JS、.NET、Go、APK、WASM),4並挑選正確的 REA 工具來開啟它。先不要開始深度分析。56接著給我一段話的地圖:這個 app 用什麼做的、有多大、7要找 [FEATURE] 你會先看哪裡。把觀察、推論與未知分開,8任何主張都要附上證據。
把 REA 指向 Electron app,幾秒內就能拿到模組、import 與 IPC 邊界,完全不用 disassembler。
指向原生 Mach-O 或 ELF,則會開啟 Hopper 資料庫,走比較硬但更深入的原生路線。搞清楚自己身在哪條路,能省下好幾個小時。
https://x.com/_vmlops/status/2106690704244420687
04. 偵察 - 總覽、字串與呼叫圖
先別急著看程式碼。第一步是請 REA 給你整份檔案的地圖。一行指令就能告訴你它跑在哪種機器上、裡面有多少函式,以及所有埋得進去的可讀文字。
那些文字是你手上最快的線索:網址、錯誤訊息、功能名稱,在你還沒讀任何一行程式碼之前,就先告訴你這個 app 在做什麼。
1rea.open_binary { path: "/Applications/Target.app/Contents/MacOS/Target" }2rea.binary_overview {}3 arch: arm644 functions: 1,284 identified5 segments: __TEXT __DATA __LINKEDIT6 entry: _main @ 0x1000051c078rea.search { query: "http" } # strings + code refs9 0x10004a2c0 "https://api.target.app/v3/sync"10 0x10004a300 "Authorization: Bearer "11 0x10004a330 "offline cache miss, falling back"1213rea.xrefs { address: "0x100012ab0" } # who calls this?14 147 references -> core config loader, called everywhere
REA 還會計算每個函式被呼叫幾次(這個數字叫做交叉參考,也就是 xrefs)。

被呼叫 147 次的函式是這個 app 的心臟,值得你拿出最好的 effort。只被呼叫兩次的,是個小幫手,等它變重要再理就好。從清單最上面開始,一路往下做。
05. 反編譯 - 把一個函式變成偽代碼
現在挑一個忙碌的函式,把它轉成你看得懂的東西。反編譯器會把原始的機器指令,改寫成長得像 C 的程式碼。
它看起來很粗糙:變數都叫 var_28、邏輯纏成一團、到處都是型別轉換。但你看得懂,而「看得懂」正是 Opus 5.5 唯一需要的條件。
你可以從命令列跑它來存結果,也可以直接在對話裡用。
1# 依位址反編譯單一函式,輸出可 pipe 或存檔的 JSON2rea decompile /Applications/Target.app/.../Target 0x100012ab0 \3 --provider hopper --json > fn_config_loader.json45# 或用名稱搜尋函式,並追蹤參考6rea function /path/to/Target parseConfig --provider hopper --json7rea xrefs /path/to/Target 0x100012ab0 --provider hopper --json8rea trace /path/to/Target "sync" --provider hopper --json
1// 0x100012ab0 xrefs: 1472void sub_100012ab0(void* arg0) {3 void* var_20 = objc_msgSend(cls_NSJSONSerialization,4 sel_JSONObjectWithData_options_error, arg0, 0x0, 0x0);5 if (var_20 != 0x0) {6 void* var_28 = objc_msgSend(var_20, sel_objectForKey, @"endpoints");7 void* var_30 = objc_msgSend(var_20, sel_objectForKey, @"auth_mode");8 void* var_38 = objc_msgSend(var_20, sel_objectForKey, @"retry_count");9 objc_msgSend(g_sharedConfig, sel_setEndpoints, var_28);10 objc_msgSend(g_sharedConfig, sel_setAuthMode, var_30);11 objc_msgSend(g_sharedConfig, sel_setRetryCount,12 objc_msgSend(var_38, sel_intValue));13 }14}
REA 官方的 showcase 示範了如何在老遊戲 DX-Ball 裡,順著一個音效呼叫找到決定左右聲道平衡的 helper,再把那份半成品偽代碼轉成 C。

結果通過全部 3,205 個原始測試案例,並且精準重現了 63 個編譯位元組中的每一個。

完整教學在 rea.tools/showcase。
06. 標註 - 讓 Opus 替每個變數命名
那份粗糙的程式碼只算做完一半。現在把它交給 Opus 5.5,請它解釋並整理乾淨。
它會把天書般的變數換成有意義的名字,用一句話說出這個函式的用途,看出它用了什麼設計模式,甚至抓出原版 app 留下來的 bug。
把這段 prompt 貼給 Claude:
1這是一個有 147 個交叉參考的函式所反編譯出來的偽代碼。23針對這個函式:41. 依照使用方式,把每個變數重新命名為有意義的名稱。52. 用一句話說明它的用途。63. 列出它讀寫了哪些資料結構。74. 說出它用的模式(singleton、factory、state machine、observer...)。85. 用乾淨、道地的 Swift(或呼叫慣例暗示的語言)重寫,並附上 doc comments。96. 標出任何缺少的錯誤處理、輸入驗證或安全檢查。1011回答前先以 xhigh effort 想清楚:在定下名字之前,先推理每個值是什麼。12不確定的地方都要標出來。1314[貼上偽代碼]
反編譯告訴你程式碼做了什麼。Opus 5.5 告訴你為什麼,以及重建它所需的名字。
https://x.com/0x0SojalSec/status/2108389060192706674
https://x.com/0x0SojalSec/status/2108031166502896035
不是每個目標都需要 disassembler。REA 的 Notion showcase 就在 app 的 JavaScript 裡找到剪貼簿功能,沿著 Electron 層一路追到 main process,完整示範它如何建立 rich clipboard——全程追蹤,一行組合語言都沒用到。詳見
07. 混淆 - Tigress 基準測試
有些 app 天生就是為了防你正在做的事。它們的程式碼被刻意打亂:邏輯被洗牌、文字被加密、還塞滿假分支來浪費你的時間。
這叫做混淆,也是連最強模型都會卡住的地方。Elastic Security Labs 實際量測過,讓 Claude Opus 在 20 個任務中對付 Tigress 混淆器。把這些數字記在心裡。

這些數字裡藏著兩個實務教訓。
- 第一,失敗的嘗試成本大約是成功的兩倍,因為模型會越試越用力才肯放棄,所以要幫每個函式設花費上限,提早停損。
- 第二,送出之前先把反編譯程式碼裡的垃圾清掉(有個免費工具叫 Caveman,大概能清掉 75%),這樣模型的注意力才會花在真正的邏輯上,而不是填充物。
你實際上會遇到的五種手法,以及打開程式碼時各自長什麼樣子:

1這個函式看起來被混淆了。請用 max effort 處理。231. 找出使用了哪些技巧(控制流平坦化、opaque predicates、4 死碼、字串加密、函式拆分),並指出它們在這段程式碼裡的具體位置。52. 解開它們:移除死分支、評估 opaque predicates、解除 dispatch 平坦化、6 如果 key 找得回來就解密 inline 字串。73. 秀出剩下的乾淨函式。84. 用 1-10 分評估你的信心。低於 6 分的話,明確告訴我哪些部分不確定,9 以及需要哪些鄰近上下文才能解開。不要默默瞎猜。1011[貼上混淆過的偽代碼]
08. 蜂群 - 一個 controller 帶著一群 worker
單一對話沒辦法好好讀完 500 個函式。它會忘掉看過的東西、用三個不同名字稱呼同一件事,最後開始自相矛盾。
解法是組一支小團隊:一個 controller 對話負責發派工作,幾個 worker 對話各認領一個函式。
Controller 掌握全局,再把碎片拼回去。

你不需要為此打造什麼特別的東西,下面這兩個 prompt 就是整套設定。
1你是逆向工程的 controller。函式地圖在 functions.json 裡2(address、name、size、xref_count)。341. 依呼叫圖的親近度將函式分群;依 xref 數量排序群集。52. 把每個群集派給一個 worker。絕對不要自己分析任何函式。63. 把已解析的 struct 注入每個 worker 的 brief,讓命名保持一致。74. 當 worker 回傳的信心低於 6,就把已解析鄰居的上下文加進去,排第二次處理。85. 追蹤累計 token 花費,並在每個群集完成後回報。
1你是 worker。你會拿到一個反編譯好的函式,以及目前為止解析出的 struct。2嚴格回傳:address、purpose、confidence(1-10)、structs_used、structs_new、3clean_source、flags。沿用既有的 struct 名稱;controller 已經給過你的 struct,4絕對不要自己發明第二個名字。一次只處理一個函式。做完就停。
https://x.com/victor_explore/status/2109466356454510612
09. Clean room - 四個讓你合法的規則
Clean-room 重製的意思是:你複製的是 app 的行為,絕不是裡面的程式碼。做對了,你釋出的東西就完全是你的;做錯了,你就是在揹別人的著作權。

四條規則能讓你待在安全區,而 WordCraft 團隊在每次 build 時都會自動檢查這四項。
- 只觀察,不複製。 用黑箱方式跑目標程式、看它做什麼、只截它自己的視窗。絕對不要讀、反組譯或貼上它的程式碼。除了單純的功能名稱外,不要照抄任何措辭。
- 看規格,不看原始碼。 檔案格式一律來自公開標準(OOXML 是 ECMA-376 / ISO 29500,再加上公開的 RTF 與 ODF 規格),絕對不能去讀競爭對手的 parser 或任何 GPL/LGPL 程式碼。
- 只用原創素材。 每個圖示、字型、範本與音效,都要嘛是用程式畫的、要嘛是 public-domain 或開放授權,並在 attribution 檔案裡留一行紀錄。否則 CI 檢查會直接讓 build 失敗。
- 把工作拆成兩份。 一個 Agent 負責還原行為並寫出規格。另一個完全不同的 context 只根據規格實作,絕對不看原始分析。這條界線就是 clean-room 的核心。
1根據完成的分析,撰寫一份供重製使用的 clean-room 規格。23只描述「行為」。包含:每個公開介面、資料模型、每個使用者看得到的功能4(寫成可測試的需求)、讀寫的檔案格式(依觀察到的行為與公開規格),5以及錯誤處理行為。67「不要」包含:位址或 offset、反編譯出來的變數名稱、組合語言,8或任何從原版複製的東西。必須讓一個從未見過該二進位檔的開發者,9光靠這份文件就能實作出相容版本。1011輸出 markdown,分為以下章節:Architecture、Data Model、Public API、File Formats、12Test Cases。
照著描述做,不只是為了法律保護傘。它讓你能為自己的語言與需求做出正確選擇,而不是繼承原作者幾十年前做的決定。

WordCraft 在某些地方比 Word 快,正是因為它沒有複製 Word 的內部實作。
10. 打造 App - 十二款專業工具,同一套方法
WordCraft 不是特例。它是 ArtCraft 團隊架上十二款 app 的其中之一,每一款都是你本來在花錢買的工具的 clean-room 重製版,全部用 Rust 從零寫起,在 GitHub 上免費開源釋出。
他們的口號是「Twelve apps. One craft」,而那個 craft 就是第 9 步的方法:觀察原版、讀公開規格、只憑行為打造全新版本。

這套共用方法帶來的好處,在每個地方都一樣。沒有 Electron:每款 app 在 macOS、Windows 與 Linux 上都是原生的,而且除了 FilmCraft 以外,其他都能透過 WebAssembly 直接在瀏覽器分頁裡跑。
也因為它們內部的每個動作都是一個有名字的 command,這十二款 app 馬上就能被 AI Agent 驅動。
每款 Craft app 的打造方式都一樣,而這個架構值得抄。它們都是分層堆疊的,每一層只使用下面那一層,從最底層的基本測量,一路堆到最上層的螢幕視窗。
以下是 WordCraft 的分層:

而且每個動作都只是一個有名字的 command,所以不管是人點擊、鍵盤快捷鍵,還是 AI Agent,觸發的都是完全相同的東西。這就是它們能被 Agent 驅動的原因。
1drive WordCraft over MCP23# Headless document automation4claude mcp add wordcraft -- wordcraft-cli mcp56# Or drive the running desktop app7wordcraft --control 7981 &8claude mcp add wordcraft-app -- wordcraft-cli mcp --connect 127.0.0.1:7981910# Tools: list_commands, execute, batch, type_text, select_text,11# inspect_document, render_page, save_document (+ screenshot/click/key live)12> Open report.docx, make every heading 14pt bold, export to PDF13 ✓ select.all-headings -> 12 selected14 ✓ format.font-size 14 · format.bold15 ✓ export report.pdf (selectable text, bookmarks kept)
https://x.com/yuhasbeentaken/status/2109235513102057828
11. 驗證與發布 - 證明一致性、開放 MCP
你從來就沒有原版的原始碼,所以沒辦法逐行比對。
你要比對的是行為:給原版和你的重製版相同的輸入,檢查它們是否產出相同的輸出。
1Build a behavioral test harness comparing the original binary and my rebuild.23Generate 50 inputs: 30 normal, 10 edge (empty, max size, unicode, special chars),410 error (malformed, missing fields, corrupt). Run each through both. Compare output5byte-for-byte where possible, semantically otherwise. Report match rate, a divergence6list, and a severity for each (cosmetic / behavioral / critical). Save to report.md.
這也是你能拿給任何人看的最有力證明(就是文章最上方那段 RE 展示)。

接著,用 REA 與 WordCraft 的方式發布你的重製版:做成 MCP server,讓下一個人的 Agent 能像你驅動 REA 一樣驅動它。
給每個函式清楚的名稱與描述,包成一個簡單的命令列工具,並讓它一行指令就能裝好。
https://x.com/0xMovez/status/2108884063515746410
而且要邊做邊測,不要等到最後,因為等你在上面蓋了三層才發現錯誤,修復成本會高得多。
六個會毀掉你一整個週末的錯誤
- 在 Electron app 上開 disassembler。 如果 JavaScript 就在那裡,直接導向 analyze_javascript_application,完全跳過原生路線。
- 什麼都還沒讀就先全倒出來。 先請 REA 給你摘要。一次拉出整個 app,只會把真正的邏輯埋在雜訊裡,還會噴掉你的帳單。
- 照檔案順序讀函式。 請依交叉參考數量排序。147 次 xref 的函式就是架構;2 次 xref 的小幫手可以等。
- 死磕第三階段的混淆。 基準測試在多層混淆上的成功率是 0%。設好預算、存下鄰居的上下文,晚點再回來。
- 讓模型把程式碼複製進你的重製版。 這會破壞 clean-room。先在一個 context 寫規格,再到另一個 context 照規格實作。
- 沒有一致性報告就發布。 「我覺得應該一樣」不是證據。50 個行為測試與吻合率才是。
結論:
裝好 REA。讀懂二進位檔。把它重建成你自己的東西。
路由目標、摸清表面、反編譯熱門函式、讓 Opus 5.5 命名一切、拆解值得拆解的混淆、用蜂群放大規模,接著乾淨地寫出規格,並透過 MCP 發布重製版。
十一個步驟。一個模型。零行複製的程式碼。





