यहां सबसे महान डीकंपलर में से एक है जो निश्चित रूप से हेक्स-रे डीकंपलर है। यदि आप देखना चाहते हैं, तो यह आउटपुट क्या कर सकता है, http://www.hex-rays.com/products/decompiler/compare_vs_disassembly.shtml पर एक नज़र डालें।
इसके लेखक, इल्फाक गुिलफानोव, कुछ चोर में अपने decompiler के आंतरिक कामकाज के बारे में एक भाषण दिया, और यहाँ श्वेत पत्र है: http://www.hex-rays.com/products/ida/support/ppt/decompilers_and_beyond_white_paper.pdf और यहाँ एक प्रस्तुति: http://www.hex-rays.com/products/ida/support/ppt/decompilers_and_beyond.ppt यह वही है में सभी कठिनाइयों कर रहे हैं में एक अच्छा सिंहावलोकन का वर्णन करता है एक डिकंपेलर बनाना और इसे सभी काम कैसे करना है।
इसके अलावा, कुछ पुराने कागजात हैं, उदा। यहां क्रिस्टीना सीफ्यूएंट्स की शास्त्रीय पीएचडी थीसिस: http://itee.uq.edu.au/~cristina/dcc.html#thesis
जटिलता के लिए, सभी "अपघटन" सामग्री बाइनरी की भाषा और रनटाइम पर निर्भर करती है। उदाहरण के लिए .NET और Java को डीकंपलिंग करना "किया गया" माना जाता है, क्योंकि वहां मुफ्त डिकंपेलर उपलब्ध हैं, जिनके पास बहुत अधिक सफल अनुपात है (वे मूल स्रोत उत्पन्न करते हैं)। लेकिन यह उन वर्चुअल मशीनों की बहुत विशिष्ट प्रकृति के कारण होता है जो इन रनटाइम का उपयोग करते हैं।
सी, सी ++, ओब्जे-सी, डेल्फी, पास्कल, जैसे वास्तव में संकलित भाषाओं के लिए ... कार्य अधिक जटिल हो जाता है। विवरण के लिए उपरोक्त कागजात पढ़ें।
डिस्सेबलर और एक डिकंपेलर के बीच क्या अंतर है?
जब आपके पास बाइनरी प्रोग्राम (निष्पादन योग्य, डीएलएल लाइब्रेरी, ...) है, तो इसमें प्रोसेसर निर्देश होते हैं। इन निर्देशों की भाषा को असेंबली (या असेंबलर) कहा जाता है। बाइनरी में, ये निर्देश द्विआधारी एन्कोडेड होते हैं, ताकि प्रोसेसर सीधे उन्हें निष्पादित कर सके। disassembler इस बाइनरी कोड को लेता है और इसे एक पाठ प्रस्तुतिकरण में अनुवादित करता है। यह अनुवाद आम तौर पर 1-से-1 है, जिसका अर्थ है कि एक निर्देश पाठ की एक पंक्ति के रूप में दिखाया गया है।यह कार्य जटिल है, लेकिन सीधा है, कार्यक्रम को केवल सभी अलग-अलग निर्देशों और बाइनरी में उनका प्रतिनिधित्व करने की आवश्यकता है।
दूसरी ओर, decompiler एक बहुत कठिन कार्य करता है। यह या तो बाइनरी कोड या डिस्सेबलर आउटपुट लेता है (जो मूल रूप से वही है, क्योंकि यह 1-से-1 है) और उच्च-स्तरीय कोड उत्पन्न करता है। मुझे आपको एक उदाहरण दिखाएं। कहते हैं कि हम इस सी समारोह है:
_twotimes:
SHL EAX, 1
RET
(प्रथम पंक्ति:
int twotimes(int a) {
return a * 2;
}
जब आप इसे संकलन, संकलक पहले उत्पन्न करता है और कि समारोह के लिए विधानसभा फ़ाइल, यह कुछ इस तरह लग सकता है केवल एक लेबल है और वास्तविक निर्देश नहीं है, SHL
एक शिफ्ट-बाएं ऑपरेशन करता है, जो दो से अधिक गुणा करता है, RET
का अर्थ है कि फ़ंक्शन पूरा हो गया है)। परिणाम बाइनरी में, ऐसा लगता है:
08 6A CF 45 37 1A
(मैंने इसे वास्तविक बाइनरी निर्देश नहीं बनाया)। अब आप जानते हैं कि disassembler आपको बाइनरी फॉर्म से असेंबली फॉर्म में ले जाता है। एक decompiler आपको सी कोड (या कुछ अन्य उच्च स्तरीय भाषा) पर ले जाता है।
संभावित डुप्लिकेट [डी-कंपाइलर क्या काम करता है?] (Http://stackoverflow.com/questions/2902074/what-is-a-de-compiler-how-does-it-work) –