
Framework de rétro-ingénierie Flutter

Ce framework aide à 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 reconditionnement d'applications. Cette bibliothèque a un processus de désérialisation de snapshot modifié pour permettre une analyse dynamique 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, fonctions et certains champs ;Dockerfile spécialement conçu.# Linux, Windows, MacOS
pip3 install reflutter
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
Configurez le serveur proxy Burp Suite pour écouter sur *:8083
Onglet Proxy -> Options -> Proxy Listeners -> Modifier -> Onglet Binding
Activez ensuite le proxy invisible dans l'onglet Request Handling
Support Invisible Proxying -> true
impact@f:~$ reflutter main.ipa
Vous devez spécifier l'IP de votre serveur proxy Burp Suite situé sur le même réseau que l'appareil contenant l'application Flutter. Ensuite, configurez le proxy dans BurpSuite -> Listener Proxy -> Options tab
8083All interfacesTrue
Vous n'avez pas besoin d'installer de certificats. Sur un appareil Android, vous n'avez pas non plus besoin d'accès root. reFlutter permet également de contourner certaines implémentations de certificat pinning de Flutter.
L'APK obtenu doit être aligné et signé. J'utilise uber-apk-signer
java -jar uber-apk-signer.jar --allowResign -a release.RE.apk.
Pour voir quel code est chargé via DartVM, vous devez exécuter l'application sur l'appareil. Notez que vous devez trouver manuellement la valeur de _kDartIsolateSnapshotInstructions (ex. 0xB000) en effectuant une recherche binaire. reFlutter écrit le dump dans le dossier racine de l'application et définit les permissions 777 sur le fichier et le dossier. Vous pouvez récupérer le fichier avec la commande adb
impact@f:~$ adb -d shell "cat /data/data/<NOM_DU_PACKAGE>/dump.dart" > dump.dart
Library:'package:anyapp/navigation/DeepLinkImpl.dart' Class: Navigation extends Object {
String* DeepUrl = anyapp://evil.com/ ;
Function 'Navigation.': constructor. (dynamic, dynamic, dynamic, dynamic) => NavigationInteractor {
Code Offset: _kDartIsolateSnapshotInstructions + 0x0000000000009270
}
Function 'initDeepLinkHandle':. (dynamic) => Future<void>* {
Code Offset: _kDartIsolateSnapshotInstructions + 0x0000000000412fe8
}
Function '_navigateDeepLink@547106886':. (dynamic, dynamic, {dynamic navigator}) => void {
Code Offset: _kDartIsolateSnapshotInstructions + 0x0000000000002638
}
}
Library:'package:anyapp/auth/navigation/AuthAccount.dart' Class: AuthAccount extends Account {
PlainNotificationToken* _instance = sentinel;
Function 'getAuthToken':. (dynamic, dynamic, dynamic, dynamic) => Future<AccessToken*>* {
Code Offset: _kDartIsolateSnapshotInstructions + 0x00000000003ee548
}
Function 'checkEmail':. (dynamic, dynamic) => Future<bool*>* {
Code Offset: _kDartIsolateSnapshotInstructions + 0x0000000000448a08
}
Function 'validateRestoreCode':. (dynamic, dynamic, dynamic) => Future<bool*>* {
Code Offset: _kDartIsolateSnapshotInstructions + 0x0000000000412c34
}
Function 'sendSmsRestorePassword':. (dynamic, dynamic) => Future<bool*>* {
Code Offset: _kDartIsolateSnapshotInstructions + 0x00000000003efb88
}
}
Utilisez le fichier IPA créé après l'exécution de la commande reflutter main.ipa. Pour voir quel code est chargé via DartVM, vous devez exécuter l'application sur l'appareil. reFlutter affiche sa sortie dans les logs de la console dans XCode avec le tag reflutter.

App.framework et libapp.so dans l'archive zipLes moteurs sont construits en utilisant reFlutter dans Github Actions. Pour construire la version souhaitée, les commits et les hash de snapshot sont utilisés à partir de ce tableau.
Le hash du snapshot est extrait de storage.googleapis.com/flutter_infra_release/flutter/<hash>/android-arm64-release/linux-x64.zip
Si vous souhaitez implémenter vos propres correctifs, la modification manuelle du code Flutter est prise en charge à l'aide d'un Docker spécialement conçu.
sudo docker pull ptswarm/reflutter
# Linux, Windows
EXAMPLE BUILD ANDROID ARM64:
sudo docker run -e WAIT=300 -e x64=0 -e arm=0 -e HASH_PATCH=<Snapshot_Hash> -e COMMIT=<Engine_commit> --rm -iv${PWD}:/t ptswarm/reflutter
FLAGS:
-e x64=0 <disables building for x64 archiitechture, use to reduce building time>
-e arm=0 <disables building for arm archiitechture, use to reduce building time>
-e WAIT=300 <the amount of time in seconds you need to edit source code>
-e HASH_PATCH=[Snapshot_Hash] <here you need to specify snapshot hash which matches the engine_commit line of enginehash.csv table best. It is used for proper patch search in reFlutter and for successfull compilation>
-e COMMIT=[Engine_commit] <here you specify commit for your engine version, take it from enginehash.csv table or from flutter/engine repo>