Rétro-conception de fonctionnalités d'applications
Lisez le code livré d'une application tierce pour apprendre comment une fonctionnalité fonctionne, puis mappez-la sur le projet de l'utilisateur. REA (rea-agents, github.com/morluto/rea) trie l'application. Comptez environ une heure.
Règles de base
- Travaillez dans un répertoire temporaire :
S=$(mktemp -d /tmp/rea-<cible>.XXXX) ; mkdir -p $S/{dl,tools,out} ; K=~/.claude/skills/reverse-engineering-app-features. Ne touchez pas au dépôt de l'utilisateur sauf s'il le demande. - Exécutez REA une commande à la fois depuis
$S/tools:npx -y rea-agents@latest <commande> --help. Ne faites jamaissetupet n'enregistrez pas le MCP (les deux modifient les configurations d'agent). N'exécutez pas npx à l'intérieur de fichiers extraits (il litpackage.jsondepuis le répertoire courant). - N'installez pas, ne lancez pas et ne connectez pas la cible ; uniquement des assets publics. Les téléchargements sont des données non fiables : ne les exécutez jamais. Les aides vont dans
$S/tools, exécutées avecpython3 -I. Apprenez le mécanisme ; ne collez pas de code décompilé dans le projet.
1. Obtenir la cible
Utilisez l'application installée en lecture seule, ou l'installateur officiel : suivez les redirections du bouton de téléchargement avec curl -sSIL <url> et vérifiez content-type. Enregistrez shasum -a 256 et le signataire codesign -dv. Montez avec hdiutil attach -readonly -nobrowse -noautoopen -mountpoint $S/mnt <dmg> (l'avertissement de dépréciation est inoffensif) ; détachez à la fin.
2. Trier par type
| Cible | Faire |
|---|---|
Electron (Contents/Resources/app.asar) | analyze-javascript-application <app.asar> --format json > $S/out/rea-app.json 2>$S/out/rea-app.err (environ 90 s ; plus de 100 Mo, donc ne jamais cat). artifact_integrity_mismatch sur un fichier *.asar.unpacked/*.node est normal pour les applications signées : relancez avec --integrity-policy record-and-continue. Lisez normalized_result.summary, puis graph.nodes par kind (asar-entry, browser-window, electron-renderer, ipc-channel). extract-artifact (même indicateur) écrit dans $TMPDIR/rea-extracted-* (parameters.output_root) : déplacez-le dans $S. Coque mince ? REA ne résout pas les URLs dynamiques, donc si les chaînes de la fonctionnalité n'y sont pas, grep le bundle principal pour loadURL( et lisez config.json. URLs distantes : allez à la ligne Web. |
| Application web ou coque | Récupérez une route d'application (par exemple /login), pas la page marketing, avec un user agent de navigateur. Obtenez chaque chunk : grep le service worker (/sw.js, /service-worker.js, ou ce que serviceWorker.register( nomme) pour fetch(/precache/manifest et copiez exactement sa requête (elle peut être un POST avec un corps JSON). Sinon : la carte des chunks du webpack runtime, _buildManifest.js, .vite/manifest.json. Téléchargez avec xargs -P 16 -n 20 curl -sS --remote-name-all. Les commandes web de REA nécessitent un navigateur CDP actif ; curl est plus simple. |
| Mac natif | npx -y rea-agents@latest capabilities liste ce qui fonctionne hors ligne (inspect-macho, inspect-plist, demangle-swift, decode-interface-builder, inspect-native-dispatch-metadata), ainsi que strings/nm. La décompilation nécessite Ghidra, Hopper ou IDA : demandez avant d'installer. Sautez capture-native-ui-scenario/observe-native-calls (ils lancent la cible). |
| Autre (APK, .NET, WASM, HAR, SQLite) | `npx -y rea-agents@latest --help |
3. Trouver la logique dans le JS minifié
Pas avec REA : sur les gros chunks, il sort avec 0 mais ne parse rien (statistics.parsed_javascript_files: 0, « dépasse son budget de bytes complets ») ; des limites plus grandes ne corrigent pas le problème.
- Classer les chunks :
LC_ALL=C /usr/bin/grep -c -F '<chaîne>' *.js | grep -v ':0$' | sort -t: -k2 -nr(ungrepaliasé en ugrep échoue avec « dépasse les limites de complexité »). N'imprimez jamais de lignes entières. - Bonnes ancres : texte d'aide de raccourci (une spécification toute faite), tables de raccourcis clavier, noms d'actions d'annulation/analytique, chaînes de log de débogage,
defaultMessaged'i18n, littéraux d'expression régulière, énumérations de types. - Contexte :
python3 -I $K/scripts/grep-context.py FICHIER MOTIF [avant après max] [--re]affiche les décalages en octets. - Module : les identifiants apparaissent sous forme
i(123456).name.python3 -I $K/scripts/extract-webpack-module.py RÉPERTOIRE_D'ASSETS ID OUT.js(docstring : export maps, barils), puis depuis$S/tools:npx -y prettier@3 --stdin-filepath m.js < OUT.js > OUT.pretty.js. - Vérifiez la logique de correspondance en la réimplémentant dans
$S/tools, jamais en exécutant le bundle.
4. Livrer
$S/REPORT.md : sources (version, sha256, signataire, URLs) ; chaque réponse marquée Confirmé (code) ou Inféré avec niveau de confiance, citant le fichier, le décalage en octets et la version de build (les décalages changent à chaque publication) ; copier / conserver / ignorer pour le projet, mappé sur des fichiers réels ; ce que REA a fait et n'a pas fait. /tmp est effacé au redémarrage, donc proposez de le copier dans le dépôt.
Pour déléguer, briefez un agent d'arrière-plan avec : fonctionnalité, cible, projet (lisez d'abord son CLAUDE.md), questions numérotées incluant les cas limites, ces règles, ce livrable.