जावा, VB.NET, C #, एक्शनस्क्रिप्ट 3.0 आदि जैसे बायटेकोड-आधारित वर्चुअल मशीन भाषाओं के साथ, आप कभी-कभी सुनते हैं कि इंटरनेट से कुछ डिकंपाइलर को डाउनलोड करना कितना आसान है, एक अच्छा समय इसके माध्यम से बायटेकोड चलाएं, और अक्सर, कुछ सेकंड के मामले में मूल स्रोत कोड से बहुत दूर नहीं आते हैं। माना जाता है कि इस तरह की भाषा विशेष रूप से इसके प्रति संवेदनशील होती है।
मैंने हाल ही में सोचना शुरू किया है कि आप इस बारे में देशी बाइनरी कोड के बारे में अधिक क्यों नहीं सुनते हैं, जब आप कम से कम जानते हैं कि यह मूल रूप से किस भाषा में लिखा गया था (और इस प्रकार, किस भाषा में डिकंपाइल करने की कोशिश की गई है)। एक लंबे समय के लिए, मुझे लगा कि यह सिर्फ इसलिए है क्योंकि देशी मशीन की भाषा बहुत अधिक क्रेज़ी और विशिष्ट बायोटेक की तुलना में अधिक जटिल है।
लेकिन बायटेकोड कैसा दिखता है? यह इस तरह दिख रहा है:
1000: 2A 40 F0 14
1001: 2A 50 F1 27
1002: 4F 00 F0 F1
1003: C9 00 00 F2
और देशी मशीन कोड क्या दिखता है (हेक्स में)? बेशक, यह इस तरह दिखता है:
1000: 2A 40 F0 14
1001: 2A 50 F1 27
1002: 4F 00 F0 F1
1003: C9 00 00 F2
और निर्देश कुछ हद तक समान मन के फ्रेम से आते हैं:
1000: mov EAX, 20
1001: mov EBX, loc1
1002: mul EAX, EBX
1003: push ECX
तो, कुछ देशी बाइनरी को C ++ में अपघटित करने की कोशिश करने के लिए भाषा को देखते हुए, C ++ का कहना है कि इसके बारे में क्या मुश्किल है? केवल दो विचार जो तुरंत दिमाग में आते हैं 1) यह वास्तव में यह है कि बायटेकोड की तुलना में बहुत अधिक जटिल है, या 2) इस तथ्य के बारे में कुछ है कि ऑपरेटिंग सिस्टम पगेट कार्यक्रमों और उनके टुकड़ों को तितर बितर करने के लिए बहुत अधिक समस्याएं पैदा करते हैं। यदि उन संभावनाओं में से एक सही है, तो कृपया समझाएं। लेकिन किसी भी तरह से, आप इसे मूल रूप से क्यों नहीं सुनते हैं?
ध्यान दें
मैं उत्तरों में से एक को स्वीकार करने वाला हूं, लेकिन मैं पहले कुछ का उल्लेख करना चाहता हूं। लगभग हर कोई इस तथ्य का उल्लेख कर रहा है कि मूल स्रोत कोड के विभिन्न टुकड़े एक ही मशीन कोड के लिए मैप कर सकते हैं; स्थानीय चर नाम खो गए हैं, आप नहीं जानते कि मूल रूप से किस प्रकार का लूप इस्तेमाल किया गया था, आदि।
हालाँकि दोनों के उदाहरण जो अभी उल्लेखित थे, मेरी दृष्टि में एक प्रकार के तुच्छ हैं। हालांकि कुछ उत्तर बताते हैं कि मशीन कोड और मूल स्रोत के बीच का अंतर इस तुच्छ चीज़ से बहुत अधिक है।
लेकिन उदाहरण के लिए, जब यह स्थानीय चर नामों और लूप प्रकार जैसी चीजों के लिए आता है, तो बायटेकोड इस जानकारी को खो देता है (कम से कम ActionScript 3.0 के लिए)। मैंने उस सामान को पहले एक डिकम्पॉइलर के माध्यम से वापस खींच लिया है, और मुझे वास्तव में परवाह नहीं थी कि एक चर कहा जाता था strMyLocalString:String
या loc1
। मैं अभी भी उस छोटे, स्थानीय दायरे में देख सकता हूं और देख सकता हूं कि बिना किसी परेशानी के इसका उपयोग कैसे किया जा रहा है। और एक for
पाश एक बहुत ही सटीक बात है एक के रूप मेंwhile
पाश, अगर आप इसके बारे में सोचते हैं। जब भी मैं irFuscator (जो, SecureSWF के विपरीत, केवल सदस्य चर और फ़ंक्शन नामों को रैंडमाइज़ करने से बहुत अधिक नहीं करता) के माध्यम से स्रोत को चलाएगा, तब भी यह ऐसा लगता था कि आप छोटी कक्षाओं में कुछ चर और कार्यों को अलग करना शुरू कर सकते हैं, आंकड़ा उनका उपयोग कैसे किया जाता है, अपने नाम उन्हें सौंप दें, और वहां से काम करें।
इसके लिए एक बड़ा सौदा होने के लिए, मशीन कोड को उससे बहुत अधिक जानकारी खोने की आवश्यकता होगी, और कुछ उत्तर इस पर जाते हैं।