
Leia mais no blog: https://swarm.ptsecurity.com/fork-bomb-for-flutter/
Essa estrutura ajuda com os aplicativos Flutter em engenharia reversa usando a versão corrigida da biblioteca Flutter, que já está compilada e pronta para a reembalagem de aplicativos. Esta biblioteca possui um processo de desserialização com instantâneos modificado para permitir que você execute uma análise dinâmica de maneira conveniente.
Principais recursos:
socket.cc é corrigido para monitoramento e interceptação de tráfego;dart.cc é modificado para imprimir aulas, funções e alguns campos;Dockerfile especialmente criado # 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 Você precisa especificar o IP do seu servidor proxy do Burp Suite localizado na mesma rede em que o dispositivo com o aplicativo Flutter está. Em seguida, você deve configurar o proxy no BurpSuite -> Listener Proxy -> Options tab
8083All interfacesTrue 
Você não precisa instalar nenhum certificado. Em um dispositivo Android, você também não precisa de acesso root. O Reflutter também permite ignorar algumas das implementações de fixação do certificado de vibração.
O apk resultante deve ser alinhado e assinado. Eu uso 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 que _kDartIsolateSnapshotInstructions (Ex. 0xb000) é igual ao uso de uma pesquisa binária. O Reflutter grava o despejo na pasta raiz do aplicativo e define 777 permissões para o arquivo e a pasta. Você pode puxar o arquivo com 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. O reflexo imprimirá o caminho do arquivo de despejo para os logs do console do Xcode com a tag de reflexo Current working dir: /private/var/mobile/Containers/Data/Application/<UUID>/dump.dart Em seguida, você precisará puxar o arquivo do dispositivo

O deslocamento resultante do despejo pode ser usado no script FRIDA
frida -U -f <package> -l frida.js
Para obter valor para _kDartIsolateSnapshotInstructions , você pode usar readelf -Ws libapp.so onde é o valor que você precisa no campo Value
App.framework e libapp.so Os motores são construídos usando o reflexo nas ações do GitHub para criar a versão desejada, comissões e hashes instantâneos são usados a partir desta tabela. O hash do instantâneo é extraído do storage.googleapis.com/flutter_infra_release/flutter/<hash>/android-arm64-release/linux-x64.zip

Se você deseja implementar seus próprios patches, a alteração manual do código de vibração é suportada usando o Docker especialmente criado
git clone https://github.com/Impact-I/reFlutter && cd reFlutter
docker build -t reflutter -f Dockerfile .Comando de construção:
docker run -it -v " $( pwd ) :/t " -e HASH_PATCH= < Snapshot_Hash > -e COMMIT= < Engine_commit > reflutterExemplo:
docker run -it -v " $( pwd ) :/t " -e HASH_PATCH=aa64af18e7d086041ac127cc4bc50c5e -e COMMIT=d44b5a94c976fbb65815374f61ab5392a220b084 reflutterExemplo 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 Bandeiras:
-e x64 = 0 <desabilita a construção da arquitetura x64, use para reduzir o tempo de construção>
-e ARM64 = 0 <Desativa a construção da arquitetura ARM64, use para reduzir o tempo de construção>
-e braço = 0 <desabilita a construção da arquitetura ARM32, use para reduzir o tempo de construção>
-e espera = 300
-e hash_patch = [snapshot_hash]
-e commit = [Engine_Commit] <Aqui você especifica o Commit para a versão do seu mecanismo, pegue -o da tabela Enginehash.csv ou de Flutter/Motor Repo>