
Framework de ingeniería inversa de Flutter

Este framework ayuda con la ingeniería inversa de aplicaciones Flutter utilizando la versión parcheada de la librería Flutter que ya está compilada y lista para el reempaquetado de la aplicación. Esta librería tiene modificado el proceso de deserialización de instantáneas para permitirle realizar análisis dinámicos de una manera conveniente.
Características principales:
socket.cc está parcheado para la monitorización e interceptación de tráfico;dart.cc está modificado para imprimir clases, funciones y algunos campos;Dockerfile especialmente diseñado.# 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
Debe especificar la IP de su servidor proxy Burp Suite ubicado en la misma red donde está el dispositivo con la aplicación Flutter. A continuación, debe configurar el proxy en BurpSuite -> Listener Proxy -> Pestaña Options
8083All interfacesTrue
No necesita instalar ningún certificado. En un dispositivo Android, tampoco necesita acceso root. reFlutter también permite omitir algunas implementaciones de certificate pinning de Flutter.
El apk resultante debe estar alineado y firmado. Yo uso uber-apk-signer
java -jar uber-apk-signer.jar --allowResign -a release.RE.apk.
Para ver qué código se carga a través de DartVM, debe ejecutar la aplicación en el dispositivo. Tenga en cuenta que debe encontrar manualmente a qué equivale _kDartIsolateSnapshotInstructions (ej. 0xB000 ) mediante una búsqueda binaria. reFlutter escribe el volcado en la carpeta raíz de la aplicación y establece permisos 777 al archivo y carpeta. Puede extraer el archivo con el comando 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
}
}
Utilice el archivo IPA creado después de la ejecución del comando reflutter main.ipa. Para ver qué código se carga a través de DartVM, debe ejecutar la aplicación en el dispositivo. reFlutter imprime su salida en los registros de la consola en XCode con la etiqueta reflutter.

App.framework y libapp.so dentro del archivo zipLos motores se construyen usando reFlutter en Github Actions. Para construir la versión deseada, se usan commits y hashes de instantáneas de esta tabla.
El hash de la instantánea se extrae de storage.googleapis.com/flutter_infra_release/flutter/<hash>/android-arm64-release/linux-x64.zip
Si desea implementar sus propios parches, se admite el cambio manual de código Flutter utilizando un Docker especialmente diseñado.
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 <desactiva la construcción para arquitectura x64, úselo para reducir el tiempo de construcción>
-e arm=0 <desactiva la construcción para arquitectura arm, úselo para reducir el tiempo de construcción>
-e WAIT=300 <la cantidad de tiempo en segundos que necesita para editar el código fuente>
-e HASH_PATCH=[Snapshot_Hash] <aquí debe especificar el hash de instantánea que mejor coincida con la línea engine_commit de la tabla enginehash.csv. Se usa para la búsqueda adecuada de parches en reFlutter y para una compilación exitosa>
-e COMMIT=[Engine_commit] <aquí especifica el commit para su versión del motor, tómelo de la tabla enginehash.csv o del repositorio flutter/engine>