
Lea más en el blog: https://swarm.ptsecurity.com/fork-bomb-for-flutter/
Este marco ayuda con las aplicaciones Flutter Ingeniería inversa utilizando la versión parcheada de la biblioteca Flutter que ya está compilada y lista para el reembolso de las aplicaciones. Esta biblioteca tiene un proceso de deserialización de instantáneas modificado para permitirle realizar un análisis dinámico de manera conveniente.
Características clave:
socket.cc está parcheado para el monitoreo e intercepción del tráfico;dart.cc se modifica para imprimir clases, funciones y algunos campos;Dockerfile especialmente elaborado # 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 Debe especificar la IP de su servidor proxy Burp Suite ubicado en la misma red donde el dispositivo con la aplicación Flutter está. A continuación, debe configurar el proxy en BurpSuite -> Listener Proxy -> Options tab
8083All interfacesTrue 
No necesita instalar ningún certificado. En un dispositivo Android, no necesita acceso a la raíz también. Reflutter también permite evitar algunas de las implementaciones de fijación del certificado Flutter.
El APK resultante debe estar alineado y firmado. Utilizo Java 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 lo que _kDartIsolateSnapshotInstructions (ex. 0xb000) es igual a usar una búsqueda binaria. Reflutter escribe el volcado en la carpeta raíz de la aplicación y establece 777 permisos en el archivo y la 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
}
} Use 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 imprimirá la ruta del archivo de volcado en los registros de la consola Xcode con la etiqueta de refleatismo Current working dir: /private/var/mobile/Containers/Data/Application/<UUID>/dump.dart a continuación, deberá extraer el archivo del dispositivo del dispositivo

El desplazamiento resultante del volcado se puede usar en el script frida
frida -U -f <package> -l frida.js
Para obtener el valor para _kDartIsolateSnapshotInstructions , puede usar readelf -Ws libapp.so ¿dónde está el valor que necesita en el campo Value
App.framework y libapp.so dentro del archivo ZIP Los motores se construyen usando el reflutut en las acciones de GitHub para construir la versión deseada, las confirmaciones y las hash de las instantáneas se usan a partir 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, el cambio de código de flutador manual es compatible con Docker especialmente elaborado
git clone https://github.com/Impact-I/reFlutter && cd reFlutter
docker build -t reflutter -f Dockerfile .Comando de construcción:
docker run -it -v " $( pwd ) :/t " -e HASH_PATCH= < Snapshot_Hash > -e COMMIT= < Engine_commit > reflutterEjemplo:
docker run -it -v " $( pwd ) :/t " -e HASH_PATCH=aa64af18e7d086041ac127cc4bc50c5e -e COMMIT=d44b5a94c976fbb65815374f61ab5392a220b084 reflutterEjemplo 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 Banderas:
-e x64 = 0 <Desactiva el edificio para la arquitectura x64, use para reducir el tiempo de construcción>
-E ARM64 = 0 <Desactiva el edificio para la arquitectura ARM64, use para reducir el tiempo de construcción>
-e ARM = 0 <Desactiva el edificio para la arquitectura ARM32, use para reducir el tiempo de construcción>
-e espera = 300
-e hash_patch = [snapshot_hash]
-e commit = [Engine_commit] <Aquí especifica la compromiso para la versión de su motor, tómelo de la tabla EngineHash.csv o desde Flutter/Engine Repo>