
Flutter Reverse Engineering Framework

Dieses Framework unterstützt das Reverse Engineering von Flutter‑Apps, indem es eine gepatchte Version der Flutter‑Bibliothek verwendet, die bereits kompiliert und für das Repackaging der App bereit ist. Die Bibliothek enthält eine modifizierte Snapshot‑Deserialisierung, die eine dynamische Analyse auf bequeme Weise ermöglicht.
Hauptfunktionen:
socket.cc wurde gepatcht, um Datenverkehr zu überwachen und abzufangen;dart.cc wurde modifiziert, um Klassen, Funktionen und einige Felder auszugeben;Dockerfile unterstützt.# Linux, Windows, MacOS
pip3 install reflutter
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
Du musst die IP deines Burp‑Suite‑Proxy‑Servers angeben, der sich im selben Netzwerk wie das Gerät mit der Flutter‑App befindet. Als Nächstes solltest du den Proxy in BurpSuite -> Listener Proxy -> Options tab konfigurieren.
8083All interfacesTrue
Du musst keine Zertifikate installieren. Auf einem Android‑Gerät benötigst du auch keinen Root‑Zugriff. reFlutter ermöglicht es außerdem, einige Implementierungen des Flutter‑Zertifikat‑Pinnings zu umgehen.
Die resultierende APK muss ausgerichtet und signiert werden. Ich verwende uber-apk-signer
java -jar uber-apk-signer.jar --allowResign -a release.RE.apk.
Um zu sehen, welcher Code über die DartVM geladen wird, musst du die Anwendung auf dem Gerät ausführen. Beachte, dass du manuell ermitteln musst, was _kDartIsolateSnapshotInstructions (z. B. 0xB000) mittels einer binären Suche ergibt. reFlutter schreibt den Dump in das Stammverzeichnis der Anwendung und setzt die Berechtigungen 777 für die Datei und den Ordner. Du kannst die Datei mit dem adb‑Befehl abrufen:
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
}
}
Verwende die IPA‑Datei, die nach der Ausführung des Befehls reflutter main.ipa erstellt wurde. Um zu sehen, welcher Code über die DartVM geladen wird, musst du die Anwendung auf dem Gerät ausführen. reFlutter gibt seine Ausgabe in den Konsolenprotokollen in Xcode mit dem Tag reflutter aus.

App.framework und libapp.so im ZIP‑Archiv verbessernDie Engines werden mit reFlutter in GitHub Actions gebaut. Für die gewünschte Version werden Commits und Snapshot‑Hashes aus dieser Tabelle verwendet.
Der Hash des Snapshots wird aus storage.googleapis.com/flutter_infra_release/flutter/<hash>/android-arm64-release/linux-x64.zip extrahiert.
Wenn du eigene Patches implementieren möchtest, wird eine manuelle Änderung des Flutter‑Codes mithilfe eines speziell erstellten Docker unterstützt.
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>