Communitygithub.com

harwal2000/skills

當使用者想知道另一個應用程式、網站或二進位檔如何在沒有原始碼的情況下實作某個功能時使用(例如「Notion/Raycast/Linear 是如何做到 X 的?」、「逆向工程此行為」、「檢視此應用程式內部」),或者提及 REA / rea-agents。適用於任何儲存庫或專案,包含在使用者自己的儲存庫內進行的研究。

skills 是什麼?

此技能用於逆向工程第三方應用程式的功能,無需原始碼即可理解其運作機制,並將這些機制映射到使用者的專案中。它依賴 REA(rea-agents,github.com/morluto/rea)來對目標應用程式進行分類與初步分析。技能支援多種目標類型,包括 Electron 應用程式(透過分析 .asar 檔案)、網頁應用程式(擷取並分析 JavaScript chunk)、原生 Mac 應用程式(使用靜態分析工具),以及其他格式如 APK、.NET、WASM、HAR 和 SQLite。工作流程遵循嚴格的規則:在臨時目錄中進行,避免執行下載的二進位檔,並使用 REA 的特定命令來提取結構化資料。對於大型混淆 JavaScript 檔案,它提供了進階技術,例如根據字串出現頻率對 chunk 進行排序、使用自訂 Python 腳本進行上下文搜尋,以及提取特定的 webpack 模組以進行格式化,從而幫助使用者找出功能邏輯。最終輸出為一份報告($S/REPORT.md),詳細說明來源、每個答案的確認等級(Confirmed (code) 或 Inferred)以及精確的位元組偏移量,並確保所有發現可歸因於特定版本。

相容平台✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/harwal2000/skills/tree/HEAD/skills/reverse-engineering-app-features

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

逆向工程應用程式功能

讀取第三方應用程式的發布程式碼,以了解某個功能如何運作,然後將其映射到使用者的專案中。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 更簡單。
原生 Macnpx -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,「超過其完整事實的位元組預算」);更大的限制也無法解決這個問題。

  1. 對 chunk 進行排序: LC_ALL=C /usr/bin/grep -c -F '<string>' *.js | grep -v ':0$' | sort -t: -k2 -nr(別名為 ugrep 的 grep 會因「超出複雜度限制」而失敗)。絕對不要列印整行。
  2. 良好的錨點: 快捷鍵說明文字(現成的規格)、按鍵綁定表格、復原/分析動作名稱、除錯記錄字串、i18n defaultMessage、正規表達式字面值、類型枚舉。
  3. 上下文: python3 -I $K/scripts/grep-context.py FILE PATTERN [before after max] [--re] 會列印位元組偏移量。
  4. 模組: 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。
  5. 檢查比對邏輯 的方法是在 $S/tools 中重新實作它,絕不透過執行該套件的程式碼來檢查。

4. 交付

$S/REPORT.md:來源(版本、sha256、簽署者、URL);每個答案標記為 Confirmed (code) 或 Inferred,並附上信心等級、引用檔案、位元組偏移量和建置版本(偏移量會在每次發布時變更);針對該專案決定複製/保留/跳過,並映射到實際檔案;說明 REA 做了什麼和沒做什麼。/tmp 會在重新開機時被清除,因此請提供將其複製到儲存庫的選項。

若要委派,請使用以下內容簡要說明背景代理程式:功能、目標、專案(先閱讀其 CLAUDE.md)、包含邊界情況的編號問題、這些規則以及此可交付成果。

Individual skills in this repo

This repo contains 1 individual skill — each has its own dedicated page.

相關技能