
En savoir plus sur le blog: https://swarm.ptsecurity.com/fork-bomb-for-flutter/
Ce framework aide aux applications Flutter ingénierie inverse à l'aide de la version correcée de la bibliothèque Flutter qui est déjà compilée et prête pour le reconditionnement des applications. Cette bibliothèque a un processus de désérialisation instantané modifié pour vous permettre d'effectuer une analyse dynamique de manière pratique.
Caractéristiques clés:
socket.cc est corrigé pour la surveillance et l'interception du trafic;dart.cc est modifié pour imprimer des classes, des fonctions et certains champs;Dockerfile spécialement conçu # Linux, Windows, MacOS
pip3 install reflutter==0.8.0
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
Configure Burp Suite proxy server to listen on *:8083
Proxy Tab -> Options -> Proxy Listeners -> Edit -> Binding Tab
Then enable invisible proxying in Request Handling Tab
Support Invisible Proxying -> true
impact@f:~ $ reflutter main.ipa Vous devez spécifier l'IP de votre serveur proxy Burp Suite situé dans le même réseau où se trouve l'appareil avec l'application Flutter. Ensuite, vous devez configurer 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 également besoin d'un accès root. Le reflux permet également de contourner certaines des implémentations d'épinglage du certificat de flux.
L'APK résultant doit être aligné et signé. J'utilise Uber-APK-Signner 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 ce que _kDartIsolateSnapshotInstructions (Ex. 0xb000) est égal à l'utilisation d'une recherche binaire. Le reflux écrit le vidage dans le dossier racine de l'application et définit 777 autorisation dans le fichier et le dossier. Vous pouvez tirer le fichier avec la commande ADB
impact@f:~ $ 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/ ;
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. Le reflux imprimera le chemin du fichier de vidage vers les journaux de la console Xcode avec la balise de réfluffeur Current working dir: /private/var/mobile/Containers/Data/Application/<UUID>/dump.dart Suivant, vous devrez retirer le fichier de l'appareil

Le décalage résultant du vidage peut être utilisé dans le script Frida
frida -U -f <package> -l frida.js
Pour obtenir de la valeur pour _kDartIsolateSnapshotInstructions , vous pouvez utiliser readelf -Ws libapp.so où est la valeur dont vous avez besoin dans le champ Value
App.framework et libapp.so Inside Zip Archive Les moteurs sont construits en utilisant des actions de reflux dans GitHub pour construire la version souhaitée, les engagements et les hachages d'instantanés sont utilisés à partir de ce tableau. Le hachage de l'instantané 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, le changement de code de flottement manuel est pris en charge à l'aide de Docker spécialement conçu
git clone https://github.com/Impact-I/reFlutter && cd reFlutter
docker build -t reflutter -f Dockerfile .Build Command:
docker run -it -v " $( pwd ) :/t " -e HASH_PATCH= < Snapshot_Hash > -e COMMIT= < Engine_commit > reflutterExemple:
docker run -it -v " $( pwd ) :/t " -e HASH_PATCH=aa64af18e7d086041ac127cc4bc50c5e -e COMMIT=d44b5a94c976fbb65815374f61ab5392a220b084 reflutterExemple de construction Android ARM64:
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 Frappeurs:
-e x64 = 0 <désactive le bâtiment pour une architecture x64, utiliser pour réduire le temps de construction>
-e arm64 = 0 <désactive le bâtiment pour l'architecture ARM64, utiliser pour réduire le temps de construction>
-e arm = 0 <désactive le bâtiment pour l'architecture ARM32, utiliser pour réduire le temps de construction>
-e attendre = 300
-e hash_patch = [snapshot_hash]
-e commit = [moteur_commit] <Ici, vous spécifiez un engagement pour votre version de moteur, prenez-le de la table moteurhash.csv ou de Flutter / Moteur Repo>