
Подробнее в блоге: https://swarm.ptsecurity.com/fork-bomb-for-flutter/
Эта структура помогает с приложениями Flutter Apps, используя исправленную версию библиотеки Flutter, которая уже скомпилирована и готова к переупаковке приложений. Эта библиотека имеет моментальный процесс детериализации, измененный, чтобы позволить вам удобно выполнять динамический анализ.
Ключевые функции:
socket.cc исправлен для мониторинга и перехвата трафика;dart.cc изменяется на классы печати, функции и некоторые поля;Dockerfile # 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 Вам необходимо указать IP -интерфейс вашего прокси -сервера Burp Suite, расположенного в той же сети, где находится устройство с приложением Flutter. Далее вы должны настроить прокси в BurpSuite -> Listener Proxy -> Options tab
8083All interfacesTrue 
Вам не нужно устанавливать никакие сертификаты. На устройстве Android вам также не нужен корень. Чертатор также позволяет обойти некоторые реализации закрепления сертификата Flutter.
Полученный APK должен быть выровнен и подписан. Я использую Uber-APK-Signer java -jar uber-apk-signer.jar --allowResign -a release.RE.apk . Чтобы увидеть, какой код загружен через DartVM, вам необходимо запустить приложение на устройстве. Обратите внимание, что вы должны вручную найти то, что _kDartIsolateSnapshotInstructions (Ex. 0xb000) равно использованию двоичного поиска. Чертутерный перевод записывает дамп в корневую папку приложения и устанавливает 777 разрешений на файл и папку. Вы можете потянуть файл с помощью команды 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
}
} Используйте файл IPA, созданный после выполнения команды reflutter main.ipa . Чтобы увидеть, какой код загружен через DartVM, вам необходимо запустить приложение на устройстве. Чертатор будет распечатать путь к файлу дампа в журналы консоли Xcode с тегом тега COUMLUTER CURMENT Current working dir: /private/var/mobile/Containers/Data/Application/<UUID>/dump.dart

Полученное смещение с дампа может использоваться в сценарии FRIDA
frida -U -f <package> -l frida.js
Чтобы получить ценность для _kDartIsolateSnapshotInstructions , вы можете использовать readelf -Ws libapp.so Так, где есть значение, которое вам нужно в поле Value
App.framework и libapp.so Внутри Zip Archive Двигатели строятся с использованием COUMLUTER в действиях GitHub для создания желаемой версии, коммиты и хэши снимков используются из этой таблицы. Хэш снимка извлечен из storage.googleapis.com/flutter_infra_release/flutter/<hash>/android-arm64-release/linux-x64.zip

Если вы хотите внедрить свои собственные патчи, изменение кода ручного кода поддерживается с использованием специально разработанного Docker
git clone https://github.com/Impact-I/reFlutter && cd reFlutter
docker build -t reflutter -f Dockerfile .Команда сборки:
docker run -it -v " $( pwd ) :/t " -e HASH_PATCH= < Snapshot_Hash > -e COMMIT= < Engine_commit > reflutterПример:
docker run -it -v " $( pwd ) :/t " -e HASH_PATCH=aa64af18e7d086041ac127cc4bc50c5e -e COMMIT=d44b5a94c976fbb65815374f61ab5392a220b084 reflutterПример сборки 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 Флаги:
-e x64 = 0 <отключение здания для архитектуры x64, используйте для сокращения времени строительства>
-e ARM64 = 0 <отключение здания для архитектуры ARM64, используйте для сокращения времени здания>
-e ARM = 0 <отключение здания для архитектуры ARM32, используйте для сокращения времени здания>
-Е подождите = 300
-e hash_patch = [snapshot_hash]
-e Commit = [ENGINE_COMMIT] <Здесь вы указали Commit для вашей версии двигателя, возьмите его из таблицы ingineHash.csv или из Flutter/Engine Repo>