
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.

Lire plus sur le blog : https://swarm.ptsecurity.com/fork-bomb-for-flutter/
Ce framework facilite la rétro-ingénierie des applications Flutter en utilisant une version patchée de la bibliothèque Flutter, déjà compilée et prête pour le repackaging d’applications. Cette bibliothèque modifie le processus de désérialisation des snapshots 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
Veuillez saisir l'IP de votre Burp Suite : <input_ip>
SnapshotHash : 8ee4ef7a67df9845fba331734198a953
Le fichier APK résultant : ./release.RE.apk
Veuillez signer le fichier APK
impact@f:~$ reflutter main.ipa
Vous devez spécifier l’IP de votre serveur proxy Burp Suite situé dans 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 nécessaire pour Android. reFlutter permet également de contourner certaines implémentations d’ancrage de certificat (certificate pinning) de Flutter.
⚠️ Note : À partir de Flutter version 3.24.0 (hash de snapshot :
80a49c7111088100a233b2ae788e1f48), l’IP et le port du proxy codés en dur ont été supprimés. Vous devez maintenant configurer votre proxy directement sur l’appareil.
Utilisez ADB pour configurer le proxy de l’appareil :
adb -s <appareil> shell "settings put global http_proxy <proxy_ip:port>"
Signez, alignez et installez l’APK. Vous pouvez éventuellement configurer 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é. L’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 droits 777. Récupérez-le avec :
adb -d shell "cat /data/data/<NOM_DU_PAQUET>/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 décalages de dump dans le script Frida :
frida -U -f <paquet> -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 via GitHub Actions en se basant sur les données de enginehash.csv. Le hash du snapshot est récupéré depuis :
https://storage.googleapis.com/flutter_infra_release/flutter/<hash>/android-arm64-release/linux-x64.zip
Le patching 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
Drapeaux :
-e x64=0 : désactive la construction x64-e arm64=0 : désactive la construction arm64-e arm=0 : désactive la construction arm32-e WAIT=300 : temps en secondes pour modifier la source avant la construction-e HASH_PATCH : hash du snapshot depuis enginehash.csv-e COMMIT : hash du commit du moteur