
Flutterエンジンライブラリにパッチを適用し、ルートや証明書のインストールなしでAndroidおよびiOSアプリのランタイムリバースエンジニアリング、トラフィック傍受、SSLピンバイパスを可能にします。

ブログで詳しく読む: https://swarm.ptsecurity.com/fork-bomb-for-flutter/
このフレームワークは、すでにコンパイル済みでアプリの再パッケージングに対応したパッチ適用版 Flutter ライブラリを使用して、Flutter アプリのリバースエンジニアリングを支援します。このライブラリはスナップショットのデシリアライズ処理が変更されており、動的解析を便利な方法で実行できます。
主な機能:
socket.cc はトラフィックの監視と傍受のためにパッチが適用されています;dart.cc はクラス、関数、一部のフィールドを出力するように変更されています;Dockerfile を使用して手動での Flutter コード変更がサポートされています。# 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
オプション:
-p, --patch-dump — ダンプモード: 起動時に dump.dart (クラス/メソッド/オフセット) を出力するようにエンジンにパッチを適用し、プロキシの手順の代わりに frida.js のヒントを表示します。-n, --no-interact — Burp IP の入力を一切求めません (127.0.0.1 を暗黙的に使用); CI での古いエンジンに便利です。-b <Snapshot_Hash>, --build-engine — エンジンビルドモード: スナップショットハッシュに対応するエンジンコミットを表示し、(flutter/flutter チェックアウト内で実行した場合) reFlutter のソースパッチを適用します。scripts/local-release を参照してください。Flutter アプリケーションを実行しているデバイスと同じネットワーク上にある Burp Suite プロキシサーバーの IP を指定する必要があります。次に BurpSuite -> Listener Proxy -> Options tab でプロキシを設定します:
8083All interfacesTrue
Android では証明書のインストールや root 権限は不要です。reFlutter は Flutter の証明書ピンニング実装の一部をバイパスすることもできます。
⚠️ 注意: Flutter 3.24.x (スナップショットハッシュ
80a49c7111088100a233b2ae788e1f48) までのエンジンは、ハードコードされたプロキシ IP を依然として保持しており、その場でパッチが適用されます。3.27.x 以降ではハードコードされた IP は削除されているため、代わりにデバイス上で直接プロキシを設定してください。
ADB を使用してデバイスのプロキシを設定します:
adb -s <device> shell "settings put global http_proxy <proxy_ip:port>"
APK に署名、アライメント、インストールします。オプションで TunProxy を設定してトラフィックを Burp Suite 経由でルーティングします。
IPA に署名してインストールします。Potatso を設定して Burp Suite プロキシサーバーを使用します。
生成された apk はアライメントと署名を行う必要があります。推奨ツールは uber-apk-signer です:
java -jar uber-apk-signer.jar --allowResign -a release.RE.apk
デバイスでアプリを実行します。バイナリ検索で _kDartIsolateSnapshotInstructions を特定します。reFlutter はダンプファイルをアプリのルートフォルダに書き込み、777 パーミッションを設定します。次のコマンドで取得します:
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/ ;
...
reflutter main.ipa を実行した後、デバイスでアプリを実行します。ダンプファイルのパスは Xcode コンソールログに出力されます:
Current working dir: /private/var/mobile/Containers/Data/Application/<UUID>/dump.dart
デバイスからファイルを取得します。

frida-tools==13.7.1
frida==16.7.19
Frida スクリプト でダンプオフセットを使用します:
frida -U -f <package> -l frida.js
_kDartIsolateSnapshotInstructions を見つけるには:
readelf -Ws libapp.so
Value フィールドを探します。
App.framework と libapp.so の検出を改善するエンジンは enginehash.csv のデータに基づき、scripts/local-release (macOS; iOS および Android arm64/arm/x64 用の v2 + v3 をビルドし、すべてのパッチが適用されたことを検証し、リリースアセットをアップロードします) でビルドされます。スナップショットハッシュに対応するエンジンコミットは reflutter -b <Snapshot_Hash> で解決されます。スナップショットハッシュは次から取得します:
https://storage.googleapis.com/flutter_infra_release/flutter/<hash>/android-arm64-release/linux-x64.zip
Docker を使用して手動での Flutter コードパッチ適用がサポートされています:
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
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 ビルドを無効化-e WAIT=300: ビルド前にソースを変更する時間 (秒)-e HASH_PATCH: enginehash.csv のスナップショットハッシュ-e COMMIT: エンジンコミットハッシュ