
在博客上了解更多信息: https://swarm.ptsecurity.com/fork-bomb-for-flutter/
該框架有助於使用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您需要指定位於帶有Flutter應用程序設備的同一網絡中的Burp Suite代理服務器的IP。接下來,您應該在BurpSuite -> Listener Proxy -> Options tab中配置代理
8083All interfacesTrue 
您無需安裝任何證書。在Android設備上,您也不需要root訪問。回流還允許繞過一些撲朔迷離的證書固定實現。
結果APK必須對齊並簽名。我使用Uber-apk-Signer java -jar uber-apk-signer.jar --allowResign -a release.RE.apk 。要查看通過DARTVM加載哪個代碼,您需要在設備上運行該應用程序。請注意,您必須手動查找_kDartIsolateSnapshotInstructions (例如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
}
}使用在reflutter main.ipa命令執行後創建的IPA文件。要查看通過DARTVM加載哪個代碼,您需要在設備上運行該應用程序。回流將使用回流標籤登錄到Xcode Console logs Current working dir: /private/var/mobile/Containers/Data/Application/<UUID>/dump.dart接下來,您需要從設備中拉出文件,

垃圾場的結果偏移可用於Frida腳本
frida -U -f <package> -l frida.js
Value獲得_kDartIsolateSnapshotInstructions readelf -Ws libapp.so值
App.framework和libapp.so內部郵政編碼的檢測這些發動機是使用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架構的建築物,用於減少建築時間>
-e等待= 300
-e hash_patch = [snapshot_hash]
-e commits = [Engine_commit] <在此處指定引擎版本的提交,從Enginhash.csv表或Flutter/Engine Repo>