
Framework de Engenharia Reversa Flutter

Este framework ajuda na engenharia reversa de aplicativos Flutter usando a versão patched da biblioteca Flutter que já está compilada e pronta para o reempacotamento do aplicativo. Esta biblioteca tem o processo de desserialização de snapshot modificado para permitir que você realize análise dinâmica de maneira conveniente.
Características principais:
socket.cc é patched 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
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
Você precisa especificar o IP do seu Servidor Proxy Burp Suite localizado na mesma rede onde o dispositivo com o aplicativo Flutter está. Em seguida, você deve configurar o Proxy em BurpSuite -> Listener Proxy -> Guia Options
8083All interfacesTrue
Você não precisa instalar nenhum certificado. Em um dispositivo Android, você também não precisa de acesso root. reFlutter também permite contornar algumas implementações de certificate pinning do Flutter.
O apk resultante deve ser alinhado e assinado. Eu uso uber-apk-signer
java -jar uber-apk-signer.jar --allowResign -a release.RE.apk.
Para ver qual código é carregado através do DartVM, você precisa executar o aplicativo no dispositivo. Observe que você deve encontrar manualmente o valor de _kDartIsolateSnapshotInstructions (ex. 0xB000) usando uma busca binária. reFlutter escreve o dump na pasta raiz do aplicativo e define permissões 777 para o arquivo e a pasta. Você pode puxar o arquivo com o 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 o arquivo IPA criado após a execução do comando reflutter main.ipa. Para ver qual código é carregado através do DartVM, você precisa executar o aplicativo no dispositivo. reFlutter imprime sua saída nos logs do console no XCode com a tag reflutter.

App.framework e libapp.so dentro do arquivo zipOs motores são construídos usando reFlutter no Github Actions para construir a versão desejada, commits e hashes de snapshot são usados a partir desta tabela.
O hash do snapshot é extraído de storage.googleapis.com/flutter_infra_release/flutter/<hash>/android-arm64-release/linux-x64.zip
Se você quiser implementar seus próprios patches, a alteração manual do código Flutter é suportada usando um Docker especialmente criado
sudo docker pull ptswarm/reflutter
# Linux, Windows
EXEMPLO DE CONSTRUÇÃO 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 <desabilita a construção para arquitetura x64, use para reduzir o tempo de construção>
-e arm=0 <desabilita a construção para arquitetura arm, use para reduzir o tempo de construção>
-e WAIT=300 <quantidade de tempo em segundos que você precisa para editar o código fonte>
-e HASH_PATCH=[Snapshot_Hash] <aqui você precisa especificar o hash do snapshot que melhor corresponde à linha engine_commit da tabela enginehash.csv. É usado para a busca adequada do patch no reFlutter e para a compilação bem-sucedida>
-e COMMIT=[Engine_commit] <aqui você especifica o commit para sua versão do motor, obtenha da tabela enginehash.csv ou do repositório flutter/engine>