2010-05-25 23 views
10

तो क्या एक डीकंपलर वास्तव में एक चीज है जो कोड के संकलित/व्याख्या किए गए टुकड़े का स्रोत देता है? क्योंकि मेरे लिए असंभव लगता है। यदि इसे संकलित किया गया है तो आप कार्यों, चर, कक्षाओं आदि के नाम कैसे प्राप्त करेंगे। या क्या मैं परिभाषा को गलत व्याख्या कर रहा हूं? यह कैसे काम करता है? और एक बनाने के पीछे सामान्य प्रिंसिपल क्या है?डी-कंपाइलर क्या है यह कैसे काम करता है?

उत्तर

10

आप एक डिकंपेलर की अपनी परिभाषा के बारे में सही हैं: यह एक संकलित अनुप्रयोग लेता है और मिलान करने के लिए स्रोत कोड बनाता है। हालांकि, यह ज्यादातर मामलों में चर/कार्यों/वर्गों का नाम और संरचना जानता है - यह अनुमान लगाता है। यह कार्यक्रम के प्रवाह का विश्लेषण करता है और एक निश्चित प्रोग्रामिंग भाषा के माध्यम से उस प्रवाह का प्रतिनिधित्व करने का एक तरीका खोजने का प्रयास करता है, आमतौर पर सी। हालांकि, क्योंकि पसंद की प्रोग्रामिंग भाषा (सी, इस उदाहरण में) अक्सर राज्य की तुलना में उच्च स्तर पर होती है अंतर्निहित कार्यक्रम (एक द्विआधारी निष्पादन योग्य) के, कार्यक्रम के कुछ हिस्सों को सटीक रूप से प्रतिनिधित्व करना असंभव हो सकता है; इस मामले में, decompiler विफल हो जाएगा और आप एक disassembler का उपयोग करने की आवश्यकता होगी। यही कारण है कि बहुत से लोग अपने कोड को खराब करना पसंद करते हैं: यह डिकंपेलरों को इसे खोलने के लिए बहुत कठिन बनाता है।

एक डीकंपलर बनाना एक साधारण काम नहीं है। असल में, आपको उस एप्लिकेशन को लेना होगा जिसे आप अपूर्ण कर रहे हैं (चाहे वह निष्पादन योग्य हो या संकलित अनुप्रयोग का कुछ अन्य रूप हो) और इसे किसी प्रकार के पेड़ में पार्स करें जिसे आप स्मृति में काम कर सकते हैं। फिर आप प्रोग्राम के प्रवाह का विश्लेषण करेंगे और उन पैटर को खोजने का प्रयास करेंगे जो सुझाव दे सकते हैं कि कोड में किसी निश्चित स्थान पर if कथन/चर/फ़ंक्शन/आदि का उपयोग किया गया था। यह वास्तव में सिर्फ एक अनुमान लगाने वाला गेम है: आपको उन पैटर्नों को जानना होगा जिन्हें संकलक संकलित कोड में बनाता है, फिर उन पैटर्न की खोज करें और उन्हें समकक्ष मानव-पठनीय स्रोत कोड के साथ बदलें।

यह जावा या .NET जैसे उच्च स्तरीय कार्यक्रमों के लिए बहुत आसान है, जहां आपको असेंबली निर्देशों से निपटने की ज़रूरत नहीं है, और चर जैसी चीजें अधिकतर आपके लिए ख्याल रखी जाती हैं। वहां, आपको अनुमान लगाने की आवश्यकता नहीं है जितना सीधे अनुवाद करना है। आपके पास सटीक चर/विधि नाम नहीं हो सकते हैं, लेकिन आप प्रोग्राम संरचना को कम से कम आसानी से कम कर सकते हैं।

अस्वीकरण: मैंने कभी एक डिकंपेलर नहीं लिखा है और इस बारे में मैं जो भी बात कर रहा हूं उसके बारे में हर विवरण नहीं जानता। यदि आप वास्तव में एक डिकंपेलर लिखने में रूचि रखते हैं, तो आपको विषय पर एक पुस्तक मिलनी चाहिए।

+0

हालांकि एक बनाने के पीछे सामान्य प्रिंसिपल क्या है? –

+0

दरअसल, आप अक्सर जावा के लिए परिवर्तनीय नाम और unstripped gcc डीबग-तैयार निष्पादन योग्य प्राप्त कर सकते हैं। – paxdiablo

+0

@paxdiablo: हाँ, यही कारण है कि मैंने वहां "ज्यादातर मामलों में" शामिल करना सुनिश्चित किया है, क्योंकि ऐसे कुछ मामले हैं जहां आप वास्तव में स्रोत कोड प्राप्त कर सकते हैं जो लगभग मूल के समान दिखता है। :) –

1

एक डीकंपलर मूल रूप से मशीन कोड लेता है और इसे वापस उस भाषा में वापस ले जाता है जिस पर इसे स्वरूपित किया गया था। अगर मुझे गलत नहीं लगता है, तो मुझे लगता है कि डिकंपेलर को यह जानने की जरूरत है कि यह किस भाषा में संकलित किया गया था, अन्यथा यह नहीं होगा काम।

डिकंपेलर का मूल उद्देश्य आपके स्रोत कोड पर वापस जाना है; उदाहरण के लिए, एक बार मेरी जावा फ़ाइल दूषित हो गई और एकमात्र चीज जो मैं इसे वापस लाने के लिए कर सकता था वह एक डिकंपेलर का उपयोग करके था (क्योंकि कक्षा फ़ाइल दूषित नहीं हुई थी)।

1

यह ऑब्जेक्ट कोड में क्या है "उचित" (कुछ ह्युरिस्टिक्स के आधार पर) को प्रस्तुत करके काम करता है। इसके उत्पादन के बीच समानता की डिग्री और मूल रूप से वहां पर निर्भर करता है कि बाइनरी में कितनी जानकारी शामिल होती है, इस पर निर्भर करता है। यदि आप मूल रूप से "शुद्ध" बाइनरी से शुरू करते हैं, तो यह आमतौर पर चर के लिए "उचित" नाम बनाने के साथ अटक जाता है, जैसे i, j और k लूप इंडेक्स के लिए और अधिकतर लोगों के लिए लंबे नामों का उपयोग करना।

दूसरी तरफ, आत्मनिरीक्षण का समर्थन करने वाली एक भाषा निष्पादन योग्य में परिवर्तनीय नाम, प्रकार आदि के बारे में अधिक जानकारी एम्बेड करने की आवश्यकता है। इस तरह के मामले में, डिकंपिलिंग मूल के बहुत करीब कुछ उत्पन्न कर सकती है, जैसे आम तौर पर कार्यों, चर, आदि के मूल नामों को बनाए रखना।ऐसे मामले में, डीकंपलर अक्सर को मूल के समान कुछ उत्पादित कर सकता है - संभवतः फ़ॉर्मेटिंग और टिप्पणियों से थोड़ा अधिक खोना।

0

यह इस बात पर निर्भर करता है कि आप किस भाषा को अपनाना चाहते हैं। यदि आप सी या सी ++ जैसे कुछ को कम कर रहे हैं, तो आपके लिए प्रदान की गई एकमात्र जानकारी फ़ंक्शन नाम और तर्क (डीएलएल में) है। यदि आप जावा से काम कर रहे हैं, तो संकलक आमतौर पर लाइन नंबर, चर नाम, फ़ील्ड और विधि नाम, और इसी तरह से सम्मिलित करता है। यदि कोई परिवर्तनीय नाम नहीं है, तो आपको localInt1, localInt2, localException1 जैसे नाम मिलेगा। या जो भी संकलक है। और यह रेखा संख्याओं के कारण, रेखाओं के बीच अंतर को बता सकता है।

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