
محلل لقطة Dart AOT قائم على الإعدادات يُصدّر رموزًا وبنى متوافقة مع blutter لـ IDA وradare2 وFrida، ويفكّ تجميع الدوال إلى Dart نظيف قابل للتحليل دون الحاجة إلى Dart SDK.
محلل لقطة Dart AOT المُدار بالإعدادات ومُصدِّر معلومات التصحيح. لا يحتاج إلى Dart SDK، ولا يشغّل الهدف أبدًا: يحدد موقع اللقطة المضمّنة داخل Mach-O / ELF / PE، ويصدّر نفس الرموز والبنى التي يصدّرها blutter لـ IDA / radare2 / Frida (مع أربعة تصحيحات متعمدة حيث كان المرجع الذي نُقل عنه خاطئًا — انظر
src/export/mod.rs)، ويفكّ ترجمة الدوال إلى Dart يقبلهdart analyze. يغطي إصدارات سطح المكتب و الأجهزة المحمولة الحقيقية (المؤشرات المضغوطة).
يعمل على أي أثر Dart AOT — إصدارات Flutter النهائية، dart compile exe، dart compile aot-snapshot (لقطات عنقودية Dart 2.7+).
مكتفٍ ذاتيًا ويكتشف تلقائيًا — جميع ملفات تعريف SDK الـ 26 بالإضافة إلى 21 متغيرًا للمؤشرات المضغوطة مضمّنة؛ يُطابَق إصدار Dart عبر تجزئة اللقطة والمتغير (compressed-pointers، أي كل إصدار Flutter للأجهزة المحمولة) من سلسلة الميزات الخاصة باللقطة نفسها، مع آلية احتياطية بالفحص البنيوي لإصدارات Flutter-engine/المخصصة. تم التحقق منه مقابل تطبيقات حقيقية مُصدَّرة، وليس فقط إصداراتنا:
dart analyze (95.9% و91.1% مُهيكل).dart analyze 0 أخطاء.material_3_demo (5 107 سطرًا) و
animations (2 108 أسطر): 15 796 و11 102 دالة، كلاهما 92.5% مُهيكل، وكلاهما
dart analyze 0 أخطاء. ولأن المصدر معروف، تُفحص مقابله:
يُستعاد 98.8% و100% من الأصناف/المزائج/التعدادات العامة المُعلنة في lib/، ويظهر 95.4% و
97.4% من سلاسل النصوص الحرفية الخاصة به في المخرجات، وتُقابل 18/18 و21/23 من ملفات المصدر
مكتبةً مُستعادة. يؤكد tests/app_truth.rs تلك النسب (الحد الأدنى 0.90) حتى لا تتلف السلسلة بصمت.يفكّ إلى Dart صالح — رفع → CFG → إخراج مُهيكل، وليس تفريغًا للتفكيك: حلقات،
if/else، break/continue، قيم حرفية من مجمّع الكائنات مُضمّنة عند موقع تحميلها، أسماء حقول مُستعادة كتعليقات إسناد. عبر 26 أثرًا (291 ملفًا، 24 253 دالة) يُحلَّل الإخراج
بـ 0 أخطاء dart analyze، وعلى التطبيقات الحقيقية يصمد أيضًا — Lark 3.6.1 عند 95.9%
مُهيكل وWeibo 2.19.6 عند 91.1% (19 053 دالة، 1.53 مليون عبارة)، كلاهما بلا أخطاء.
يحتفظ تدفق التحكم غير القابل للاختزال بـ gotoLabel صريح وترويسة NOTE بدلًا من تسطيحه
بصمت. انظر المفكّك.
سريع — كل القياسات بثنائي هذا الإصدار: عيّنة Flutter بحجم 9 ميغابايت على macOS تُصدَّر في
0.26 ثانية؛ يستغرق --decompile 1.5 ثانية على Lark (25.6 ميغابايت Android، 25 183 دالة)، و1.2 ثانية على
material_3_demo (14 ميغابايت macOS، 15 796 دالة) و1.7 ثانية على Weibo (9 ميغابايت Android،
19 053 دالة مفكوكة / 1.63 مليون عبارة)، عند ذروة ذاكرة 172–263 ميغابايت. هذا أسرع بنحو 89×
من v0.1.7 على نفس الأثر (106.8 ثانية → 1.20 ثانية) — بفضل عدم إعادة بناء البيانات الثابتة عبر التشغيل
لكل دالة، وبثّ الآثار إلى القرص بدلًا من تخزينها مؤقتًا، وتصيير
505 مكتبات على التوازي؛ وليس بفضل خوارزمية أسرع. المسار المتوازي مطابق بايت ببايت للمسار
التسلسلي (diff -rq عبر 1011 ملفًا)، لأن أسماء الملفات و«أي مكتبة تُصدر كل نقطة دخول» كلاهما
يُحدَّد في تمريرة تمهيدية تسلسلية قبل بدء أي تصيير.
واجهة سطر أوامر ثنائية اللغة — اللغة الصينية تطبع بالصينية، وكل ما عداها بالإنجليزية؛ تجاوزها بـ DAE_LANG=zh|en.
مفكّك متوازٍ — تُصيَّر المكتبات الـ 505 تقريبًا بالتزامن (افتراضيًا n_threads()،
أي عدد الأنوية بحد أقصى 8)؛ تجاوزه بـ DAE_DEC_THREADS=N. الإخراج مطابق بايت ببايت عند أي
إعداد، لأن أسماء الملفات و«أي مكتبة تُصدر كل نقطة دخول» يُحدَّدان في تمريرة تمهيدية تسلسلية أولًا. بعد 8 خيوط يصبح أبطأ ويستهلك ذاكرة أكثر على جهاز Mac بـ 6P+12E-core، لذا فالسقف هو
النقطة المثلى، وليس قيدًا. يطبع DART_AOT_PROF=1 تفصيلًا لكل مرحلة — لاحظ أن نسبه المئوية قد تتجاوز 100% لأن المراحل هي وقت CPU مجموعًا عبر الخيوط.
الوضع التدريجي — 20 أمرًا فرعيًا لاستعلام اللقطة كقاعدة بيانات (libs، classes،
functions، members، strings، findrefs، callers، callees، pp، objs، stubs، ...)
ثم فكّ شيء واحد بالضبط (getclass / getmethod / getlib / decompile --app).
تُجيب الاستعلامات في 15–30 مللي ثانية على مجموعة صغيرة و43–311 مللي ثانية على تطبيق بـ 15,796 دالة؛ والتصدير الكامل لذلك التطبيق يستغرق 0.55 ثانية، أو ~1.4 ثانية مع --decompile (~1000 ملف). مخرجات كل أمر قابلة للّصق في الأمر التالي.
انظر الوضع التدريجي.
لا يتطلب سلسلة أدوات — ثنائي واحد مكتفٍ ذاتيًا: لا Dart SDK، ولا تثبيت Flutter، والهدف لا يُنفَّذ أبدًا، بل يُحلَّل فقط. تحليل Mach-O/ELF/PE وجميع ملفات التعريف الـ 47 مدمجة.
| الطريقة | الأمر |
|---|---|
| Homebrew (macOS) | brew install ejfkdev/tap/dae |
| cargo | cargo install dae-rs |
| جاهز مسبقًا | ثنائي من الإصدارات — Windows/macOS/Linux × x64/arm64 |
| من المصدر | cargo build --release |
ثنائيات macOS الجاهزة مسبقًا موقّعة توقيعًا مخصصًا؛ إذا منع Gatekeeper التشغيل الأول: xattr -dr com.apple.quarantine dae.
(حزمة crates.io هي dae-rs لأن dae كان محجوزًا؛ أما المستودع والمكتبة والثنائي فتبقى جميعها dae.)
dae <out_dir> # auto-detect the Dart version dae export <out_dir> # same thing, explicit verb dae <out_dir> --sdk-profile P.json # or force one dae <out_dir> --app --decompile # app-side code only (drops dart: and package:flutter)
dae help # every subcommand, grouped dae help findrefs # one command's options and output columns dae decompile | less # whole app's pseudocode to stdout
## الميزات الرئيسية
- **اكتشاف تلقائي**: يكتشف تلقائيًا جميع ملفات `.md` في الدليل المحدد
- **دعم متعدد اللغات**: يدعم الترجمة بين أي لغتين تدعمهما Google Translate
- **معالجة ذكية**: يحافظ على تنسيق Markdown، وكتل الكود، والروابط، والصور
- **معالجة متوازية**: يستخدم تعدد الخيوط لتسريع الترجمة
- **التخزين المؤقت**: يتجنب إعادة ترجمة النصوص المتطابقة
- **معالجة الأخطاء**: إعادة محاولة تلقائية مع التراجع الأسي
- **تخطيط التقدم**: تتبع مرئي لتقدم الترجمة
- **واجهة سطر أوامر مرنة**: خيارات متعددة لتخصيص سلوك الترجمة
## التثبيت
### المتطلبات الأساسية
- Python 3.7 أو أحدث
- pip (مدير حزم Python)
### الخطوات