
Lesen Sie mehr im Blog: https://swarm.ptsecurity.com/fork-bomb-for-flutter/
Dieses Framework hilft bei Flutter Apps Reverse Engineering mit der gepatchten Version der Flutter -Bibliothek, die bereits kompiliert und für die Wiederholung von Apps bereit ist. Diese Bibliothek hat einen Snapshot -Deserialisierungsprozess geändert, damit Sie dynamische Analysen bequem durchführen können.
Schlüsselmerkmale:
socket.cc ist für die Verkehrsüberwachung und Abfangen geflickt.dart.cc wird modifiziert, um Klassen, Funktionen und einige Felder zu drucken.Dockerfile unterstützt # 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 Sie müssen die IP Ihres Burp Suite -Proxy -Servers angeben, das sich im selben Netzwerk befindet, in dem sich das Gerät mit der Flutter -Anwendung befindet. Als nächstes sollten Sie den Proxy in BurpSuite -> Listener Proxy -> Options tab konfigurieren
8083All interfacesTrue 
Sie müssen keine Zertifikate installieren. Auf einem Android -Gerät benötigen Sie auch keinen Root -Zugriff. Reflutter ermöglicht auch, einige der Flutter -Zertifikat -Pinning -Implementierungen zu umgehen.
Die resultierende APK muss ausgerichtet und signiert werden. Ich benutze den Uber-APK-Signal java -jar uber-apk-signer.jar --allowResign -a release.RE.apk . Um herauszufinden, welcher Code über DARTVM geladen wird, müssen Sie die Anwendung auf dem Gerät ausführen. Beachten Sie, dass Sie manuell finden müssen, was _kDartIsolateSnapshotInstructions (Ex. 0xb000) entspricht, eine binäre Suche zu verwenden. Reflutter schreibt den Dump in den Stammordner der Anwendung und legt 777 Berechtigungen in die Datei und den Ordner fest. Sie können die Datei mit ADB -Befehl ziehen
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
}
} Verwenden Sie die IPA -Datei, die nach der Ausführung des Befehls reflutter main.ipa erstellt wurde. Um herauszufinden, welcher Code über DARTVM geladen wird, müssen Sie die Anwendung auf dem Gerät ausführen. Reflutter druckt den Dump -Dateipfad zu den Xcode -Konsolenprotokollen mit dem Reflutter -Tag Current working dir: /private/var/mobile/Containers/Data/Application/<UUID>/dump.dart als nächstes, Sie müssen die Datei vom Gerät ausziehen

Der resultierende Offset von der Müllkippe kann im Frida -Skript verwendet werden
frida -U -f <package> -l frida.js
Um readelf -Ws libapp.so Wert für _kDartIsolateSnapshotInstructions zu Value
App.framework und libapp.so im Zip -Archiv Die Motoren werden mit Reflutter in Github -Aktionen gebaut, um die gewünschte Version zu erstellen, Commits und Snapshot -Hashes werden 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 Sie Ihre eigenen Patches implementieren möchten, wird die Änderung des manuellen Flatter -Code -Änderung mit einem speziell gefertigten Docker unterstützt
git clone https://github.com/Impact-I/reFlutter && cd reFlutter
docker build -t reflutter -f Dockerfile .Befehl erstellen:
docker run -it -v " $( pwd ) :/t " -e HASH_PATCH= < Snapshot_Hash > -e COMMIT= < Engine_commit > reflutterBeispiel:
docker run -it -v " $( pwd ) :/t " -e HASH_PATCH=aa64af18e7d086041ac127cc4bc50c5e -e COMMIT=d44b5a94c976fbb65815374f61ab5392a220b084 reflutterBeispiel Build 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 Flaggen:
-e x64 = 0 <Deaktiviert das Gebäude für die X64 -Architektur, um die Bauzeit zu verkürzen>
-E ARM64 = 0 <Deaktiviert das Gebäude für die ARM64 -Architektur, um die Bauzeit zu verkürzen>
-E ARM = 0 <Deaktiviert das Gebäude für die Architektur der ARM32, um die Bauzeit zu verkürzen>
-e warte = 300
-e Hash_Patch = [Snapshot_Hash]
-e commit = [Engine_Commit] <Hier geben Sie den Auftrag für Ihre Motorversion an. Nehmen Sie es von EngineHash.csv -Tabelle oder aus Flutter/Motor Repo>