アプリ機能のリバースエンジニアリング
サードパーティアプリの出荷コードを読み、機能がどのように動作するかを学び、それをユーザーのプロジェクトにマッピングします。REA(rea-agents、github.com/morluto/rea)がアプリのトリアージを行います。約1時間の作業を見込んでいます。
基本ルール
- スクラッチディレクトリで作業します:
S=$(mktemp -d /tmp/rea-<target>.XXXX); mkdir -p $S/{dl,tools,out}; K=~/.claude/skills/reverse-engineering-app-features。ユーザーから依頼がない限り、ユーザーのリポジトリには触れません。 - REAは
$S/toolsから1コマンドずつ実行します: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秒;100MB超なので、catしないでください)。署名済みアプリでは*.asar.unpacked/*.nodeファイルに対するartifact_integrity_mismatchが通常発生します:--integrity-policy record-and-continueを付けて再実行します。normalized_result.summaryを読み、次にgraph.nodesをkind別に確認します(asar-entry、browser-window、electron-renderer、ipc-channel)。extract-artifact(同じフラグ)は$TMPDIR/rea-extracted-*に書き込みます(parameters.output_root):それを$Sに移動します。シンシェル? REAは動的URLを解決しないため、機能の文字列がそこにない場合は、メインバンドルでloadURL(をgrepし、config.jsonを読みます。リモートURLの場合は、Web行に進みます。 |
| Webアプリまたはシェル | ブラウザのユーザーエージェントを使用して、マーケティングページではなくアプケーションルート(例:/login)を取得します。すべてのチャンクを取得します:サービスワーカー(/sw.js、/service-worker.js、またはserviceWorker.register(が指定するもの)でfetch(/precache/manifestをgrepし、そのリクエストを正確にコピーします(JSONボディを持つPOSTの場合もあります)。それ以外の場合:webpackランタイムチャンクマップ、_buildManifest.js、.vite/manifest.json。xargs -P 16 -n 20 curl -sS --remote-name-allでダウンロードします。REAのWebコマンドはライブ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. 難読化JS内のロジックを見つける
REAは使用しません:大きなチャンクでは終了コード0で正常終了するが、何も解析しません(statistics.parsed_javascript_files: 0、「完全なファクトのバイト予算を超過」);制限を大きくしても修正されません。
- チャンクをランク付け:
LC_ALL=C /usr/bin/grep -c -F '<string>' *.js | grep -v ':0$' | sort -t: -k2 -nr(grepをugrepにエイリアスしていると「複雑さの制限を超過」で失敗します)。行全体を出力しないでください。 - 良いアンカー: ショートカットヘルプテキスト(準備された仕様)、キーバインディングテーブル、元に戻す/分析アクション名、デバッグログ文字列、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 (コード)またはInferred(確信度付き)のマークを付け、ファイル、バイトオフセット、ビルドバージョンを引用します(オフセットはリリースごとに変わります);プロジェクト用にコピー/保持/スキップを決定し、実際のファイルにマッピングします;REAが行ったことと行わなかったこと。/tmpは再起動時に消去されるため、リポジトリにコピーするオプションを提供します。
委任するには、バックグラウンドエージェントに以下の内容をブリーフィングします:機能、ターゲット、プロジェクト(最初にCLAUDE.mdを読む)、番号付きの質問(エッジケースを含む)、これらのルール、この成果物。