
اقرأ المزيد على المدونة: https://swarm.ptsecurity.com/fork-bomb-for-flutter/
يساعد هذا الإطار في تطبيقات Flutter Apps Engineering باستخدام الإصدار المصحح من مكتبة 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 تحتاج إلى تحديد عنوان IP لخادم Prop Proxy Burp Suite الموجود في نفس الشبكة حيث يوجد الجهاز مع تطبيق Flutter. بعد ذلك ، يجب عليك تكوين الوكيل في 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 (على سبيل المثال. 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
}
} استخدم ملف IPA الذي تم إنشاؤه بعد تنفيذ أمر reflutter main.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 داخل أرشيف الرمز البريدي تم تصميم المحركات باستخدام Reflutter في إجراءات 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 ، استخدم لتقليل وقت البناء>
-ك انتظر = 300
-e hash_patch = [snapshot_hash]
-e الالتزام = [earch_commit] <هنا يمكنك تحديد الالتزام بإصدار المحرك الخاص بك ، أو خذه من جدول enginehash.csv أو من رفرف/محرك repo>