
Applica patch alle librerie del motore Flutter per consentire il reverse engineering in runtime, l'intercettazione del traffico e il bypass del SSL pinning per app Android e iOS senza root o installazione di certificati.

Leggi di più sul blog: https://swarm.ptsecurity.com/fork-bomb-for-flutter/
Questo framework aiuta nel reverse engineering di app Flutter utilizzando una versione patchata della libreria Flutter, già compilata e pronta per il repacking dell'app. Questa libreria ha il processo di deserializzazione delle snapshot modificato per consentire di eseguire analisi dinamiche in modo comodo.
Caratteristiche principali:
socket.cc è patchato per il monitoraggio e l'intercettazione del traffico;dart.cc è modificato per stampare classi, funzioni e alcuni campi;Dockerfile appositamente creato.# 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
Devi specificare l'IP del tuo server proxy Burp Suite situato nella stessa rete del dispositivo con l'app Flutter. Quindi configura il Proxy in BurpSuite -> Listener Proxy -> Options tab:
8083All interfacesTrue
Non è necessaria l'installazione di certificati né l'accesso root per Android. reFlutter permette anche di bypassare alcune implementazioni di certificate pinning di Flutter.
⚠️ Nota: A partire dalla versione di Flutter 3.24.0 (hash snapshot:
80a49c7111088100a233b2ae788e1f48), l'IP e la porta del proxy hardcoded sono stati rimossi. Ora devi configurare il proxy direttamente sul dispositivo.
Usa ADB per configurare il proxy del dispositivo:
adb -s <device> shell "settings put global http_proxy <proxy_ip:port>"
Firma, allinea e installa l'APK. Opzionalmente configura TunProxy per instradare il traffico attraverso Burp Suite.
Firma e installa l'IPA. Configura Potatso per utilizzare il tuo server proxy Burp Suite.
L'APK risultante deve essere allineato e firmato. Uno strumento consigliato è uber-apk-signer:
java -jar uber-apk-signer.jar --allowResign -a release.RE.apk
Esegui l'app su un dispositivo. Determina _kDartIsolateSnapshotInstructions tramite ricerca binaria. reFlutter scrive il file di dump nella cartella root dell'app e imposta i permessi 777. Recuperalo usando:
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/ ;
...
Dopo aver eseguito reflutter main.ipa, esegui l'app sul dispositivo. Il percorso del file di dump viene stampato nei log della console di Xcode:
Current working dir: /private/var/mobile/Containers/Data/Application/<UUID>/dump.dart
Recupera il file dal dispositivo.

frida-tools==13.7.1
frida==16.7.19
Usa gli offset del dump nello script di Frida:
frida -U -f <package> -l frida.js
Per trovare _kDartIsolateSnapshotInstructions:
readelf -Ws libapp.so
Cerca il campo Value.
App.framework e libapp.so all'interno dell'archivio zipI motori vengono costruiti utilizzando GitHub Actions basandosi sui dati in enginehash.csv. L'hash dello snapshot viene recuperato da:
https://storage.googleapis.com/flutter_infra_release/flutter/<hash>/android-arm64-release/linux-x64.zip
Le modifiche manuali al codice Flutter sono supportate utilizzando Docker:
git clone https://github.com/Impact-I/reFlutter && cd reFlutter
docker build -t reflutter -f Dockerfile .
Esegui con:
docker run -it -v "$(pwd):/t" -e HASH_PATCH=<Snapshot_Hash> -e COMMIT=<Engine_commit> reflutter
Esempio:
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
Flag:
-e x64=0: disabilita la build x64-e arm64=0: disabilita la build arm64-e arm=0: disabilita la build arm32-e WAIT=300: tempo in secondi per modificare il codice sorgente prima della build-e HASH_PATCH: hash dello snapshot da enginehash.csv-e COMMIT: hash del commit del motore