
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
Burp Suite IPを入力してください: <input_ip>
SnapshotHash: 8ee4ef7a67df9845fba331734198a953
結果のapkファイル: ./release.RE.apk
apkファイルに署名してください。
impact@f:~$ reflutter main.ipa
Flutterアプリが動作するデバイスと同じネットワーク上にある、Burp Suite Proxy ServerのIPを指定する必要があります。その後、BurpSuite -> Listener Proxy -> Options タブでプロキシを設定します:
8083All interfacesTrue
Androidでは証明書のインストールやrootアクセスは不要です。reFlutterはFlutterの一部の証明書ピン留め実装をバイパスすることもできます。
⚠️ 注意: Flutterバージョン 3.24.0(スナップショットハッシュ:
80a49c7111088100a233b2ae788e1f48)以降、ハードコードされたプロキシ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 の検出を改善エンジンは GitHub Actions を使用して、enginehash.csv のデータに基づいてビルドされます。スナップショットハッシュは以下から取得されます:
https://storage.googleapis.com/flutter_infra_release/flutter/<hash>/android-arm64-release/linux-x64.zip
手動でのFlutterコードパッチ適用は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
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: エンジンのコミットハッシュ