
إطار عمل للهندسة العكسية لـ Flutter

يساعد هذا الإطار في هندسة عكسية لتطبيقات Flutter باستخدام نسخة معدلة من مكتبة Flutter التي تم تجميعها مسبقًا وجاهزة لإعادة حزم التطبيق. تم تعديل عملية إلغاء تسلسل اللقطات في هذه المكتبة للسماح لك بإجراء تحليل ديناميكي بطريقة مريحة.
الميزات الرئيسية:
socket.cc لمراقبة واعتراض حركة المرور؛dart.cc لطباعة الفئات والوظائف وبعض الحقول؛Dockerfile مصمم خصيصًا.# Linux, Windows, MacOS
pip3 install reflutter
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 لخادم Burp Suite Proxy الموجود في نفس الشبكة حيث الجهاز الذي يحتوي على تطبيق Flutter. بعد ذلك، قم بتكوين الـ Proxy في BurpSuite -> Listener Proxy -> Options tab
8083All interfacesTrue
لا تحتاج إلى تثبيت أي شهادات. على جهاز Android، لا تحتاج أيضًا إلى صلاحيات الجذر. يسمح reFlutter أيضًا بتجاوز بعض تطبيقات تثبيت الشهادة في Flutter.
يجب محاذاة ملف 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.

App.framework و libapp.so داخل أرشيف zipيتم بناء المحركات باستخدام reFlutter في Github Actions لبناء الإصدار المطلوب، يتم استخدام الالتزامات و hashes اللقطات من هذا الجدول.
يتم استخراج تجزئة اللقطة من storage.googleapis.com/flutter_infra_release/flutter/<hash>/android-arm64-release/linux-x64.zip
إذا كنت ترغب في تنفيذ تعديلاتك الخاصة، فإن تغيير كود Flutter يدويًا مدعوم باستخدام Docker مصمم خصيصًا
sudo docker pull ptswarm/reflutter
# Linux, Windows
EXAMPLE BUILD ANDROID ARM64:
sudo docker run -e WAIT=300 -e x64=0 -e arm=0 -e HASH_PATCH=<Snapshot_Hash> -e COMMIT=<Engine_commit> --rm -iv${PWD}:/t ptswarm/reflutter
FLAGS:
-e x64=0 <disables building for x64 archiitechture, use to reduce building time>
-e arm=0 <disables building for arm archiitechture, use to reduce building time>
-e WAIT=300 <the amount of time in seconds you need to edit source code>
-e HASH_PATCH=[Snapshot_Hash] <here you need to specify snapshot hash which matches the engine_commit line of enginehash.csv table best. It is used for proper patch search in reFlutter and for successfull compilation>
-e COMMIT=[Engine_commit] <here you specify commit for your engine version, take it from enginehash.csv table or from flutter/engine repo>```