
يقوم بتصحيح مكتبات محرك Flutter لتمكين هندسة عكسية أثناء التشغيل، واعتراض حركة المرور، وتجاوز تثبيت SSL لتطبيقات Android وiOS بدون جذر أو تثبيت شهادة.

اقرأ المزيد على المدونة: https://swarm.ptsecurity.com/fork-bomb-for-flutter/
يساعد هذا الإطار في الهندسة العكسية لتطبيقات Flutter باستخدام نسخة معدلة من مكتبة Flutter التي تم تجميعها مسبقًا وجاهزة لإعادة تعبئة التطبيق. تم تعديل عملية إلغاء تسلسل اللقطة (snapshot deserialization) في هذه المكتبة للسماح لك بإجراء تحليل ديناميكي بطريقة مريحة.
الميزات الرئيسية:
socket.cc لمراقبة واعتراض حركة المرور؛dart.cc لطباعة الفئات والدوال وبعض الحقول؛Dockerfile مصمم خصيصًا.# Linux, Windows, MacOS
pip3 install reflutter==0.8.6
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
impact@f:~$ reflutter main.ipa
تحتاج إلى تحديد IP لخادم Burp Suite Proxy الموجود في نفس الشبكة التي يوجد بها جهاز تطبيق Flutter. ثم قم بتكوين الوكيل في BurpSuite -> Listener Proxy -> Options tab:
8083All interfacesTrue
لا يلزم تثبيت شهادة أو وصول الجذر لنظام Android. يسمح reFlutter أيضًا بتجاوز بعض تطبيقات تثبيت الشهادات في Flutter.
⚠️ ملاحظة: بدءًا من إصدار Flutter 3.24.0 (تجزئة اللقطة:
80a49c7111088100a233b2ae788e1f48)، تمت إزالة عنوان IP والمنفذ الثابتين للوكيل. الآن تحتاج إلى تكوين وكيلك مباشرة على الجهاز.
استخدم ADB لتكوين وكيل الجهاز:
adb -s <device> shell "settings put global http_proxy <proxy_ip:port>"
قم بتوقيع وتوجيه وتثبيت APK. اختياريًا، قم بتكوين TunProxy لتوجيه حركة المرور عبر Burp Suite.
قم بتوقيع وتثبيت IPA. قم بتكوين Potatso لاستخدام خادم الوكيل Burp Suite.
يجب محاذاة وتوقيع ملف apk الناتج. الأداة الموصى بها هي uber-apk-signer:
java -jar uber-apk-signer.jar --allowResign -a release.RE.apk
قم بتشغيل التطبيق على جهاز. حدد _kDartIsolateSnapshotInstructions عبر البحث الثنائي. يكتب reFlutter ملف التفريغ إلى المجلد الجذر للتطبيق ويضبط أذونات 777. استرجعه باستخدام:
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/ ;
...
بعد تشغيل reflutter main.ipa، قم بتشغيل التطبيق على الجهاز. يتم طباعة مسار ملف التفريغ إلى سجلات وحدة تحكم Xcode:
Current working dir: /private/var/mobile/Containers/Data/Application/<UUID>/dump.dart
استرجع الملف من الجهاز.

frida-tools==13.7.1
frida==16.7.19
استخدم إزاحات التفريغ في البرنامج النصي لـ Frida:
frida -U -f <package> -l frida.js
للعثور على _kDartIsolateSnapshotInstructions:
readelf -Ws libapp.so
ابحث عن حقل Value.
App.framework و libapp.so داخل أرشيف zipيتم بناء المحركات باستخدام GitHub Actions بناءً على البيانات في enginehash.csv. يتم استرجاع تجزئة اللقطة من:
https://storage.googleapis.com/flutter_infra_release/flutter/<hash>/android-arm64-release/linux-x64.zip
التصحيح اليدوي لرمز Flutter مدعوم باستخدام 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
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: تجزئة اللقطة من enginehash.csv-e COMMIT: تجزئة إصدار المحرك