Reverse-Engineering von App-Funktionen
Lies den ausgelieferten Code einer Drittanbieter-App, um zu erfahren, wie eine Funktion funktioniert, und übertrage diese Erkenntnisse dann auf das Projekt des Benutzers. REA (rea-agents, github.com/morluto/rea) übernimmt die erste Analyse der App. Rechne mit etwa einer Stunde.
Grundregeln
- Arbeite in einem temporären Verzeichnis:
S=$(mktemp -d /tmp/rea-<target>.XXXX); mkdir -p $S/{dl,tools,out}; K=~/.claude/skills/reverse-engineering-app-features. Lasse das Repository des Benutzers unberührt, es sei denn, er bittet darum. - Führe REA einen Befehl nach dem anderen aus
$S/toolsaus:npx -y rea-agents@latest <command> --help. Verwende niemalssetupund registriere niemals den MCP (beides bearbeitet Agentenkonfigurationen). Führe npx nicht innerhalb extrahierter Dateien aus (es liestpackage.jsonaus dem aktuellen Verzeichnis). - Installiere, starte oder melde dich nicht bei der Ziel-App an; nur öffentliche Ressourcen. Downloads sind unvertrauenswürdige Daten: führe sie niemals aus. Helfer werden in
$S/toolsabgelegt und mitpython3 -Iausgeführt. Verstehe den Mechanismus; füge keinen dekompilierten Code in das Projekt ein.
1. Das Ziel beschaffen
Verwende die installierte .app schreibgeschützt oder das offizielle Installationsprogramm: Folge den Weiterleitungen des Download-Buttons mit curl -sSIL <url> und überprüfe den content-type. Notiere shasum -a 256 und den Signaturgeber von codesign -dv. Hänge mit hdiutil attach -readonly -nobrowse -noautoopen -mountpoint $S/mnt <dmg> ein (die Veraltungswarnung ist harmlos); trenne am Ende wieder.
2. Analyse nach Typ
| Ziel | Vorgehen |
|---|---|
Electron (Contents/Resources/app.asar) | analyze-javascript-application <app.asar> --format json > $S/out/rea-app.json 2>$S/out/rea-app.err (ca. 90 s; über 100 MB, daher niemals cat verwenden). artifact_integrity_mismatch bei einer *.asar.unpacked/*.node-Datei ist bei signierten Apps normal: wiederhole mit --integrity-policy record-and-continue. Lies normalized_result.summary, dann graph.nodes nach kind (asar-entry, browser-window, electron-renderer, ipc-channel). extract-artifact (gleiches Flag) schreibt nach $TMPDIR/rea-extracted-* (parameters.output_root): verschiebe es nach $S. Dünne Shell? REA löst keine dynamischen URLs auf. Wenn die Strings der Funktion nicht vorhanden sind, durchsuche das Hauptbundle nach loadURL( und lies config.json. Remote-URLs: gehe zur Web-Zeile. |
| Web-App oder Shell | Rufe eine App-Route (z. B. /login) ab, nicht die Marketing-Seite, mit einem Browser-User-Agent. Hole jedes Chunk: Durchsuche den Service Worker (/sw.js, /service-worker.js oder was serviceWorker.register( benennt) nach fetch(/precache/manifest und kopiere dessen Anfrage genau (es könnte ein POST mit einem JSON-Body sein). Sonst: die Webpack-Runtime-Chunk-Map, _buildManifest.js, .vite/manifest.json. Lade mit xargs -P 16 -n 20 curl -sS --remote-name-all herunter. REAs Web-Befehle benötigen einen laufenden CDP-Browser; curl ist einfacher. |
| Nativ Mac | npx -y rea-agents@latest capabilities listet auf, was offline funktioniert (inspect-macho, inspect-plist, demangle-swift, decode-interface-builder, inspect-native-dispatch-metadata), plus strings/nm. Dekompilierung benötigt Ghidra, Hopper oder IDA: frage vor der Installation. Überspringe capture-native-ui-scenario/observe-native-calls (sie starten die Ziel-App). |
| Andere (APK, .NET, WASM, HAR, SQLite) | npx -y rea-agents@latest --help | grep -i <art> |
3. Die Logik in minimiertem JS finden
Nicht mit REA: Bei großen Chunks liefert es Exit-Code 0, parst aber nichts (statistics.parsed_javascript_files: 0, „überschreitet sein complete-fact byte budget“); größere Limits beheben das nicht.
- Chunks sortieren:
LC_ALL=C /usr/bin/grep -c -F '<string>' *.js | grep -v ':0$' | sort -t: -k2 -nr(eingrep, das auf ugrep aliasiert ist, schlägt fehl mit „exceeds complexity limits“). Gib niemals ganze Zeilen aus. - Gute Anker: Kurzbefehl-Hilfetexte (eine fertige Spezifikation), Tastenkombinationstabellen, Rückgängig-/Analyse-Aktionsnamen, Debug-Log-Strings, i18n
defaultMessage, Regex-Literale, Typ-Enums. - Kontext:
python3 -I $K/scripts/grep-context.py DATEI MUSTER [vorher nachher max] [--re]gibt Byte-Offsets aus. - Modul: IDs erscheinen als
i(123456).name.python3 -I $K/scripts/extract-webpack-module.py ASSET_DIR ID OUT.js(Dokumentation: Export-Maps, Barrel-Exports), dann von$S/tools:npx -y prettier@3 --stdin-filepath m.js < OUT.js > OUT.pretty.js. - Überprüfe die Matching-Logik, indem du sie in
$S/toolsneu implementierst, niemals durch Ausführen des Bundles.
4. Ausliefern
$S/REPORT.md: Quellen (Version, sha256, Signaturgeber, URLs); jede Antwort als Bestätigt (Code) oder Abgeleitet mit Konfidenz, unter Angabe von Datei, Byte-Offset und Build-Version (Offsets ändern sich mit jedem Release); Kopieren / Behalten / Überspringen für das Projekt, abgebildet auf echte Dateien; was REA getan hat und was nicht. /tmp wird beim Neustart gelöscht, biete daher an, es in das Repository zu kopieren.
Zum Delegieren informiere einen Hintergrundagenten mit: Funktion, Ziel, Projekt (lies zuerst dessen CLAUDE.md), nummerierte Fragen inkl. Randfälle, diese Regeln, dieses Ergebnisdokument.