
Patche les bibliothèques du moteur Flutter pour permettre l'ingénierie inverse en temps réel, l'interception du trafic, et le contournement de l'épinglage SSL pour les applications Android et iOS sans nécessiter de root ni d'installation de certificat.

Pour en savoir plus sur le blog : https://swarm.ptsecurity.com/fork-bomb-for-flutter/
Ce framework facilite le reverse engineering des applications Flutter en utilisant la version patchée de la bibliothèque Flutter, déjà compilée et prête pour le repackaging d'applications. Cette bibliothèque a son processus de désérialisation de snapshot modifié pour vous permettre d'effectuer une analyse dynamique de manière pratique.
Fonctionnalités clés :
socket.cc est patché pour la surveillance et l'interception du trafic ;dart.cc est modifié pour afficher les classes, les fonctions et certains champs ;Dockerfile spécialement conçu.# Linux, Windows, MacOS
pip3 install reflutter==0.8.6
impact@f:~$ reflutter main.apk
Please enter your Burp Suite IP: <input_ip>
SnapshotHash: 8ee4ef7a67df9845fba331734198a953
The resulting apk file: ./release.RE.apk
Please sign the apk file
impact@f:~$ reflutter main.ipa
Options :
-p, --patch-dump — mode dump : patche le moteur pour émettre dump.dart (classes/méthodes/offsets) au démarrage, et affiche une indication frida.js au lieu des instructions de proxy.-n, --no-interact — ne jamais demander d'IP Burp (implique 127.0.0.1) ; utile pour les anciens moteurs en CI.-b <Snapshot_Hash>, --build-engine — mode de build du moteur : affiche le commit du moteur pour un hash de snapshot et (lorsqu'exécuté dans un checkout flutter/flutter) applique les patchs source de reFlutter. Voir scripts/local-release.Vous devez spécifier l'IP de votre serveur proxy Burp Suite situé sur le même réseau que l'appareil exécutant l'application Flutter. Configurez ensuite le proxy dans BurpSuite -> Listener Proxy -> Options tab :
8083All interfacesTrue
Aucune installation de certificat ni accès root n'est requis pour Android. reFlutter permet également de contourner certaines implémentations de certificate pinning de Flutter.
⚠️ Remarque : Les moteurs jusqu'à Flutter 3.24.x inclus (hash de snapshot
80a49c7111088100a233b2ae788e1f48) contiennent encore l'IP de proxy codée en dur et sont patchés sur place. À partir de 3.27.x, l'IP codée en dur a disparu — configurez le proxy directement sur l'appareil.
Utilisez ADB pour configurer le proxy de l'appareil :
adb -s <device> shell "settings put global http_proxy <proxy_ip:port>"
Signez, alignez et installez l'APK. Configurez éventuellement TunProxy pour router le trafic via Burp Suite.
Signez et installez l'IPA. Configurez Potatso pour utiliser votre serveur proxy Burp Suite.
L'apk résultant doit être aligné et signé. Un outil recommandé est uber-apk-signer :
java -jar uber-apk-signer.jar --allowResign -a release.RE.apk
Exécutez l'application sur un appareil. Déterminez _kDartIsolateSnapshotInstructions par recherche binaire. reFlutter écrit le fichier dump dans le dossier racine de l'application et définit les permissions 777. Récupérez-le avec :
adb -d shell "cat /data/data/<PACKAGE_NAME>/dump.dart" > dump.dart
Library:'package:anyapp/navigation/DeepLinkImpl.dart' Class: Navigation extends Object {
String* DeepUrl = anyapp://evil.com/ ;
...
Après avoir exécuté reflutter main.ipa, lancez l'application sur l'appareil. Le chemin du fichier dump est affiché dans les logs de la console Xcode :
Current working dir: /private/var/mobile/Containers/Data/Application/<UUID>/dump.dart
Récupérez le fichier depuis l'appareil.

frida-tools==13.7.1
frida==16.7.19
Utilisez les offsets du dump dans le script Frida :
frida -U -f <package> -l frida.js
Pour trouver _kDartIsolateSnapshotInstructions :
readelf -Ws libapp.so
Cherchez le champ Value.
App.framework et libapp.so dans l'archive zipLes moteurs sont construits avec scripts/local-release (macOS ; compile v2 + v3 pour iOS et Android arm64/arm/x64, vérifie que chaque patch a été appliqué, et téléverse les assets de release) à partir des données de enginehash.csv. Le commit du moteur pour un hash de snapshot est résolu via reflutter -b <Snapshot_Hash>. Le hash de snapshot est récupéré depuis :
https://storage.googleapis.com/flutter_infra_release/flutter/<hash>/android-arm64-release/linux-x64.zip
Le patch manuel du code Flutter est pris en charge via Docker :
git clone https://github.com/Impact-I/reFlutter && cd reFlutter
docker build -t reflutter -f Dockerfile .
Exécutez avec :
docker run -it -v "$(pwd):/t" -e HASH_PATCH=<Snapshot_Hash> -e COMMIT=<Engine_commit> reflutter
Exemple :
docker run -it -v "$(pwd):/t" -e HASH_PATCH=aa64af18e7d086041ac127cc4bc50c5e -e COMMIT=d44b5a94c976fbb65815374f61ab5392a220b084 reflutter
docker run -e WAIT=300 -e x64=0 -e arm=0 -e HASH_PATCH=<Snapshot_Hash> -e COMMIT=<Engine_commit> --rm -iv${PWD}:/t reflutter
Flags :
-e x64=0 : désactive le build x64-e arm64=0 : désactive le build arm64-e arm=0 : désactive le build arm32-e WAIT=300 : temps en secondes pour modifier la source avant le build-e HASH_PATCH : hash de snapshot issu de enginehash.csv-e COMMIT : hash de commit du moteur