
블로그에서 자세히 알아보십시오 : https://swarm.ptsecurity.com/fork-bomb-for-flutter/
이 프레임 워크는 이미 컴파일되어 앱 재 포장 준비가 된 Flut 이 라이브러리에는 편리한 방식으로 동적 분석을 수행 할 수 있도록 스냅 샷 사막화 프로세스가 수정되었습니다.
주요 기능 :
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 Flut 다음으로 BurpSuite -> Listener Proxy -> Options tab
8083All interfacesTrue 지원합니다 
인증서를 설치할 필요가 없습니다. 안드로이드 장치에서는 루트 액세스가 필요하지 않습니다. 또한 Reflutter를 사용하면 플러터 인증서 고정 구현을 우회 할 수 있습니다.
결과 APK는 정렬 및 서명해야합니다. Uber-APK-Signer java -jar uber-apk-signer.jar --allowResign -a release.RE.apk 사용합니다. DARTVM을 통해로드 된 코드를 보려면 장치에서 응용 프로그램을 실행해야합니다. _kDartIsolateSnapshotInstructions (예 : 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는 reflutter 태그 Current working dir: /private/var/mobile/Containers/Data/Application/<UUID>/dump.dart 를 사용하여 Xcode 콘솔 로그에 덤프 파일 경로를 인쇄합니다. 다음에 장치에서 파일을 가져와야합니다.

덤프에서 결과 오프셋은 Frida 스크립트에서 사용할 수 있습니다.
frida -U -f <package> -l frida.js
_kDartIsolateSnapshotInstructions 에 대한 값을 얻으려면 readelf -Ws libapp.so 사용할 수 있습니다 Value 필드에 필요한 값은 어디에 있습니까?
App.framework 및 libapp.so 내부 zip 아카이브 감지를 개선하십시오 엔진은 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예제 빌드 안드로이드 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 테이블 또는 Flutter/Engine Repo에서 가져옵니다>>