
DEX → مُفكِّك تجميع Java بلغة Rust — تحليل سريع وتدريجي، واجهة سطر أوامر ثنائية اللغة
English | 简体中文
يقوم ddc بفكِّ تجميع بايت كود Android DEX وإعادته إلى Java قابلة للقراءة — على
مقياس التطبيقات الواقعية، وقابلة للاستعلام مثل قاعدة بيانات، ومُتحقَّق منها عبر javac:
كل ملف من الملفات البالغ عددها 909,689 التي يُنتجها عبر سبعة تطبيقات APK واقعية
يُحلَّل نحويًا دون أخطاء.
javac بـ صفر أخطاء نحوية؛ كل صنف من
زوج أسماء متغاير حالة الأحرف (X/Cua مقابل X/cua) يُحفظ
كملفه الخاص بدلًا من أن يطمس الأخير ما قبله بصمت.(a) -> …، Cls::name، a + b).str، getName() → name، سلاسل معاملات Kotlin Intrinsics) بدلًا من v12؛
تُعرض قيم IntDef الحرفية كثوابتها مباشرةً
(setVisibility(8) → View.GONE؛ جدول نطاق android-37 مدمج،
--symbols يتجاوزه)؛ تُحذف ضوضاء فحص null في Kotlin وتُضمَّن
جسور access$NNN الاصطناعية في مواضع استدعائها.DDC_LANG=zh|en تفرض اللغة؛ مع الرجوع إلى الإنجليزية).jdc-core، النواة
المحايدة للآلة المشتركة مع
jcdc.macOS (Homebrew):
brew install ejfkdev/tap/ddc
Windows (Scoop) — أضف الـ bucket مرة واحدة، ثم ثبِّت بالاسم (scoop
لا يحل صيغة user/repo/app المجردة — issue #3):
scoop bucket add ejfkdev https://github.com/ejfkdev/scoop-bucket
scoop install ddc
# or install straight from the manifest URL, no bucket needed:
scoop install https://raw.githubusercontent.com/ejfkdev/scoop-bucket/main/bucket/ddc.json
cargo-binstall (أي منصة — يجلب الملف التنفيذي الجاهز من الإصدار بدلًا من الترجمة):
cargo binstall ddc-cli
الملفات التنفيذية: كل إصدار
يوفّر ملفات تنفيذية خام (بلا أرشيفات) لـ linux-amd64، linux-arm64،
windows-amd64، windows-arm64، macos-amd64 و macos-arm64 —
إصدارات غير macOS مضغوطة بـ UPX.
من المصدر (Rust stable):
git clone https://github.com/ejfkdev/ddc && cd ddc
cargo build --release
ddc app.apk # full decompile → app-out/
ddc app.apk -c com.example.Foo # one class to stdout
ddc app.apk -o - | less # everything to stdout
ddc info app.apk # app context (label via arsc, package,
# version, md5) + per-dex counts
ddc mainactivity app.apk # entry point: package + launcher
ddc findrefs app.apk string token # every const-string "token" site
ddc getmethod app.apk Foo.toString # one method, all overloads
ddc pkg app.apk --app -o own/ # the app's own code only
الخيارات والأمثلة الكاملة: ddc --help (قائمة الأوامر الفرعية مجمَّعة حسب
سير العمل). المرجع الكامل — دلالات كل خيار، وصيغة مخرجات كل أمر فرعي
وسلوكه — موجود في
docs/cli.md (中文).
سبعة تطبيقات APK واقعية، إصدار release، متوسط 3 تشغيلات (Apple Silicon، 6P+12E). مجموعة التحقق المكوَّنة من 39 ملف APK (4.08 مليون ملف مُفكَّك التجميع، زمن الجدار لكل APK / ذروة RSS / بوابة تحليل javac) موجودة في docs/validation.md (中文).
| APK | الحجم | فك التجميع الكامل | ذروة RSS |
|---|---|---|---|
| reqable | 34 MB | 0.25s | 139 MB |
| Telegram | 62 MB | 5.64s | 1479 MB |
| 139 MB | 5.87s (99,277 ملفًا — جميع أزواج الأصناف متغايرة حالة الأحرف محفوظة) | 1116 MB | |
| 226 MB | 5.03s | 1172 MB | |
| weixin | 268 MB | 11.61s | 1339 MB |
| lark | 398 MB | 5.52s | 1831 MB |
| 374 MB | 15.92s | 2459 MB |
أوامر الاستعلام الفرعية على نفس ملفات APK (الخلايا: الوقت / ذروة RSS؛
strings -f <package> --with-locations، findrefs على سلسلة الحزمة والدالة
onCreate، hierarchy/disasm/getclass على صنف المشغِّل لكل
تطبيق):
| Command | reqable | Telegram | weixin | lark | |||
|---|---|---|---|---|---|---|---|
info | 0.12s / 40MB | 0.21s / 88MB | 0.42s / 305MB | 0.65s / 610MB | 0.79s / 550MB | 1.10s / 907MB | 1.08s / 1240MB |
listclasses | 0.04s / 21MB | 0.06s / 84MB | 0.08s / 93MB | 0.13s / 396MB | 0.21s / 417MB | 0.20s / 299MB | 0.27s / 391MB |
manifest | 0.03s / 7MB | 0.03s / 14MB | 0.02s / 20MB | 0.03s / 43MB | 0.04s / 31MB | 0.03s / 28MB | 0.03s / 47MB |
mainactivity | 0.04s / 24MB | 0.06s / 86MB | 0.08s / 224MB | 0.10s / 358MB | 0.13s / 371MB | 0.14s / 421MB | 0.21s / 554MB |
res | 0.02s / 7MB | 0.03s / 15MB | 0.03s / 22MB | 0.05s / 60MB | 0.04s / 32MB | 0.04s / 31MB | 0.05s / 53MB |
largest | 0.05s / 29MB | 0.08s / 78MB | 0.15s / 236MB | 0.31s / 500MB | 0.32s / 500MB | 0.46s / 676MB | 0.66s / 810MB |
strings | 0.05s / 24MB | 0.10s / 85MB | 0.21s / 222MB | 0.39s / 354MB | 0.45s / 395MB | 0.52s / 431MB | 0.81s / 551MB |
findrefs-string | 0.04s / 26MB | 0.05s / 70MB | 0.06s / 214MB | 0.10s / 403MB | 0.12s / 446MB | 0.07s / 335MB | 0.14s / 871MB |
findrefs-method | 0.05s / 26MB | 0.07s / 70MB | 0.07s / 219MB | 0.09s / 410MB | 0.10s / 458MB | 0.10s / 620MB | 0.15s / 896MB |
members | 0.07s / 23MB | 0.21s / 86MB | 0.62s / 222MB | 1.32s / 366MB | 1.17s / 381MB | 1.64s / 443MB | 2.66s / 572MB |
hierarchy | 0.04s / 24MB | 0.05s / 86MB | 0.09s / 212MB | 0.12s / 396MB | 0.14s / 386MB | 0.17s / 429MB | 0.22s / 548MB |
disasm | 0.04s / 23MB | 0.07s / 88MB | 0.09s / 214MB | 0.12s / 371MB | 0.13s / 392MB | 0.16s / 422MB | 0.20s / 533MB |
getclass | 0.05s / 34MB | 0.28s / 182MB | 0.14s / 357MB | 0.33s / 740MB | 0.37s / 942MB | 0.50s / 1235MB | 0.76s / 1651MB |