
詳細については、ブログ: https://swarm.ptsecurity.com/fork-for-flutter/
このフレームワークは、既にコンパイルされ、アプリの再パッキングの準備が整っているフラッターライブラリのパッチ付きバージョンを使用して、フラッターアプリのリバースエンジニアリングに役立ちます。このライブラリには、便利な方法で動的な分析を実行できるように変更されたスナップショットの敏arialialializationプロセスがあります。
主な機能:
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を指定する必要があります。次に、 BurpSuite -> Listener Proxy -> Options tabでプロキシを構成する必要があります
8083All interfacesTrueをサポートします
証明書をインストールする必要はありません。 Androidデバイスでは、ルートアクセスも必要ありません。 Reflutterでは、実装をピン留めするフラッター証明書の一部をバイパスすることもできます。
結果のAPKを調整して署名する必要があります。 Uber-APK-Signer java -jar uber-apk-signer.jar --allowResign -a release.RE.apkを使用します。 DARTVMを介してどのコードがロードされているかを確認するには、デバイスでアプリケーションを実行する必要があります。 _kDartIsolateSnapshotInstructions (ex。0xb000)は、バイナリ検索の使用に等しいものを手動で見つける必要があることに注意してください。 Reflutterは、アプリケーションのルートフォルダーにダンプを書き込み、ファイルとフォルダーに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
}
}reflutter main.ipaコマンドの実行後に作成されたIPAファイルを使用します。 DARTVMを介してどのコードがロードされているかを確認するには、デバイスでアプリケーションを実行する必要があります。 Reflutterは、XcodeコンソールログへのダンプファイルパスをReflutterタグで印刷します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の検出を改善しますエンジンは、GitHubアクションのReflutterを使用して構築され、目的のバージョンを構築し、CommitsとSnapshotハッシュをこのテーブルから使用します。スナップショットのハッシュは、 storage.googleapis.com/flutter_infra_release/flutter/<hash>/android-arm64-release/linux-x64.zip /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アーキテクチャ用の建物を無効にし、建物時間を短縮するために使用します>
-e wait = 300
-e hash_patch = [snapshot_hash]
-e commit = [engine_commit] <ここでは、エンジンバージョンにコミットを指定し、enginehash.csvテーブルまたはフラッター/エンジンレポ>から取得します>