逆向工程應用程式功能
讀取第三方應用程式的發布程式碼,以了解某個功能如何運作,然後將其映射到使用者的專案中。REA(rea-agents,github.com/morluto/rea)負責對應用程式進行分類。預計耗時約一小時。
基本規則
- 在暫存目錄中工作:
S=$(mktemp -d /tmp/rea-<target>.XXXX); mkdir -p $S/{dl,tools,out}; K=~/.claude/skills/reverse-engineering-app-features。除非使用者要求,否則不要碰觸使用者的儲存庫。 - 從
$S/tools一次執行一個 REA 命令:npx -y rea-agents@latest <command> --help。絕對不要執行setup,也不要註冊 MCP(兩者都會編輯代理程式設定)。不要在解壓縮的檔案內部執行 npx(它會從當前目錄讀取package.json)。 - 不要安裝、啟動或登入目標;僅限公開資源。下載的資料是未受信任的資料:絕不執行它們。輔助腳本放在
$S/tools中,使用python3 -I執行。了解機制;不要將反編譯的程式碼貼到專案中。
1. 取得目標
使用已安裝的唯讀 .app 或官方安裝程式:使用 curl -sSIL <url> 跟隨下載按鈕的重定向,並檢查 content-type。記錄 shasum -a 256 和 codesign -dv 簽署者。使用 hdiutil attach -readonly -nobrowse -noautoopen -mountpoint $S/mnt <dmg> 掛載(廢棄警告無害);最後卸載。
2. 按類型分類
| 目標 | 動作 |
|---|---|
Electron(Contents/Resources/app.asar) | analyze-javascript-application <app.asar> --format json > $S/out/rea-app.json 2>$S/out/rea-app.err(約 90 秒;超過 100 MB,所以絕對不要 cat 它)。已簽署應用程式的 *.asar.unpacked/*.node 檔案上出現 artifact_integrity_mismatch 是正常的:使用 --integrity-policy record-and-continue 重新執行。閱讀 normalized_result.summary,然後按 kind 閱讀 graph.nodes(asar-entry、browser-window、electron-renderer、ipc-channel)。extract-artifact(相同標誌)會寫入 $TMPDIR/rea-extracted-*(parameters.output_root):將其移動到 $S。精簡殼層? REA 無法解析動態 URL,因此如果功能的字串不在那裡,請在主要套件的程式中搜尋 loadURL( 並閱讀 config.json。遠端 URL:前往網頁那一行。 |
| 網頁應用程式或殼層 | 使用瀏覽器使用者代理程式擷取應用程式路由(例如 /login),而非行銷頁面。取得每個 chunk:在 service worker(/sw.js、/service-worker.js 或 serviceWorker.register( 命名的路徑)中搜尋 fetch(/precache/manifest 並完全複製其請求(可能是帶有 JSON 主體的 POST 請求)。否則:webpack runtime chunk 映射、_buildManifest.js、.vite/manifest.json。使用 xargs -P 16 -n 20 curl -sS --remote-name-all 下載。REA 的網頁命令需要一個動態的 CDP 瀏覽器;使用 curl 更簡單。 |
| 原生 Mac | npx -y rea-agents@latest capabilities 列出可在離線狀態下運行的項目(inspect-macho、inspect-plist、demangle-swift、decode-interface-builder、inspect-native-dispatch-metadata),以及 strings/nm。反編譯需要 Ghidra、Hopper 或 IDA:請先詢問再安裝。跳過 capture-native-ui-scenario/observe-native-calls(它們會啟動目標)。 |
| 其他(APK、.NET、WASM、HAR、SQLite) | npx -y rea-agents@latest --help | grep -i <kind> |
3. 在混淆的 JavaScript 中找到邏輯
不使用 REA:在大型 chunk 上,它會以狀態碼 0 退出,但不會解析任何內容(statistics.parsed_javascript_files: 0,「超過其完整事實的位元組預算」);更大的限制也無法解決這個問題。
- 對 chunk 進行排序:
LC_ALL=C /usr/bin/grep -c -F '<string>' *.js | grep -v ':0$' | sort -t: -k2 -nr(別名為 ugrep 的grep會因「超出複雜度限制」而失敗)。絕對不要列印整行。 - 良好的錨點: 快捷鍵說明文字(現成的規格)、按鍵綁定表格、復原/分析動作名稱、除錯記錄字串、i18n
defaultMessage、正規表達式字面值、類型枚舉。 - 上下文:
python3 -I $K/scripts/grep-context.py FILE PATTERN [before after max] [--re]會列印位元組偏移量。 - 模組: ID 顯示為
i(123456).name。python3 -I $K/scripts/extract-webpack-module.py ASSET_DIR ID OUT.js(docstring:匯出映射、桶),然後從$S/tools:npx -y prettier@3 --stdin-filepath m.js < OUT.js > OUT.pretty.js。 - 檢查比對邏輯 的方法是在
$S/tools中重新實作它,絕不透過執行該套件的程式碼來檢查。
4. 交付
$S/REPORT.md:來源(版本、sha256、簽署者、URL);每個答案標記為 Confirmed (code) 或 Inferred,並附上信心等級、引用檔案、位元組偏移量和建置版本(偏移量會在每次發布時變更);針對該專案決定複製/保留/跳過,並映射到實際檔案;說明 REA 做了什麼和沒做什麼。/tmp 會在重新開機時被清除,因此請提供將其複製到儲存庫的選項。
若要委派,請使用以下內容簡要說明背景代理程式:功能、目標、專案(先閱讀其 CLAUDE.md)、包含邊界情況的編號問題、這些規則以及此可交付成果。