2012-04-25 17 views
18

मैंने कुछ समय पहले "डिकंपलिंग" शब्द सुना है, और मैं इस बारे में बहुत उत्सुक होना शुरू कर रहा हूं कि यह कैसे काम करता है।काम को कम करने में कैसे काम करता है?

मेरे पास यह काम करने का एक बहुत ही सामान्य विचार है कि यह कैसे काम करता है; यह देखने के लिए एक रिवर्स इंजीनियरिंग एक एप्लिकेशन है कि यह कौन से कार्यों का उपयोग करता है, लेकिन मुझे उससे परे बहुत कुछ पता नहीं है।

मैंने "disassembler" शब्द भी सुना है, एक डिस्सेबलर और एक डिकंपेलर के बीच क्या अंतर है?

तो मेरे प्रश्नों को पूरा करने के लिए: कुछ घटाने की प्रक्रिया में वास्तव में क्या शामिल है? यह आमतौर पर कैसे किया जाता है? प्रक्रियाओं का कितना जटिल/आसान है? क्या यह सही कोड उत्पन्न कर सकता है? और एक decompiler, और एक disassembler के बीच क्या अंतर है?

+0

संभावित डुप्लिकेट [डी-कंपाइलर क्या काम करता है?] (Http://stackoverflow.com/questions/2902074/what-is-a-de-compiler-how-does-it-work) –

उत्तर

20

यहां सबसे महान डीकंपलर में से एक है जो निश्चित रूप से हेक्स-रे डीकंपलर है। यदि आप देखना चाहते हैं, तो यह आउटपुट क्या कर सकता है, 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 आपको सी कोड (या कुछ अन्य उच्च स्तरीय भाषा) पर ले जाता है।

3

डीकंपलिंग अनिवार्य रूप से संकलन के विपरीत है। यही है - ऑब्जेक्ट कोड (बाइनरी) लेना और उससे स्रोत कोड को फिर से बनाने का प्रयास करना।

डिकंपिलेशन ऑब्जेक्ट कोड में छोड़े गए कलाकृतियों पर निर्भर करता है जिसका उपयोग स्रोत कोड की संरचना का पता लगाने के लिए किया जा सकता है।

सी/सी ++ के साथ अपघटन प्रक्रिया में मदद करने के लिए बहुत कुछ नहीं बचा है, इसलिए यह बहुत मुश्किल है। हालांकि जावा और सी # और वर्चुअल मशीनों को लक्षित करने वाली अन्य भाषाओं के साथ, यह संकुचित करना आसान हो सकता है क्योंकि भाषा ऑब्जेक्ट कोड के भीतर कई और संकेत देती है।

+0

हर कोई कह रहा है कि यह "कठिन" है - लेकिन क्या यह हमेशा _possible_ है? –

+1

@ मार्कोप्रिन्स: हेक्सरे कहते हैं कि सामान्य रूप से, यह स्वचालित रूप से हमेशा संभव नहीं होता है। संकलन दिशानिर्देशों के बारे में धारणाएं की जानी चाहिए (जैसे "सामान्य" लोकप्रिय कंपाइलर का उपयोग किया गया है और कुछ अजीब विशेष गैर-मानकीकृत हैक कार्यान्वयन या "बुराई" हाथ से तैयार असेंबली नहीं है)। – BullyWiiPlaza

0

BTW, आप decompiler यहाँ enter link description here वहाँ decompiler के ऑनलाइन संस्करण (PowerPC प्रोसेसर के लिए) है काम के बारे में कुछ जानकारी, आईडीए प्रो के अंकन में है कि कोडांतरक कोड प्राप्त कर सकते हैं। लेकिन सेवा "मध्यवर्ती प्रतिनिधित्व कर", जो निम्न उत्पन्न विकल्प हैं:

  • इनपुट कोड (पाठ)
  • स्रोत कोड के सार सिंटेक्स (पेड़) BasicBlock प्रपत्र (ग्राफ) में
  • कॉल ग्राफ
  • फ़्रेम BasicBlock रूप में
    • कॉल ग्राफ (ग्राफ)
    • रजिस्टर के मूल्यों की dataflow (ग्राफ):
    • Metainformations है, thats decompilation दौरान बहाल कर दी गई
    • चर के मूल्यों की dataflow (ग्राफ)
    • अभिव्यक्ति के dependences की dataflow (ग्राफ)
  • Nassi-Shneiderman आरेख (पेड़ + ग्राफ)
  • संरचित Nassi-Shneiderman आरेख (पेड़ + ग्राफ)
  • अनुकूलित Nassi-Shneiderman आरेख (पेड़ + ग्राफ) एल्गोरिथ्म के रूप में
  • स्रोत कोड विवरण (कुछ तरह decompilation)
  • कुछ अन्य
  • ...

आप इस सेवा का उपयोग डीकंपलरों के प्रयोग और समझ के लिए कर सकते हैं।

बीटीडब्ल्यू। डिस्सेबलर: बाइनरी मशीन कोड -> असेंबलर टेक्स्ट डीकंपलर: असेंबलर टेक्स्ट -> उच्च स्तरीय भाषा (सी, सी ++, सी का विस्तार इत्यादि) पर स्रोत का संस्करण।)

संबंधित मुद्दे