YouMind
登入

如何使用 Opus 5.5 逆向工程任何內容(完整課程)

@0xMovez
英語2026年10月12日
171K
271
38
8
557

TL;DR

本指南詳細介紹了使用 Claude Opus 5.5 和 REA 工具集對二進位檔案進行逆向工程的 11 步工作流程。涵蓋安裝、分析、處理混淆以及執行合法的乾淨室重建。

大多數嘗試逆向工程二進位檔案的人,都是把它丟進 hex editor,滾了二十分鐘畫面,然後放棄。

他們不知道該用哪個工具載入檔案,不知道該下什麼 prompt 才能把邏輯抽出來,更不知道怎麼把一整面牆的組合語言,變成真正能重新實作的東西。

這套 11 個步驟的課程,會把 Claude Opus 5.5 變成一台「什麼都能開源」的機器。

追蹤我的 Substack,取得最新的 AI alpha:

movez.substack.com

逆向工程的重點不是破解,而是把一個東西理解得夠透徹,好讓你能自己造出一個。

2026 年 10 月 7 日,Replit 執行長 Amjad Masad 只發了一行字:

https://x.com/amasad/status/2107671204639465961

底下,一位名叫 @morluto 的開發者直接貼出證明:一套能讓 Agent 驅動 Hopper 與 Ghidra、而且走得很遠的工具。

那個專案就是 REA,幾天內就衝破 110,000 顆 GitHub stars。

Movez - inline image

https://github.com/morluto/rea

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

Movez - inline image

https://getartcraft.com/apps

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

Movez - inline image

這門課會帶你走完從封閉的二進位檔到這種重製版的完整路徑,而負責讀檔的是 Opus 5.5。

01. 引擎 - Agent 如何讀取二進位檔

Opus 5.5 沒辦法自己跑 disassembler。它只能讀文字、寫文字。

用 Agent 做逆向工程之所以行得通,是因為模型與二進位檔之間卡了一個工具:它把檔案載入真正的反組譯引擎,把結果包裝成可呼叫的函式,讓模型可以一直提問。

Movez - inline image

這個工具就是 REA,底下的引擎則是 Hopper、Ghidra 或 IDA。

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

Movez - inline image

所有東西都在你的本機跑。除了模型推理需要的發現之外,什麼都不會上傳;而且每個結論都會被標記為觀察、推論或未知。

**

02. 安裝 - rea-agents 加上一個 disassembler

設定流程會把 REA 的 MCP server 註冊給你的 Agent,並安裝對應的工作流指令。

一行指令就搞定,它會在寫入任何東西之前先列出所有變更,也會備份動到的檔案。

Movez - inline image

Disassembler 要自備:macOS 上最省事的是 Hopper,Ghidra 免費又跨平台,如果你已經有 IDA 就用 IDA。

python
1# 1. 將 REA 註冊到你的 Agent(Claude Code、Codex、Cursor、Gemini CLI...)
2npx rea-agents setup # 顯示預計變更,寫入前會先詢問
3
4# 2. 深度分析提供者。macOS 上 Hopper 最順;
5# setup 可以在你同意後幫你裝。Ghidra 和 IDA 要自備。
6# 3. 安裝 rea CLI,方便在終端機使用與寫腳本
7npm install --global rea-agents
8rea --help
9
10# 4. 重啟你的 Agent,然後確認工具已上線
11claude
12> /mcp
13 rea: connected
14 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 更新,因為新版本修得很勤。

python
1# 逆向工程守則( CLAUDE.MD )
2
3## 權限
4- 只分析我擁有或有權檢查的目標。說明一次依據即可。
5- 每個主張都要標記:觀察(親眼看到)、推論(推理得出)或未知。
6- 引用證據:位址、位元組、偽代碼或呼叫點。不接受無來源的主張。
7
8## 工作流程
9- 從最小的總覽開始,不要一次全倒出來。只在有明確缺口時才展開。
10- 沿用已開啟的 session;絕對不要重複跑一模一樣的分析。
11- 分開靜態事實與執行期事實。絕對不要從靜態讀取暗示程式有被執行。
12
13## 重建
14- 根據「行為」與公開規格來打造,絕不複製程式碼或素材。
15- 記一份待辦帳本:每個還原出來的行為,都要有通過的測試才算「完成」。

Opus 5.5 提供五種 effort 等級:low、medium、high、xhigh、max。用法如下:

  • Medium 用來檢查與導覽
  • High 用來標註一般函式
  • Max 用來對付混淆過的程式碼,以及大量指標運算的東西。

在這整門課裡,effort 是影響品質最大的一個旋鈕。

03. 路由器 - 20 種目標類型,各配一個工具

新手最常犯的錯,就是目標明明是 Electron app、JavaScript 就擺在那邊,卻還是跑去開 disassembler。

REA 會把目標導向正確的工具,你的第一個 prompt 也該這麼做。講清楚檔名、講清楚功能,然後讓 Agent 自己挑入口工具。

Movez - inline image
python
1我想了解 [APP] 裡的 [FEATURE] 是怎麼運作的,它的路徑是 [ABSOLUTE PATH]。
2
3首先,告訴我這是哪一種目標(native、Electron/JS、.NET、Go、APK、WASM),
4並挑選正確的 REA 工具來開啟它。先不要開始深度分析。
5
6接著給我一段話的地圖:這個 app 用什麼做的、有多大、
7要找 [FEATURE] 你會先看哪裡。把觀察、推論與未知分開,
8任何主張都要附上證據。

把 REA 指向 Electron app,幾秒內就能拿到模組、import 與 IPC 邊界,完全不用 disassembler。

指向原生 Mach-O 或 ELF,則會開啟 Hopper 資料庫,走比較硬但更深入的原生路線。搞清楚自己身在哪條路,能省下好幾個小時。

https://x.com/_vmlops/status/2106690704244420687

04. 偵察 - 總覽、字串與呼叫圖

先別急著看程式碼。第一步是請 REA 給你整份檔案的地圖。一行指令就能告訴你它跑在哪種機器上、裡面有多少函式,以及所有埋得進去的可讀文字。

那些文字是你手上最快的線索:網址、錯誤訊息、功能名稱,在你還沒讀任何一行程式碼之前,就先告訴你這個 app 在做什麼。

python
1rea.open_binary { path: "/Applications/Target.app/Contents/MacOS/Target" }
2rea.binary_overview {}
3 arch: arm64
4 functions: 1,284 identified
5 segments: __TEXT __DATA __LINKEDIT
6 entry: _main @ 0x1000051c0
7
8rea.search { query: "http" } # strings + code refs
9 0x10004a2c0 "https://api.target.app/v3/sync"
10 0x10004a300 "Authorization: Bearer "
11 0x10004a330 "offline cache miss, falling back"
12
13rea.xrefs { address: "0x100012ab0" } # who calls this?
14 147 references -> core config loader, called everywhere

REA 還會計算每個函式被呼叫幾次(這個數字叫做交叉參考,也就是 xrefs)。

Movez - inline image

被呼叫 147 次的函式是這個 app 的心臟,值得你拿出最好的 effort。只被呼叫兩次的,是個小幫手,等它變重要再理就好。從清單最上面開始,一路往下做。

05. 反編譯 - 把一個函式變成偽代碼

現在挑一個忙碌的函式,把它轉成你看得懂的東西。反編譯器會把原始的機器指令,改寫成長得像 C 的程式碼。

它看起來很粗糙:變數都叫 var_28、邏輯纏成一團、到處都是型別轉換。但你看得懂,而「看得懂」正是 Opus 5.5 唯一需要的條件。

你可以從命令列跑它來存結果,也可以直接在對話裡用。

python
1# 依位址反編譯單一函式,輸出可 pipe 或存檔的 JSON
2rea decompile /Applications/Target.app/.../Target 0x100012ab0 \
3 --provider hopper --json > fn_config_loader.json
4
5# 或用名稱搜尋函式,並追蹤參考
6rea function /path/to/Target parseConfig --provider hopper --json
7rea xrefs /path/to/Target 0x100012ab0 --provider hopper --json
8rea trace /path/to/Target "sync" --provider hopper --json
python
1// 0x100012ab0 xrefs: 147
2void 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。

Movez - inline image

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

Movez - inline image

完整教學在 rea.tools/showcase。

06. 標註 - 讓 Opus 替每個變數命名

那份粗糙的程式碼只算做完一半。現在把它交給 Opus 5.5,請它解釋並整理乾淨。

它會把天書般的變數換成有意義的名字,用一句話說出這個函式的用途,看出它用了什麼設計模式,甚至抓出原版 app 留下來的 bug。

把這段 prompt 貼給 Claude:

python
1這是一個有 147 個交叉參考的函式所反編譯出來的偽代碼。
2
3針對這個函式:
41. 依照使用方式,把每個變數重新命名為有意義的名稱。
52. 用一句話說明它的用途。
63. 列出它讀寫了哪些資料結構。
74. 說出它用的模式(singleton、factory、state machine、observer...)。
85. 用乾淨、道地的 Swift(或呼叫慣例暗示的語言)重寫,並附上 doc comments。
96. 標出任何缺少的錯誤處理、輸入驗證或安全檢查。
10
11回答前先以 xhigh effort 想清楚:在定下名字之前,先推理每個值是什麼。
12不確定的地方都要標出來。
13
14[貼上偽代碼]

反編譯告訴你程式碼做了什麼。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 混淆器。把這些數字記在心裡。

Movez - inline image

這些數字裡藏著兩個實務教訓。

  • 第一,失敗的嘗試成本大約是成功的兩倍,因為模型會越試越用力才肯放棄,所以要幫每個函式設花費上限,提早停損。
  • 第二,送出之前先把反編譯程式碼裡的垃圾清掉(有個免費工具叫 Caveman,大概能清掉 75%),這樣模型的注意力才會花在真正的邏輯上,而不是填充物。

你實際上會遇到的五種手法,以及打開程式碼時各自長什麼樣子:

Movez - inline image
python
1這個函式看起來被混淆了。請用 max effort 處理。
2
31. 找出使用了哪些技巧(控制流平坦化、opaque predicates、
4 死碼、字串加密、函式拆分),並指出它們在這段程式碼裡的具體位置。
52. 解開它們:移除死分支、評估 opaque predicates、解除 dispatch 平坦化、
6 如果 key 找得回來就解密 inline 字串。
73. 秀出剩下的乾淨函式。
84. 用 1-10 分評估你的信心。低於 6 分的話,明確告訴我哪些部分不確定,
9 以及需要哪些鄰近上下文才能解開。不要默默瞎猜。
10
11[貼上混淆過的偽代碼]

08. 蜂群 - 一個 controller 帶著一群 worker

單一對話沒辦法好好讀完 500 個函式。它會忘掉看過的東西、用三個不同名字稱呼同一件事,最後開始自相矛盾。

解法是組一支小團隊:一個 controller 對話負責發派工作,幾個 worker 對話各認領一個函式。

Controller 掌握全局,再把碎片拼回去。

Movez - inline image

你不需要為此打造什麼特別的東西,下面這兩個 prompt 就是整套設定。

python
1你是逆向工程的 controller。函式地圖在 functions.json 裡
2(address、name、size、xref_count)。
3
41. 依呼叫圖的親近度將函式分群;依 xref 數量排序群集。
52. 把每個群集派給一個 worker。絕對不要自己分析任何函式。
63. 把已解析的 struct 注入每個 worker 的 brief,讓命名保持一致。
74. 當 worker 回傳的信心低於 6,就把已解析鄰居的上下文加進去,排第二次處理。
85. 追蹤累計 token 花費,並在每個群集完成後回報。
python
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 的行為,絕不是裡面的程式碼。做對了,你釋出的東西就完全是你的;做錯了,你就是在揹別人的著作權。

Movez - inline image

四條規則能讓你待在安全區,而 WordCraft 團隊在每次 build 時都會自動檢查這四項。

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

照著描述做,不只是為了法律保護傘。它讓你能為自己的語言與需求做出正確選擇,而不是繼承原作者幾十年前做的決定。

Movez - inline image

WordCraft 在某些地方比 Word 快,正是因為它沒有複製 Word 的內部實作。

10. 打造 App - 十二款專業工具,同一套方法

WordCraft 不是特例。它是 ArtCraft 團隊架上十二款 app 的其中之一,每一款都是你本來在花錢買的工具的 clean-room 重製版,全部用 Rust 從零寫起,在 GitHub 上免費開源釋出。

他們的口號是「Twelve apps. One craft」,而那個 craft 就是第 9 步的方法:觀察原版、讀公開規格、只憑行為打造全新版本。

Movez - inline image

這套共用方法帶來的好處,在每個地方都一樣。沒有 Electron:每款 app 在 macOS、Windows 與 Linux 上都是原生的,而且除了 FilmCraft 以外,其他都能透過 WebAssembly 直接在瀏覽器分頁裡跑。

也因為它們內部的每個動作都是一個有名字的 command,這十二款 app 馬上就能被 AI Agent 驅動。

每款 Craft app 的打造方式都一樣,而這個架構值得抄。它們都是分層堆疊的,每一層只使用下面那一層,從最底層的基本測量,一路堆到最上層的螢幕視窗。

以下是 WordCraft 的分層:

Movez - inline image

而且每個動作都只是一個有名字的 command,所以不管是人點擊、鍵盤快捷鍵,還是 AI Agent,觸發的都是完全相同的東西。這就是它們能被 Agent 驅動的原因。

python
1drive WordCraft over MCP
2
3# Headless document automation
4claude mcp add wordcraft -- wordcraft-cli mcp
5
6# Or drive the running desktop app
7wordcraft --control 7981 &
8claude mcp add wordcraft-app -- wordcraft-cli mcp --connect 127.0.0.1:7981
9
10# 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 PDF
13 ✓ select.all-headings -> 12 selected
14 ✓ format.font-size 14 · format.bold
15 ✓ export report.pdf (selectable text, bookmarks kept)

https://x.com/yuhasbeentaken/status/2109235513102057828

11. 驗證與發布 - 證明一致性、開放 MCP

你從來就沒有原版的原始碼,所以沒辦法逐行比對。

你要比對的是行為:給原版和你的重製版相同的輸入,檢查它們是否產出相同的輸出。

python
1Build a behavioral test harness comparing the original binary and my rebuild.
2
3Generate 50 inputs: 30 normal, 10 edge (empty, max size, unicode, special chars),
410 error (malformed, missing fields, corrupt). Run each through both. Compare output
5byte-for-byte where possible, semantically otherwise. Report match rate, a divergence
6list, and a severity for each (cosmetic / behavioral / critical). Save to report.md.

這也是你能拿給任何人看的最有力證明(就是文章最上方那段 RE 展示)。

Movez - inline image

接著,用 REA 與 WordCraft 的方式發布你的重製版:做成 MCP server,讓下一個人的 Agent 能像你驅動 REA 一樣驅動它。

給每個函式清楚的名稱與描述,包成一個簡單的命令列工具,並讓它一行指令就能裝好。

https://x.com/0xMovez/status/2108884063515746410

而且要邊做邊測,不要等到最後,因為等你在上面蓋了三層才發現錯誤,修復成本會高得多。

六個會毀掉你一整個週末的錯誤

  1. 在 Electron app 上開 disassembler。 如果 JavaScript 就在那裡,直接導向 analyze_javascript_application,完全跳過原生路線。
  2. 什麼都還沒讀就先全倒出來。 先請 REA 給你摘要。一次拉出整個 app,只會把真正的邏輯埋在雜訊裡,還會噴掉你的帳單。
  3. 照檔案順序讀函式。 請依交叉參考數量排序。147 次 xref 的函式就是架構;2 次 xref 的小幫手可以等。
  4. 死磕第三階段的混淆。 基準測試在多層混淆上的成功率是 0%。設好預算、存下鄰居的上下文,晚點再回來。
  5. 讓模型把程式碼複製進你的重製版。 這會破壞 clean-room。先在一個 context 寫規格,再到另一個 context 照規格實作。
  6. 沒有一致性報告就發布。 「我覺得應該一樣」不是證據。50 個行為測試與吻合率才是。

結論:

裝好 REA。讀懂二進位檔。把它重建成你自己的東西。

路由目標、摸清表面、反編譯熱門函式、讓 Opus 5.5 命名一切、拆解值得拆解的混淆、用蜂群放大規模,接著乾淨地寫出規格,並透過 MCP 發布重製版。

十一個步驟。一個模型。零行複製的程式碼。

一鍵儲存

使用 YouMind AI 深度閱讀爆款文章

保存原文、追問細節、總結觀點,並在一個 AI 工作空間裡把爆款文章沉澱成可複用筆記。

了解 YouMind
寫給創作者

把你的 Markdown 變成乾淨的 𝕏 文章

圖片上傳、表格、程式碼區塊,往 𝕏 上手動重排太痛苦。YouMind 把整篇 Markdown 一鍵轉成乾淨、可直接發佈的 𝕏 文章草稿。

試試 Markdown 轉 𝕏

更多可拆解樣本

近期爆款文章

探索更多爆款文章