
Flutter/Dart AOT स्नैपशॉट के लिए स्थैतिक विश्लेषक — Dart VM को एम्बेड या निष्पादित किए बिना libapp.so से फ़ंक्शन नाम, क्लास पदानुक्रम, कॉल ग्राफ़ और व्यवहारिक संकेत पुनर्प्राप्त करता है। ARM64 और x86_64, Dart 2.10–3.12 का समर्थन करता है।
एक Dart AOT स्नैपशॉट विश्लेषक। libapp.so — Flutter रिलीज़ APK के अंदर संकलित Dart कोड — को फ़ंक्शन नामों, क्लास लेआउट, कॉल ग्राफ़, व्यवहारिक संकेतों और पठनीय स्यूडोकोड में बदलता है। कोई Dart VM नहीं, कोई SDK संकलन नहीं, कोई रनटाइम फ़ॉलबैक नहीं।
फ़ोर्क सूचना: AOTopsy, unflutter का एक फ़ोर्क है, जिसे मूल रूप से Anthony Zboralski ने बनाया था। मूल
zboralski/unflutterरिपॉज़िटरी अब उपलब्ध नहीं है (लेखक द्वारा हटा दी गई); एक सामुदायिक निरंतरताKristijanZic/unflutterपर मौजूद है। मूल स्नैपशॉट पार्सर, क्लस्टर डीसीरियलाइज़र, ARM64 डिसअसेम्बली पाइपलाइन और Ghidra/IDA एकीकरण का सारा श्रेय मूल लेखक को जाता है। AOTopsy इसे x86_64 समर्थन, एक नेटिव डीकंपाइलर, संपूर्ण-प्रोग्राम टाइप अनुमान, Frida स्क्रिप्ट जनरेशन और व्यापक दस्तावेज़ीकरण के साथ विस्तारित करता है।
| आउटपुट | यह क्या है |
|---|---|
| फ़ंक्शन नाम | प्रत्येक संकलित फ़ंक्शन के लिए मूल Dart नाम |
| क्लास संरचनाएँ | फ़ील्ड नाम, बाइट ऑफ़सेट, विरासत श्रृंखलाएँ |
| कॉल ग्राफ़ | प्रोवेनेंस के साथ प्रत्यक्ष (BL) और अप्रत्यक्ष (BLR/dispatch) कॉल किनारे |
| स्ट्रिंग संदर्भ | कौन से फ़ंक्शन ऑब्जेक्ट पूल से कौन से स्ट्रिंग लिटरल लोड करते हैं |
| व्यवहारिक संकेत | क्रिप्टो, नेटवर्क, जुआ, SIM, स्थान, WebView, ब्लॉकचेन कीवर्ड वर्गीकरण |
| स्यूडोकोड | ARM64 या x86_64 मशीन कोड से आर्किटेक्चर-न्यूट्रल डीकंपाइल्ड आउटपुट |
| Dart स्रोत निर्यात | क्लास, फ़ील्ड और मेथड्स के साथ पुनर्निर्मित संपूर्ण-प्रोजेक्ट मॉड्यूलर .dart फ़ाइलें |
ARM64 और x86_64 का समर्थन करता है। Dart 2.10 से 3.13 तक कवर करता है (3.13.2 वर्तमान स्थिर सीमा है) — प्रत्येक मॉडल किया गया संस्करण दोनों आर्किटेक्चर पर साफ़ तरीके से पार्स होता है, देखें COVERAGE.md (93 नमूना बिल्ड, 0 विफलताएँ)।
AOTopsy को ग्राउंड ट्रुथ के विरुद्ध मापा जाता है, दावा नहीं किया जाता। प्रत्येक परिवर्तन पर टेस्ट सूट द्वारा दो गुण लागू किए जाते हैं:
| मीट्रिक | मान | इसका क्या अर्थ है |
|---|---|---|
| नाम-पुनर्प्राप्ति सहमति | 44 ग्राउंड-ट्रुथ बिल्ड्स में समग्र रूप से 90.2% (81.3% सबसे खराब बैंड, ≥ 0.81 गेट फ़्लोर) | पुनर्प्राप्त फ़ंक्शन नामों की तुलना प्रत्येक बिल्ड के अपने ELF .symtab से की गई, जो बाहरी ग्राउंड ट्रुथ है — TestSymtabDifferential। प्रति-बिल्ड पूरा स्कोरबोर्ड: BENCHMARK.md (make bench)। |
| डीकंपाइलर सिंटैक्स वैधता | 100% वैध Dart | प्रत्येक उत्सर्जित स्यूडोकोड फ़ंक्शन Dart के रूप में पार्स होता है — TestDecompileQualityCorpus। |
| निर्माण दर | 0% | §2 नियम: किसी अनुमानित नाम, प्रकार या कॉल लक्ष्य को कभी तथ्य के रूप में उत्सर्जित न करें। अज्ञात चीज़ें ईमानदारी से प्रस्तुत होती हैं (indirectCall, <unknown>, dynamic)। |
ग्राउंड-ट्रुथ ट्विन्स वास्तविक प्रोडक्शन बिल्ड हैं जिन्हें हम पुनर्वितरित नहीं कर सकते, इसलिए वे
डिफ़रेंशियल गेट्स स्थानीय रूप से चलते हैं; सार्वजनिक CI बिल्ड, vet, gofmt,
staticcheck, यूनिट टेस्ट (शफ़ल किए गए) और प्लेटफ़ॉर्म मैट्रिक्स में कवरेज फ़्लोर को मान्य करता है।
samples/ पुनर्वितरित करने योग्य नहीं है और gitignored है, इसलिए नमूना-निर्भर
टेस्ट वहाँ छोड़ दिए जाते हैं — लेकिन केवल तब जब कॉर्पस पूरी तरह अनुपस्थित हो; एक कॉर्पस जो
मौजूद है और एक पंजीकृत नमूना गुम है, विफल हो जाता है, क्योंकि इनका अर्थ विपरीत है।
यहाँ प्रत्येक संख्या कैसे मापी जाती है (ग्राउंड ट्रुथ, मीट्रिक परिभाषाएँ, पुनरुत्पादन): METHODOLOGY.md। रिलीज़-बाइनरी सत्यापन और नीचे दिए गए ईमानदार दायरे के लिए
SECURITY.md देखें।
make build
./aotopsy libapp.so # full pipeline
./aotopsy doctor libapp.so # quick diagnostic
./aotopsy export-dart --lib libapp.so --out ./lib # reconstruct entire Dart source project
./aotopsy _debug decompile-native --lib libapp.so --find MyClass # find and decompile a function
वास्तविक स्नैपशॉट पर पाँच मिनट के वॉकथ्रू के लिए DEMO.md देखें, या जब आपके पास एक कच्चा APK हो और आपको पता न हो कि कहाँ से शुरू करें, तो चरण-दर-चरण कार्यप्रणाली के लिए WORKFLOW.md देखें।
AOTopsy, Dart AOT स्नैपशॉट को एक नियतात्मक बाइनरी व्याकरण के रूप में मानता है। सही बाधाओं (ELF संरचना, स्नैपशॉट मैजिक, वर्ज़न हैश, CID तालिका, क्लस्टर एन्कोडिंग) दिए जाने पर प्रत्येक बाइट का ठीक एक सही अर्थ होता है। पार्सर बाधाओं को तब तक लागू करता है जब तक केवल एक ही व्याख्या शेष न रहे — कोई अनुमानी तरीका नहीं, कोई अंदाज़ा नहीं।
पाइपलाइन चरणों में चलती है, प्रत्येक चरण बाइट्स से संरचित डेटा तक एक शुद्ध फ़ंक्शन है:
flowchart TD
A[libapp.so] --> B[ELF parse]
B --> C[snapshot region extraction]
C --> D[version detection]
D --> E[cluster alloc<br/>object census]
E --> F[cluster fill<br/>field values, names, strings]
F --> G[instructions table<br/>code ranges, stub boundaries]
G --> H{architecture?}
H -->|ARM64| I[ARM64 disassembly]
H -->|x86_64| J[x86_64 disassembly]
I --> K[CFG + call edges<br/>register provenance]
J --> K
K --> L[type inference<br/>BLR receiver type resolution]
L --> M[signal classification<br/>behavioral keyword matching]
M --> N[JSONL + HTML + DOT<br/>pseudocode output]
दो स्वतंत्र बैकएंड एक ही फ्रंट हाफ (ELF से क्लस्टर फिल तक) साझा करते हैं, फिर आर्किटेक्चर के आधार पर विभाजित होते हैं: ARM64 के लिए internal/disasm, x86_64 के लिए internal/disasm/x86.go। डीकंपाइलर (internal/decompiler) एकीकृत IR के माध्यम से दोनों आर्किटेक्चर को संभालता है।
flowchart LR
subgraph "Shared front half"
A[elfx] --> B[snapshot]
B --> C[cluster]
end
subgraph "ARM64 backend"
C --> D1[disasm ARM64]
D1 --> E1[callgraph]
E1 --> F1[signal]
end
subgraph "x86_64 backend"
C --> D2[disasm x86_64]
D2 --> E2[callgraph]
E2 --> F2[signal]
end
subgraph "Decompiler (both archs)"
C --> G[decompiler IR]
G --> H[pseudocode]
end
flowchart LR
subgraph Blutter
direction TB
B1[libapp.so] --> B2[Compile matching<br/>Dart SDK]
B2 --> B3[Embed Dart VM]
B3 --> B4[Deserialize via<br/>VM internal APIs]
B4 --> B5[Perfect fidelity]
end
subgraph AOTopsy
direction TB
A1[libapp.so] --> A2[Parse binary format<br/>directly]
A2 --> A3[No VM, no SDK]
A3 --> A4[Version-specific<br/>format modeling]
A4 --> A5[Portability + speed]
end
Blutter स्नैपशॉट को अपने स्वयं के कोड पथों के माध्यम से डीसेरियलाइज़ करने के लिए Dart VM को एम्बेड करता है। पूर्ण निष्ठा, लेकिन हर लक्ष्य संस्करण के लिए एक मेल खाता Dart SDK संकलित करना आवश्यक है — और यह केवल ARM64 के लिए है, स्थिर x86_64 समर्थन के बिना। AOTopsy एकमात्र स्थिर, संस्करण-स्वतंत्र विश्लेषक है जिसमें एक मूल स्यूडोकोड डीकंपाइलर और प्रकाशित ग्राउंड-ट्रुथ सटीकता है।
AOTopsy बाइनरी प्रारूप को सीधे पार्स करता है। कोई VM नहीं, कोई SDK नहीं। समझौता: Dart संस्करणों में हर प्रारूप परिवर्तन को स्पष्ट रूप से मॉडल किया जाना चाहिए। इसे स्वचालित रूप से संभालने के लिए कोई रनटाइम नहीं है।
aotopsy libapp.so # disasm + call edges + signal + metadata (ARM64: + Ghidra/IDA)
aotopsy signal libapp.so # same, skip metadata
aotopsy libapp.so --graph # also build call graph DOT files