
Corrige as bibliotecas do motor Flutter para permitir engenharia reversa em tempo de execução, interceptação de tráfego e bypass de SSL pinning para aplicativos Android e iOS sem necessidade de root ou instalação de certificados.

Leia mais no blog: https://swarm.ptsecurity.com/fork-bomb-for-flutter/
Este framework auxilia na engenharia reversa de aplicativos Flutter usando a versão corrigida da biblioteca Flutter, que já está compilada e pronta para reempacotamento do app. Esta biblioteca tem o processo de desserialização de snapshot modificado para permitir que você realize análise dinâmica de forma conveniente.
Principais recursos:
socket.cc é corrigido para monitoramento e interceptação de tráfego;dart.cc é modificado para imprimir classes, funções e alguns campos;Dockerfile especialmente criado.# 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
Opções:
-p, --patch-dump — modo dump: corrige a engine para emitir dump.dart (classes/métodos/offsets) na inicialização, e imprime uma dica de frida.js em vez das instruções de proxy.-n, --no-interact — nunca solicita um IP do Burp (implica 127.0.0.1); útil para engines antigas em CI.-b <Snapshot_Hash>, --build-engine — modo de build da engine: imprime o commit da engine para um snapshot hash e (quando executado dentro de um checkout flutter/flutter) aplica os patches de código-fonte do reFlutter. Veja scripts/local-release.Você precisa especificar o IP do seu Burp Suite Proxy Server localizado na mesma rede onde está o dispositivo com o aplicativo Flutter. Em seguida, configure o Proxy em BurpSuite -> Listener Proxy -> Options tab:
8083All interfacesTrue
Não é necessária instalação de certificado nem acesso root para Android. O reFlutter também permite contornar algumas das implementações de certificate pinning do Flutter.
⚠️ Nota: Engines até e incluindo Flutter 3.24.x (snapshot hash
80a49c7111088100a233b2ae788e1f48) ainda carregam o IP de proxy hardcoded e são corrigidas no local. A partir do 3.27.x o IP hardcoded não existe mais — configure o proxy diretamente no dispositivo.
Use o ADB para configurar o proxy do dispositivo:
adb -s <device> shell "settings put global http_proxy <proxy_ip:port>"
Assine, alinhe e instale o APK. Opcionalmente, configure o TunProxy para rotear o tráfego através do Burp Suite.
Assine e instale o IPA. Configure o Potatso para usar seu servidor proxy do Burp Suite.
O apk resultante deve ser alinhado e assinado. Uma ferramenta recomendada é o uber-apk-signer:
java -jar uber-apk-signer.jar --allowResign -a release.RE.apk
Execute o app em um dispositivo. Determine _kDartIsolateSnapshotInstructions via busca binária. O reFlutter grava o arquivo de dump na pasta raiz do app e define permissões 777. Recupere-o 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/ ;
...
Após executar reflutter main.ipa, execute o app no dispositivo. O caminho do arquivo de dump é impresso nos logs do console do Xcode:
Current working dir: /private/var/mobile/Containers/Data/Application/<UUID>/dump.dart
Recupere o arquivo do dispositivo.

frida-tools==13.7.1
frida==16.7.19
Use os offsets de dump no script do Frida:
frida -U -f <package> -l frida.js
Para encontrar _kDartIsolateSnapshotInstructions:
readelf -Ws libapp.so
Procure pelo campo Value.
App.framework e libapp.so dentro do arquivo zipAs engines são compiladas com scripts/local-release (macOS; compila v2 + v3 para iOS e Android arm64/arm/x64, verifica se cada patch foi aplicado e envia os assets de release) com base nos dados em enginehash.csv. O commit da engine para um snapshot hash é resolvido via reflutter -b <Snapshot_Hash>. O snapshot hash é obtido de:
https://storage.googleapis.com/flutter_infra_release/flutter/<hash>/android-arm64-release/linux-x64.zip
A aplicação manual de patches no código do Flutter é suportada usando Docker:
git clone https://github.com/Impact-I/reFlutter && cd reFlutter
docker build -t reflutter -f Dockerfile .
Execute com:
docker run -it -v "$(pwd):/t" -e HASH_PATCH=<Snapshot_Hash> -e COMMIT=<Engine_commit> reflutter
Exemplo:
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
Flags:
-e x64=0: desabilita o build x64-e arm64=0: desabilita o build arm64-e arm=0: desabilita o build arm32-e WAIT=300: tempo em segundos para modificar o código-fonte antes do build-e HASH_PATCH: snapshot hash de enginehash.csv-e COMMIT: hash do commit da engine