एक डीकंपाइलर जो वापस निकालता है एल्गोरिदम, सिर्फ़ कोड नहीं
संगठनों को अक्सर ऐसा सॉफ़्टवेयर समझना पड़ता है जिसका स्रोत कोड उनके पास नहीं है: कोई पुराना सिस्टम, बाहर से ख़रीदा गया कोई हिस्सा, या कुछ ऐसा जो आया है और संदिग्ध लगता है। ऐसे औज़ार पहले से हैं जो मशीन कोड को वापस पढ़ने लायक़ चरणों में बदल देते हैं। RetDec Imortek एक क़दम और आगे जाकर यह बताने की कोशिश करता है कि वे चरण हैं क्या — यह हिस्सा उन्नत एन्क्रिप्शन मानक (AES) है, यह हिस्सा एक छँटाई है, यह हिस्सा बताता है कि भेजने के लिए डेटा कैसे बाँधा गया है।
अपस्ट्रीम RetDec v5.0, 2022 से निष्क्रिय है। यह उन गिने-चुने खुले डीकंपाइलरों में से एक है जिनका फ़्रंट एंड सचमुच चौड़ा है — और उस चौड़ाई को ज़िंदा रखना क़ीमती है।
यह क्या है, एक मिनट में
सॉफ़्टवेयर ऐसी शक्ल में भेजा जाता है जिसे मशीन पढ़ लेती है और इंसान नहीं। जब स्रोत कोड है ही नहीं — आपूर्तिकर्ता जा चुका, अनुबंध में वह कभी शामिल ही नहीं था, फ़ाइल ऐसी जगह से आई जिस पर आपको भरोसा नहीं — तब कोई नहीं बता सकता कि प्रोग्राम सचमुच करता क्या है। हाथ से जाँचने का मतलब है मशीन के निर्देश एक-एक करके पढ़ना।
यह कंपाइल हो चुकी फ़ाइल को खोलकर उससे C दोबारा बनाता है: परीक्षण संग्रह की सभी 216 बाइनरी ऐसी C बनकर लौटती हैं जो बिल्ड हो जाती है। फिर वह मतलब के पीछे जाता है — कौन-सी क्रिप्टोग्राफ़ी, कौन-सी छँटाई, कौन-सी थ्रेडिंग, कौन-सा फ़ाइल प्रारूप — और बताता है कि यह कितनी बार काम करता है, उस हालत समेत जहाँ यह मुश्किल से ही चलता है।
मैलवेयर खोलकर देखने वाली सुरक्षा टीमें, जिन्हें कोड से पहले जवाब चाहिए। ऐसा सॉफ़्टवेयर चला रही कंपनियाँ जिसका स्रोत किसी के पास नहीं, और जिन्हें कुछ भी सुरक्षित ढंग से दोबारा बनाने या बदलने से पहले उसका ब्यौरा चाहिए। और वे सब जो ऐसे फ़ाइल प्रारूप में फँसे हैं जिसका दस्तावेज़ कभी बना ही नहीं — पुराने रिकॉर्ड, या ऐसी मशीन जो सिर्फ़ अपने ही सॉफ़्टवेयर से बात करती है।
असली डिकोडर, WebAssembly में कंपाइल किया हुआ
इससे ऊपर की हर चीज़ अमूर्तन की सीढ़ी पर एक लिखी हुई सैर है। यह पहला पायदान है जो सचमुच चलता है: Capstone — वही डिसअसेंबलर जिसे नेटिव RetDec बिल्ड लिंक करता है — और वह आपके चिपकाए हुए बाइट्स डिकोड करता है।
capstone — WebAssembly
791 किलोबाइट (KB), क्योंकि एक असली x86 डिकोडर पूरा इंस्ट्रक्शन सेट साथ रखता है — हर एनकोडिंग, हर प्रीफ़िक्स, हर एक्सटेंशन। इस चीज़ का ईमानदार आकार यही है।
deps/capstone.
नेटिव, बाइटकोड और उभरते प्रारूप
आउटपुट प्रारूप पर निर्भर करता है, क्योंकि यह दिखावा कि हर चीज़ C में डीकंपाइल हो जाती है, किसी के काम नहीं आता। फ़्रंट एंड नेटिव बाइनरी लेता है: निष्पादनीय और लिंक-योग्य प्रारूप (ELF), पोर्टेबल निष्पादनीय (PE) और Mach-O; बाइटकोड, जिनमें Java वर्चुअल मशीन (JVM) की क्लास फ़ाइलें, Dalvik निष्पादनीय (DEX) और साझा मध्यवर्ती भाषा (CIL) शामिल हैं; और CUDA की समांतर थ्रेड निष्पादन (PTX) जैसे नए लक्ष्य।
ELF · PE · Mach-O
C छद्म-कोड देता है, और साथ में वह अर्थ की परत जिसके लिए यह फ़ोर्क बना है।
Python · Lua · JVM · DEX · CIL
Python और Lua बाइटकोड अपनी ही भाषाओं में लौटते हैं; मैनेज्ड कोड के रास्ते Java-परिवार या C#-परिवार का आउटपुट देते हैं।
WebAssembly · CUDA PTX
WebAssembly को WebAssembly टेक्स्ट प्रारूप (WAT) में बदला जाता है। PTX को बाद की सोच नहीं, बल्कि पहले दर्जे का इनपुट माना गया है।
किसी फ़ंक्शन को अमूर्तन की सीढ़ी चढ़ते देखिए
कोई बाइनरी फ़ंक्शन चुनिए और उसे पाइपलाइन से क़दम-दर-क़दम गुज़ारिए: कच्चे बाइट, डिसअसेंबली, उठाया हुआ IR, C छद्म-कोड, और आख़िर में अर्थ का फ़ैसला — नामित एल्गोरिदम, उस सबूत के साथ जिससे उसे पहचाना गया।
retdec — विनिर्देश निष्कर्षण
अर्थ का फ़ैसला
सबूत
सिंबल हटा दिए जाएँ तो पहचान सिर्फ़ ढाँचे से करनी पड़ती है — स्थिरांक, राउंड की गिनती, नियंत्रण-प्रवाह का आकार। यही मुश्किल हालत है, और नापा हुआ F1 0.056 इसी की बात करता है।
ढाँचे के छह परिवार
मानक टेम्पलेट लाइब्रेरी (STL) के कंटेनर और C++ रनटाइम की संरचनाएँ — आवंटन के पैटर्न से दोबारा उभरते std::vector का आकार।
AES, सुरक्षित हैश एल्गोरिदम (SHA) परिवार, ChaCha20, Rivest–Shamir–Adleman (RSA) और दीर्घवृत्तीय वक्र की आदिम क्रियाएँ, जिन्हें स्थिरांकों और राउंड की बनावट से पहचाना जाता है।
Introsort, merge sort, binary search — उस गहराई-सीमा वाले स्विच समेत जो introsort की चुगली कर देता है।
ग्राफ़ एल्गोरिदम, साथ ही चौड़ाई-प्रथम खोज (BFS) और गहराई-प्रथम खोज (DFS) के भ्रमण पैटर्न।
std::thread, pthreads, OpenMP, Threading Building Blocks (TBB) और कच्चे एटॉमिक।
Protobuf, FlatBuffers, MessagePack, JavaScript ऑब्जेक्ट नोटेशन (JSON) और एक्सटेंसिबल मार्कअप लैंग्वेज (XML) की फ़्रेमिंग।
216 बाइनरी, और वह आँकड़ा जो चुभता है
परीक्षण संग्रह की सभी 216 ELF बाइनरी बिल्ड होने लायक़ C देती हैं, साथ में
--buildable, जो तयशुदा तौर पर चालू रहता है। एल्गोरिदम वापस निकालने की कहानी अलग है, और उसे बताने का ईमानदार तरीक़ा यह है कि दोनों आँकड़े साथ-साथ रखे जाएँ।
| माप | नतीजा | शर्त |
|---|---|---|
| बिल्ड होने लायक़ C आउटपुट | 216 / 216 | --buildable, तयशुदा तौर पर चालू |
| एल्गोरिदम वापस निकालने का F1 | 0.056 | नाम-रहित, 95% विश्वास अंतराल 0.034–0.083 |
| एल्गोरिदम वापस निकालने का F1 | 1.000 | नाम-सहित, सिंबल वाली बाइनरी |
तयशुदा .c दोबारा कंपाइल होती है | नहीं | न यह फ़ोर्क, न स्टॉक RetDec |
वैकल्पिक, ऑफ़लाइन, और पहरे के नीचे
परिष्करण llama.cpp के ज़रिए GGUF मॉडलों से चलता है, पूरी तरह ऑफ़लाइन, और सिर्फ़ तब जब
RETDEC_NEURAL_REFINE=1 हो और मॉडल का पथ दिया गया हो। यह तयशुदा तौर पर बंद रहता है और बेसलाइन की जगह कभी नहीं लेता।
- कंपाइल का पहरा। परिष्कृत आउटपुट को स्वीकार होने से पहले
gcc -fsyntax-onlyपास करना ज़रूरी है। - ढाँचे की जाँच। परिष्करण को फिर भी उठाए हुए ढाँचे से मेल खाना होगा।
- नियतात्मक बेसलाइन बचाकर रखी जाती है। बिना परिष्कार वाला डीकंपाइलर आउटपुट ही वह चीज़ रहती है जिसकी जाँच हो सकती है। अगर आपको किसी निष्कर्ष का बचाव करना है, तो आप उसी का बचाव करते हैं।
- कोई नेटवर्क नहीं। स्थानीय GGUF इन्फ़रेंस। आपकी बाइनरी की कोई बात मशीन से बाहर नहीं जाती।
$ export RETDEC_NEURAL_REFINE=1 $ export RETDEC_NEURAL_MODEL=/models/qwen-coder.gguf $ retdec-decompiler --buildable ./target.elf
जब स्रोत कोड नहीं बचा, तब यह बताता है कि प्रोग्राम करता क्या है
सॉफ़्टवेयर ऐसी शक्ल में आता है जिसे मशीन पढ़ सकती है और इंसान नहीं। यह उसे वापस खोलकर सादे शब्दों में बताता है कि प्रोग्राम असल में कर क्या रहा है।
मैलवेयर खोलकर देखने वाली सुरक्षा टीमें
पन्नों भर न पढ़े जाने वाले कोड की जगह आपको जवाब मिलता है: यह हिस्सा डेटा को गड्डमड्ड कर रहा है, यह हिस्सा घर फ़ोन करने का तरीक़ा है, यह हिस्सा छिपने का। विश्लेषक को सबसे पहले यही चाहिए।
पुराने सॉफ़्टवेयर वाली वे कंपनियाँ जिनके पास स्रोत कोड नहीं है
सिस्टम अब भी कारोबार चला रहा है, और जिसने उसे लिखा था वह सालों पहले जा चुका। यह उसका ब्यौरा वापस निकालता है कि वह करता क्या है, और किसी के भी उसे सुरक्षित ढंग से दोबारा बनाने या बदलने से पहले यही चाहिए।
वे सब जो ऐसे फ़ाइल प्रारूप में फँसे हैं जिसका कोई प्रलेख नहीं
पुराने अभिलेख, ऐसी मशीन जो सिर्फ़ अपने ही सॉफ़्टवेयर से बात करेगी, किसी प्रतिद्वंद्वी की निर्यात फ़ाइल। यह ढाँचा निकाल देता है, ताकि आपका अपना सॉफ़्टवेयर उसे पढ़ सके।
Qt 6 ग्राफ़िकल यूज़र इंटरफ़ेस (GUI), या कोई GUI ही नहीं
C, असेंबली, IR और नियंत्रण-प्रवाह ग्राफ़ पर तालमेल में चलने वाले कोड दृश्य, साथ में फ़ंक्शन नेविगेशन, स्ट्रिंग जाँच, एक बाइनरी ब्राउज़र और एक सहायक पैनल। हेडलेस मोड हर GUI निर्भरता हटा देता है, ताकि वही बिल्ड सतत एकीकरण (CI) में चल सके।
खुले स्रोत के इस्तेमाल के लिए GNU Affero जनरल पब्लिक लाइसेंस (AGPL-3.0+), या मालिकाना तैनाती के लिए वाणिज्यिक लाइसेंस। कॉपीराइट Odin Loch, Imortek के नाम से कारोबार करते हुए, 2025–2026।
v2.0.21 पर भेजने लायक़। CI के पहरे उत्पादन की परिपक्वता के मानकों के बजाय विकास की हालत दिखाते हैं — यह परियोजना ख़ुद कहती है, अंदाज़े से निकाला हुआ नहीं।