2012-09-16 16 views
48

तो मुझे अभी पता चला है कि मेरे जावा कोड को कम करना कितना आसान है। मैं नेट के चारों ओर खोज कर रहा हूं और मुझे लगता है कि क्यों यह इतना आसान है। हर बार जब मैं कुछ ऐसा करता हूं "मैं .class फ़ाइलों को क्यों हटा सकता हूं?" या "जावा इतनी आसानी से क्यों डिकंपाइल करता है", मुझे लगता है कि सॉफ़्टवेयर के लिंक हैं जो आसानी से मेरे कोड को खराब कर सकते हैं। तो मैं आपके पास StackOverflow की ओर जाता हूं: क्यों यह है कि जावा को आसानी से पठनीय स्रोत कोड में परिवर्तित किया जा सकता है जबकि सी ++ और अन्य भाषाएं डिकंपलिंग के लिए बहुत अनुकूल नहीं हैं?जावा कोड को डीकंपाइल करना इतना आसान क्यों है?

धन्यवाद

+23

क्योंकि जावा वास्तव में कभी भी "संकलित" नहीं होता है जैसे सी ++ करता है। (कम से कम जब तक कि जेआईटी में नहीं आ जाता) – Mysticial

+2

यदि आप इसे कठिन बनाना चाहते हैं, तो ZKM जैसे उचित obfuscater का उपयोग करें। इसका नियंत्रण प्रवाह obfuscation किसी भी decompiler को आपके कोड को कम करने में सक्षम होने से रोक देगा; उपयोगकर्ता को पहले आपके कोड को हटाना होगा (जिसके लिए जेडकेएम और बाइट कोड इंजीनियरिंग का उच्च ज्ञान होना आवश्यक है)। – LanguagesNamedAfterCofee

+2

लेकिन सभी वर्गों को विघटित नहीं किया जा सका और सभी विघटित वर्गों को संशोधन के बिना वापस संकलित नहीं किया जा सकता है। –

उत्तर

55

क्योंकि जावा बाइट-कोड करीब (अधिक समान) है विधानसभा से स्रोत के लिए।

विशेष रूप से, .class फ़ाइलों classnames, विधि के नाम के लिए मेटाडाटा, क्षेत्र & पैरामीटर प्रकार, आदि ... शामिल
सभी एक जावा (या नेट) decompiler प्रत्येक विधि शरीर निर्देश पर देखने के करने की जरूरत, और उन्हें उपयुक्त वाक्य रचनात्मक संरचनाओं में बदल दें।

इसके विपरीत, सी ++ जैसी मूल भाषाओं में कोई मेटाडेटा शामिल नहीं है, इसलिए डिकंपेलर को सब कुछ पुनर्निर्माण की आवश्यकता है।

+9

इसके अलावा, जावा बाइटकोड देशी कोड के तरीके को अनुकूलित नहीं किया गया है, क्योंकि जावा निष्पादन समय पर कोड को अनुकूलित करने के लिए जेआईटीटर पर निर्भर करता है। – Dan

21

जावा को मध्यवर्ती रूप, जेवीएम बाइटकोड में संकलित किया गया है, जो मूल जावा कोड में मौजूद जानकारी की एक बड़ी मात्रा को बरकरार रखता है। सी ++ जैसी भाषा असेंबली कोड में संकलित होती है, मूल कोड से बहुत अलग दिखती है, और इसलिए, इसके विपरीत, विपरीत है।

+5

+1। तो बिंदु बाइटकोड है, जावा नहीं। जावा को x86 निर्देशों (http://www.excelsior-usa.com/jet.html, http://gcc.gnu.org/java/) में संकलित किया जा सकता है, और उसके बाद सी ++ के रूप में डिकंपाइल करना मुश्किल हो सकता है। –

+1

@AlexeiKaigorodov यदि परिणामस्वरूप कोड अभी भी प्रतिबिंब को काम करने की इजाजत देता है, तो यह सी ++ से डिकंपाइल करने के लिए अभी भी आसान होगा, क्योंकि यह बहुत सारे मेटाडेटा को रखता है। – Dave

+0

@ डेव: यह विधि-/वर्ग-स्तर की जानकारी के लिए सही है, * * के अंदर वास्तविक * निर्देश * .class' फ़ाइलों की तुलना में विघटन करना कठिन होगा। –

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