समानांतर IDA Pro बाइनरी विश्लेषण AI-संचालित फ़ंक्शन नामकरण, Neo4j ज्ञान ग्राफ, और phantomrt एमुलेशन/हुकिंग/फ़ज़िंग इंजन के साथ PE, ELF, और NSO फ़ॉर्मेट में स्वचालित रिवर्स इंजीनियरिंग के लिए।
बाइनरी में भूत की तरह।
एक स्थानीय, AI-संचालित रिवर्स इंजीनियरिंग सहायक: समानांतर IDA Pro विश्लेषण, AI फ़ंक्शन नामकरण, एक टर्मिनल जो बेकार नहीं है, एक Neo4j ज्ञान ग्राफ जो कुछ भी इसने कभी समझा है, और एक MCP सर्वर ताकि Claude सीधे उस ग्राफ पर खोज और श्रृंखला बना सके।
और अब — phantomrt के साथ — यह सिर्फ दीवारों को नहीं पढ़ता। यह उनके बीच से चलता है: उन फ़ंक्शन को एमुलेट, हुक और फ़ज़ करता है जिनका इसने नाम रखा, और वास्तव में क्या होता है वापस ग्राफ पर लिखता है।
✓ 00 ✓ 01 ✓ 02 ✓ 03 ▸ 04 · 05 · 06 · 07 ✓ 08 ✓ 09 ✓ 10 ✓ 11 ✓ 12 ✓ 13 ▸ 14 · 15
14/16 shards │ 141,203 functions found ████████████████████████████░░░░ 89% ~4s remaining
---
## यह क्या है
IDA Pro का ऑटो-विश्लेषण सिंगल-थ्रेडेड है। एक 34 MB il2cpp DLL पर वह *मिनटों* का होता है। spectrIDA बाइनरी को N शार्ड्स में विभाजित करता है, उन्हें idalib के माध्यम से समानांतर में चलाता है, एक `.i64` में विलय करता है, फिर एक फाइन-ट्यून किए गए 8B मॉडल को **हर फंक्शन का नाम** देने देता है — यह सब एक टर्मिनल UI से साइबरपंक थीम और बिल्कुल सही मात्रा में व्यंग्य के साथ।
यह अध्याय 1 है, और यह अपने आप में पूर्ण है: शुद्ध गति, यदि आप नहीं चाहते तो कोई AI आवश्यक नहीं।
अध्याय 2 आउटपुट को ऐसी चीज़ में बदल देता है जो सत्र से अधिक जीवित रहती है — एक Neo4j ग्राफ़ जिसमें एक MCP क्लाइंट (Claude, [pi](https://pi.dev), जो भी MCP बोलता है) वास्तव में रह सकता है, इसके बजाय कि आप डीकंपाइलर आउटपुट को एक बार में एक फंक्शन करके चैट विंडो में कॉपी-पेस्ट करें:```
Binary ─▶ Parallel IDA Analysis ─▶ Demangle ─▶ AI Naming ─▶ Neo4j Graph ─▶ MCP Server ─▶ Claude
(N idalib shards) (free, real) (stripped (persists, (search/chain/
leftovers forever, rename, live)
only) across sessions)
अध्याय 3 (phantomrt) वह आधा जोड़ता है जो स्थिर उपकरणों में कभी नहीं होता: यह कोड को चलाता है। बिना OS के किसी फ़ंक्शन का अनुकरण करता है (उन बाइनरी पर काम करता है जिन्हें आप लॉन्च भी नहीं कर सकते, जैसे Switch .nso), या लाइव प्रक्रिया को हुक करता है, या इसे फ़ज़ करता है — और परिणाम (crashes / needs live state / clean) को उसी ग्राफ़ नोड पर नाम के साथ टिकट लगाता है।
पूरी विस्तृत जानकारी, जिसमें अभी भी क्या बाकी है, अध्याय 2 और अध्याय 3 में दी गई है।
यह Ghidra नहीं है। यह एक कष्टप्रद काम (धीमी विश्लेषण + नामकरण) को तेज़ी से करता है, और इसका उपयोग करना वास्तव में मज़ेदार है। 199 डाउनलोड अपने आप में बोलते हैं।
कोई क्लाउड नहीं। कोई टेलीमेट्री नहीं। पूरी तरह से आपकी मशीन पर चलता है।
| कार्य | समय |
|---|---|
| Among Us DLL — एकल-थ्रेडेड IDA | ~4 hours |
| Among Us DLL — spectrIDA (16 कार्यकर्ता) | 67 seconds |
| 153,649 फ़ंक्शन वाली बाइनरी — पूर्ण नामकरण पास | overnight |
| बाइनरी अवलोकन (यह चीज़ क्या करती है?) | ~30 seconds |
ये माप किस हार्डवेयर पर लिए गए: AMD Ryzen 7 5800X3D (8C/16T), 32 GB RAM, RTX 4070 12 GB.
अलग हार्डवेयर समानांतर-विश्लेषण संख्याओं को बदल देता है (अधिक कोर, अधिक शार्ड, तेज़); नामकरण संख्याएं अधिकतर GPU-बाउंड होती हैं। 4-घंटे/67-सेकंड के Among Us आंकड़े अध्याय 2 से पहले के हैं और हर रिलीज़ में स्वतंत्र रूप से पुनः सत्यापित नहीं किए जाते — अपनी मशीन और बाइनरी के लिए संख्या चाहिए तो स्वयं spectrida analyze चलाएँ, परिणाम शार्ड घनत्व और बाइनरी आकार के साथ भिन्न होते हैं।
अध्याय 2 के विकास के दौरान वास्तव में पुनः सत्यापित संख्याएँ, समान हार्डवेयर:
| बाइनरी | फ़ंक्शन | कार्य | समय / परिणाम |
|---|---|---|---|
| test_small.dll (PE) | 189 | समानांतर विश्लेषण, 4 कार्यकर्ता, CLI | 6.4s |
| test_small.dll (PE) | 164 | पूर्ण MCP पाइपलाइन (analyze + demangle + ग्राफ़ लेखन) | 9.8s |
| main.nso — Mario Odyssey (NSO), 16 कार्यकर्ता | 28,038 seed functions | समानांतर शार्डेड स्कैन चरण | 54.5s |
| main.nso — Mario Odyssey (NSO), 16 कार्यकर्ता | 74,790 कुल फ़ंक्शन | + मर्ज/पूर्ण-विश्लेषण चरण | 143.1s |
| main.nso — Mario Odyssey (NSO), 16 कार्यकर्ता | 74,790 कुल फ़ंक्शन | एंड-टू-एंड वॉल टाइम | 197.6s |
| main.nso — Mario Odyssey (NSO) | 74,790 | केवल demangling के माध्यम से हल किया (Itanium ABI, मुफ्त, कोई AI नहीं) | 67,300 (90.0%) |
वह NSO पंक्ति पुराने Among Us के '4 घंटे → 67 सेकंड' के दावे का वास्तविक समकक्ष है, इस रिलीज़ में 74,790-फ़ंक्शन वाली Switch बाइनरी पर ताज़ा मापा गया, कोई AI नामकरण शामिल नहीं (केवल demangling — populate=False). समानांतर चरण (16 कोर, ~55s) प्रारंभिक शार्डेड खोज करता है; मर्ज चरण (~143s) डिज़ाइन द्वारा एकल-थ्रेडेड है — एक IDA डेटाबेस, एक लेखक — इसलिए यदि आप उस भाग के दौरान Task Manager देखते हैं और 15 कोर को सोते हुए पाते हैं, तो यह बग रिपोर्ट नहीं है, यह भौतिकी है।
यहाँ एक ईमानदार संख्या प्राप्त करना अपने आप में एक छोटी डरावनी कहानी थी। NSO समर्थन का पहला संस्करण साफ चला, 0 से बाहर निकला, और गर्व से 727 फ़ंक्शन लौटाया एक बाइनरी के लिए जिसमें लगभग 75,000 हैं — यह क्रैश नहीं था, बस शानदार ढंग से, आत्मविश्वास से गलत था, जो किसी तरह से बदतर है। पता चला कि IDA के पास मूल NSO लोडर नहीं है, इसलिए फ़ाइल चुपचाप सादे x86 ("metapc") के रूप में लोड हो गई, भले ही Switch लॉन्च होने के बाद से ARM64 है। हर शार्ड ने शुद्ध AArch64 निर्देशों के खिलाफ x86 प्रोलॉग स्कैनर चलाया और जो कुछ भी गलती से एक "फ़ंक्शन" से मेल खाता था, उसे कॉल किया। आर्किटेक्चर को ठीक करने से अपने आप कुछ ठीक नहीं हुआ, क्योंकि बाइनरी मेमोरी में अभी भी LZ4-संपीड़ित थी — तो जो स्कैन किया गया उसका आधा, उदारता से, शोर था। और एक बार जब यह ठीक से डीकंप्रेस हो गया और AArch64 के रूप में चिह्नित हो गया, तब भी प्रत्येक शार्ड केवल बाइनरी के अपने छोटे टुकड़े के अंदर कॉल लक्ष्यों की खोज कर रहा था, हर उस कॉल को छोड़ रहा था जो शार्ड सीमा पार करती थी — और इस आकार की बाइनरी में यह उनमें से अधिकांश हैं। तीन बग, एक संख्या, और उनमें से किसी में भी अपवाद फेंकने की शालीनता नहीं थी। (हमने IDA के स्टैक-फ्रेम विश्लेषण को छोड़कर मर्ज चरण को कम करने का भी प्रयास किया — एक सुंदर गति वृद्धि और एक डेटाबेस मिला जहाँ Hex-Rays ने विनम्रता से इसके आधे को डीकंपाइल करने से इनकार कर दिया। इसे जल्दी वापस ले लिया गया। इसके बजाय बहुत छोटा, बहुत सुरक्षित FLIRT-signature स्किप रखा, जो लगभग ~3% का एक उचित लाभ देता है और कुछ भी नहीं तोड़ता, जो इस बिंदु तक एक व्यक्तित्व विशेषता की तरह लगा जो रखने लायक है।)
नामकरण सटीकता पर: यह Ghidra-ग्रेड का ग्राउंड ट्रुथ नहीं है, यह एक 8B मॉडल है जो स्यूडोकोड से अनुमान लगाता है। सामान्य हेल्पर्स/गेटर्स अच्छे से काम करते हैं; गहराई से गेम-विशिष्ट तर्क अधिक सिक्का उछालने जैसा है। जो कुछ भी यह गलत करता है उसका नाम बदलें — इसीलिए rename_function सीधे ग्राफ़ में वापस बनी रहती है।