
Config-संचालित Dart AOT स्नैपशॉट विश्लेषक जो IDA, radare2 और Frida के लिए blutter-संगत प्रतीकों और संरचनाओं को निर्यात करता है, और Dart SDK के बिना फ़ंक्शनों को dart-analyze-clean Dart में डीकंपाइल करता है।
कॉन्फ़िग-चालित Dart AOT स्नैपशॉट विश्लेषक और डीबग-जानकारी निर्यातक। किसी Dart SDK की आवश्यकता नहीं, लक्ष्य को कभी नहीं चलाता: Mach-O / ELF / PE के भीतर एम्बेडेड स्नैपशॉट का पता लगाता है, IDA / radare2 / Frida के लिए blutter के समान सिंबल और स्ट्रक्चर निर्यात करता है (चार जानबूझकर किए गए सुधारों के साथ जहाँ जिस संदर्भ से इसे पोर्ट किया गया था वह गलत था — देखें
src/export/mod.rs), और फ़ंक्शन्स को Dart में डीकंपाइल करता है जिसेdart analyzeस्वीकार करता है। डेस्कटॉप और वास्तविक-डिवाइस मोबाइल (कंप्रेस्ड-पॉइंटर) बिल्ड्स दोनों को कवर करता है।
किसी भी Dart AOT आर्टिफैक्ट पर काम करता है — Flutter रिलीज़ बिल्ड्स, dart compile exe, dart compile aot-snapshot (Dart 2.7+ क्लस्टर स्नैपशॉट)।
स्व-निहित और स्वतः-पहचान करने वाला — सभी 26 SDK प्रोफ़ाइल्स और 21 कंप्रेस्ड-पॉइंटर वेरिएंट्स एम्बेडेड हैं; Dart संस्करण का मिलान स्नैपशॉट हैश द्वारा और वेरिएंट (compressed-pointers, यानी हर मोबाइल Flutter बिल्ड) का मिलान स्नैपशॉट के स्वयं के फ़ीचर्स स्ट्रिंग से किया जाता है, कस्टम/Flutter-इंजन बिल्ड्स के लिए एक संरचनात्मक-प्रोब फ़ॉलबैक के साथ। केवल हमारे स्वयं के बिल्ड्स पर नहीं, बल्कि वास्तविक शिपिंग ऐप्स पर सत्यापित:
dart analyze-स्वच्छ Dart में डीकंपाइल होते हैं (95.9% और 91.1% संरचित)।dart analyze 0 त्रुटियाँ।material_3_demo (5 107 पंक्तियाँ) और
animations (2 108 पंक्तियाँ): 15 796 और 11 102 फ़ंक्शन्स, दोनों 92.5% संरचित, दोनों
dart analyze 0 त्रुटियाँ। चूँकि स्रोत ज्ञात है, इन्हें इसके विरुद्ध जाँचा जाता है:
lib/ में घोषित सार्वजनिक क्लासेस/मिक्सिन्स/एनम्स के 98.8% और 100% पुनर्प्राप्त होते हैं, इसके स्ट्रिंग
लिटरल्स के 95.4% और 97.4% आउटपुट में दिखाई देते हैं, और 18/18 और 21/23 स्रोत फ़ाइलें एक
पुनर्प्राप्त लाइब्रेरी से मैप होती हैं। tests/app_truth.rs उन अनुपातों पर दावा करता है (न्यूनतम 0.90) ताकि श्रृंखला
चुपचाप क्षय न हो।वैध Dart में डीकंपाइल करता है — lift → 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 M स्टेटमेंट्स), दोनों त्रुटि-मुक्त।
अपरिवर्तनीय कंट्रोल फ़्लो एक स्पष्ट gotoLabel और एक NOTE हेडर रखता है बजाय चुपचाप समतल किए जाने के। देखें डीकंपाइलर।
तेज़ — सभी इस रिलीज़ के बाइनरी से मापे गए: एक 9 MB macOS Flutter सैंपल 0.26 s में निर्यात होता है;
--decompile Lark पर 1.5 s लेता है (25.6 MB Android, 25 183 फ़ंक्शन्स), material_3_demo पर 1.2 s
(14 MB macOS, 15 796 फ़ंक्शन्स) और Weibo पर 1.7 s (9 MB Android,
19 053 डीकंपाइल्ड फ़ंक्शन्स / 1.63 M स्टेटमेंट्स), 172–263 MB पीक RSS पर। यह उसी आर्टिफैक्ट पर
v0.1.7 से ~89× तेज़ है (106.8 s → 1.20 s) — प्रति फ़ंक्शन रन-इनवेरिएंट डेटा को फिर से न बनाने से,
आर्टिफैक्ट्स को बफ़र करने के बजाय डिस्क पर स्ट्रीम करने से, और 505 लाइब्रेरीज़ को समानांतर में रेंडर करने से;
किसी तेज़ एल्गोरिदम से नहीं। समानांतर पथ सीरियल पथ के साथ बाइट-समान है (diff -rq 1011 फ़ाइलों पर),
क्योंकि फ़ाइल नाम और "कौन सी लाइब्रेरी प्रत्येक एंट्री पॉइंट उत्सर्जित करती है" दोनों किसी भी रेंडरिंग के शुरू होने से पहले
एक अनुक्रमिक प्री-पास द्वारा तय किए जाते हैं।
द्विभाषी CLI — चीनी लोकेल चीनी प्रिंट करता है, बाकी सब अंग्रेज़ी; DAE_LANG=zh|en से ओवरराइड करें।
समानांतर डीकंपाइलर — 505-जैसी लाइब्रेरीज़ समवर्ती रूप से रेंडर होती हैं (डिफ़ॉल्ट n_threads(),
यानी कोर गणना 8 पर सीमित); DAE_DEC_THREADS=N से ओवरराइड करें। आउटपुट किसी भी
सेटिंग पर बाइट-समान है, क्योंकि फ़ाइल नाम और "कौन सी लाइब्रेरी प्रत्येक एंट्री पॉइंट उत्सर्जित करती है" पहले
एक अनुक्रमिक प्री-पास द्वारा तय किए जाते हैं। 8 थ्रेड्स से अधिक पर यह 6P+12E-कोर Mac पर धीमा हो जाता है और अधिक मेमोरी
उपयोग करता है, इसलिए यह सीमा सर्वोत्तम बिंदु है, कोई कमी नहीं। 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 ms में और 15,796-फ़ंक्शन ऐप पर 43–311 ms में उत्तर देती हैं; उस ऐप का पूर्ण
निर्यात 0.55 s है, या --decompile के साथ ~1.4 s (~1000 फ़ाइलें)। प्रत्येक कमांड का आउटपुट
अगले में पेस्ट किया जा सकता है।
देखें प्रगतिशील मोड।
किसी टूलचेन की आवश्यकता नहीं — एक स्व-निहित बाइनरी: कोई Dart SDK नहीं, कोई Flutter इंस्टॉल नहीं, और लक्ष्य कभी निष्पादित नहीं होता, केवल पार्स किया जाता है। Mach-O/ELF/PE पार्सिंग और सभी 47 प्रोफ़ाइल्स अंतर्निहित हैं।
| तरीका | कमांड |
|---|---|
| Homebrew (macOS) | brew install ejfkdev/tap/dae |
| cargo | cargo install dae-rs |
| प्रीबिल्ट | Releases से बाइनरी — Windows/macOS/Linux × x64/arm64 |
| स्रोत | cargo build --release |
macOS प्रीबिल्ट बाइनरीज़ ad-hoc हस्ताक्षरित हैं; यदि 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)