
يقوم بتصحيح مكتبات محرك 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
الخيارات:
-p, --patch-dump — وضع التفريغ (dump): تصحيح المحرك لإصدار dump.dart (الفئات/الدوال/الإزاحات) عند البدء، وطباعة تلميح frida.js بدلاً من تعليمات الوسيط (proxy).-n, --no-interact — عدم طلب إدخال Burp IP أبدًا (يفترض 127.0.0.1)؛ مفيد للمحركات القديمة في CI.-b <Snapshot_Hash>, --build-engine — وضع بناء المحرك: طباعة commit المحرك لـ snapshot hash و(عند التشغيل داخل نسخة flutter/flutter) تطبيق تصحيحات مصدر reFlutter. راجع scripts/local-release.تحتاج إلى تحديد عنوان IP الخاص بخادم Burp Suite Proxy الموجود على نفس الشبكة التي يتصل بها الجهاز الذي يعمل عليه تطبيق Flutter. ثم قم بتهيئة الـ Proxy في BurpSuite -> Listener Proxy -> Options tab:
8083All interfacesTrue
لا يلزم تثبيت شهادة أو صلاحيات root على Android. كما يسمح reFlutter بتجاوز بعض تطبيقات تثبيت شهادات Flutter (certificate pinning).
⚠️ ملاحظة: المحركات حتى Flutter 3.24.x (snapshot hash
80a49c7111088100a233b2ae788e1f48) وما قبلها لا تزال تحمل عنوان IP الخاص بالبروكسي المُضمّن ويتم تصحيحها في مكانها. بدءًا من 3.27.x اختفى عنوان IP المُضمّن — قم بتهيئة البروكسي مباشرة على الجهاز بدلاً من ذلك.
استخدم ADB لتهيئة بروكسي الجهاز:
adb -s <device> shell "settings put global http_proxy <proxy_ip:port>"
قم بتوقيع الـ APK ومحاذاته وتثبيته. اختياريًا، قم بتهيئة TunProxy لتوجيه حركة المرور عبر Burp Suite.
قم بتوقيع الـ IPA وتثبيته. قم بتهيئة Potatso لاستخدام خادم Burp Suite Proxy الخاص بك.
يجب محاذاة الـ 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يتم بناء المحركات باستخدام scripts/local-release (macOS؛ يبني v2 + v3 لـ iOS و Android arm64/arm/x64، ويتحقق من تطبيق كل تصحيح، ويرفع أصول الإصدار) بناءً على البيانات في enginehash.csv. يتم تحديد commit المحرك لـ snapshot hash عبر reflutter -b <Snapshot_Hash>. يتم استرجاع snapshot hash من:
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: snapshot hash من enginehash.csv-e COMMIT: hash الخاص بـ commit المحرك