विघटन को रोकने के लिए संकलित जावा कक्षाओं को कैसे लॉक किया जाए?


96

मैं विघटन को रोकने के लिए संकलित जावा कक्षाओं को कैसे बंद कर सकता हूं?

मुझे पता है कि यह इंटरनेट पर बहुत अच्छी तरह से चर्चा का विषय होना चाहिए, लेकिन मैं उन्हें संदर्भित करने के बाद किसी भी निष्कर्ष पर नहीं आ सका।

बहुत से लोग पर्यवेक्षक का सुझाव देते हैं, लेकिन वे केवल कठिन-से-याद चरित्र अनुक्रमों के साथ वर्गों, विधियों और क्षेत्रों का नाम बदलकर करते हैं लेकिन संवेदनशील निरंतर मूल्यों के बारे में क्या?

उदाहरण के लिए, आपने पासवर्ड आधारित एन्क्रिप्शन तकनीक के आधार पर एन्क्रिप्शन और डिक्रिप्शन घटक विकसित किया है। अब इस मामले में, कोई भी औसत जावा व्यक्ति वर्ग फ़ाइल को विघटित करने के लिए JAD का उपयोग कर सकता है और आसानी से पासवर्ड मान (स्थिर के रूप में परिभाषित) के साथ-साथ नमक भी प्राप्त कर सकता है और बदले में छोटे स्वतंत्र कार्यक्रम लिखकर डेटा को डिक्रिप्ट कर सकता है!

या ऐसे संवेदनशील घटकों को मूल कोड (उदाहरण के लिए, वीसी ++) में बनाया जाना चाहिए और उन्हें जेएनआई के माध्यम से कॉल करना चाहिए ?


यहां तक ​​कि असंतुष्ट मूल कोड वैसे भी कुछ लोगों के लिए काफी पठनीय है, तो आपको इसे गैर-स्पष्ट बनाने के लिए संभवतः कुछ ऑबफसकेटर या हाथ से बने विधानसभा का उपयोग करना होगा (अनुकूलन के साथ संकलित सामान्य सी ++ पर्याप्त पठनीय है)। उपयोगकर्ता के डिवाइस पर जो भी कोड चलता है, उसे इंटरसेप्ट किया जा सकता है। यद्यपि इस तरह के अवरोधन की लागत / कौशल की आवश्यकताएं काफी अधिक हो सकती हैं, उदाहरण के लिए स्मार्ट-कार्ड "टैम्पर-प्रूफ" चिप्स कोड को तोड़ना मामूली नहीं है, केवल शीर्ष उपकरण और कौशल के साथ उल्लेखनीय है। जावा कक्षाओं के साथ ... मैं बहुत परेशान नहीं करूँगा, आप स्क्रिप्ट बच्चों को दूर करने के लिए उन्हें पर्याप्त रूप से एन्क्रिप्ट कर सकते हैं, अधिक नहीं।
पेड

जवाबों:


96

अधिक उन्नत जावा बाइटकोड ऑडीफ्यूसेटर में से कुछ सिर्फ क्लास नाम मैनलिंग की तुलना में बहुत अधिक है। उदाहरण के लिए, ज़ेलिक्स क्लासेमास्टर , आपके कोड प्रवाह को इस तरह से भी घसीट सकता है कि यह वास्तव में पालन करना कठिन हो जाता है और एक उत्कृष्ट कोड अनुकूलक के रूप में काम करता है ...

इसके अलावा कई ऑबफ्यूज़र्स भी आपके स्ट्रिंग स्थिरांक को हटाने और अप्रयुक्त कोड को हटाने में सक्षम हैं।

एक अन्य संभावित समाधान (जरूरी नहीं कि आपत्ति को छोड़कर) एन्क्रिप्टेड JAR फ़ाइलों और एक कस्टम क्लास लोडर का उपयोग किया जाए जो डिक्रिप्शन करता है (अधिमानतः मूल रनटाइम लाइब्रेरी का उपयोग करके)।

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

किसी भी मामले में आपको याद है कि जैसा कि एस्टोनियाई में कहा जाता है "ताले जानवरों के लिए हैं"। मतलब कि हर बिट कोड उपलब्ध है (मेमोरी में लोड) रनटाइम के दौरान और पर्याप्त कौशल, दृढ़ संकल्प और प्रेरणा देने के लिए, लोग आपके कोड को विघटित, अनसुना और हैक कर सकते हैं ... आपका काम बस इस प्रक्रिया को असुविधाजनक बनाने के लिए है। आप अभी भी काम कर सकते हैं ...


13
"जानवरों के लिए ताले हैं" के लिए +1। मुझे लगता है कि यहाँ उपयुक्त शब्द लिपि किडिज़ होगा।
सुरमा

आपका मतलब है GCJ, और यह मर चुका है।
लोर्ने का

1
कॉम्पोनियो जार फ़ाइल एन्क्रिप्शन भी मर चुका है। इसके बजाय जारप्रोटेक्टर का उपयोग करें ।
जे.प्रोफि

16

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


13

डिस्क्लेमर: मैं सुरक्षा विशेषज्ञ नहीं हूं।

यह एक बुरे विचार की तरह लगता है: आप किसी को 'छिपी' कुंजी के साथ एन्क्रिप्टेड सामान दे रहे हैं जो आप उसे देते हैं। मुझे नहीं लगता कि इसे सुरक्षित बनाया जा सकता है।

शायद विषम कुंजियाँ काम कर सकती हैं:

  • डिक्रिप्ट करने के लिए एक सार्वजनिक कुंजी के साथ एक एन्क्रिप्टेड लाइसेंस तैनात करें
  • ग्राहक को एक नया लाइसेंस बनाएं और उसे एन्क्रिप्शन के लिए भेजें
  • ग्राहक को एक नया लाइसेंस वापस भेजें।

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

आप प्रति ग्राहक एक अलग सार्वजनिक / निजी कुंजी जोड़ी रख सकते हैं यह सुनिश्चित करने के लिए कि आपको वास्तव में सही ग्राहक से सामान मिल रहा है - अब आप चाबियों के लिए जिम्मेदार हैं ...


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

12

कोई फर्क नहीं पड़ता कि आप क्या करते हैं, यह 'विघटित' हो सकता है। बिल्ली, आप बस इसे अलग कर सकते हैं। या अपने स्थिरांक खोजने के लिए एक मेमोरी डंप देखें। आप देखते हैं, कंप्यूटर को उन्हें जानना होगा, इसलिए आपके कोड की भी आवश्यकता होगी।

इसके बारे में क्या करना है?

अपने कोड में हार्डकॉस्ट स्थिरांक के रूप में कुंजी को शिप न करने का प्रयास करें: इसे प्रति उपयोगकर्ता सेटिंग के रूप में रखें। उस कुंजी को देखने के लिए उपयोगकर्ता को जिम्मेदार बनाएं।


6

@jatanp: या बेहतर अभी तक, वे विघटित कर सकते हैं, लाइसेंस कोड हटा सकते हैं, और recompile। जावा के साथ, मुझे नहीं लगता कि वास्तव में इस समस्या का एक उचित, हैक-प्रूफ समाधान है। जावा के साथ एक बुरी छोटी डोंगल भी इसे रोक नहीं सकती थी।

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

इसलिए, मुझे पूछना होगा कि क्या आपको वास्तव में कठोर सुरक्षा की आवश्यकता है जैसे आप अपने आवेदन के लिए मांग रहे हैं? आपका ग्राहक आधार कैसा दिखता है? (कॉर्पोरेट्स? या किशोर गेमर जनता, जहां यह एक मुद्दा अधिक होगा?)


वास्तव में, एक उचित, हैक-प्रूफ समाधान है जो btw एक डोंगल की तरह दिखता है: excelsior-usa.com/blog/excelsior-jet/…
दिमित्री लेसकोव

@DmitryLeskov 'हैक प्रतिरोधी', हो सकता है। लेकिन यह केवल एक गति है जो किसी को भी कोड में चाहता है। दिन के अंत में, बाइट कोड को अनएन्क्रिप्टेड होस्टेड प्लेटफ़ॉर्म पर चलाना होता है। पूर्ण विराम।
स्टु थॉम्पसन

आपने जिस पोस्ट से लिंक किया है, उसे आपने नहीं पढ़ा है। बाइटकोड को डोंगल के सीपीयू कोड में बदल दिया जाता है और एन्क्रिप्ट किया जाता है। जब अंतिम उपयोगकर्ता संरक्षित ऐप चलाता है, तो उस एन्क्रिप्टेड कोड को "डोंगल" में स्थानांतरित कर दिया जाता है। डोंगल डिक्रिप्ट करता है और इसे अपने सीपीयू पर चलाता है।
दिमित्री लेसकोव

2
कॉर्पोरेट किशोर gamers।
odiszapc

3

यदि आप एक लाइसेंसिंग समाधान की तलाश कर रहे हैं, तो आप TrueLicense API की जांच कर सकते हैं । यह असममित कुंजियों के उपयोग पर आधारित है। हालाँकि, इसका मतलब यह नहीं है कि आपके आवेदन को क्रैक नहीं किया जा सकता है। हर एप्लिकेशन को पर्याप्त प्रयास के साथ क्रैक किया जा सकता है। क्या वास्तव में महत्वपूर्ण है, जैसा कि स्टु ने उत्तर दिया , यह पता लगाना कि आपको कितनी मजबूत सुरक्षा की आवश्यकता है।


2

मुझे नहीं लगता कि कोई प्रभावी ऑफ़लाइन एंटीपाइरेसी पद्धति मौजूद है। वीडियोगेम उद्योग ने यह खोजने की कोशिश की है कि कई बार और उनके कार्यक्रमों को हमेशा क्रैक किया गया है। एकमात्र समाधान यह है कि प्रोग्राम को आपके सर्वर से जुड़ा हुआ ऑनलाइन चलाया जाना चाहिए, ताकि आप लिंचेंस कुंजी को सत्यापित कर सकें, और लाइसेंसधारक द्वारा एक बार में केवल एक सक्रिय संपर्क हो। यह कैसे Warcraft या डियाब्लो की दुनिया है काम करता है। यहां तक ​​कि मुश्किल भी सुरक्षा को बाईपास करने के लिए उनके लिए विकसित निजी सर्वर हैं।

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


2

आप बिना किसी डर के बाइट-कोड एन्क्रिप्शन का उपयोग कर सकते हैं।

तथ्य यह है कि कागज के ऊपर उद्धृत "क्रैकिंग जावा बाइट-कोड एन्क्रिप्शन" में एक तर्क दोष है। पेपर का मुख्य दावा चलनेClassLoader.defineClass(...) से पहले सभी वर्गों को डिक्रिप्ट किया जाना चाहिए और विधि को पारित किया जाना चाहिए । पर ये सच नहीं है।

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


वास्तव में आप एक पैच JVM का पता लगाने का इरादा कैसे करते हैं? वैसे भी, यह सब कुछ थोड़ा कठिन बना देता है।
सुरमा

क्या आप अपने ऐप लॉन्चर में डिफेंसक्लास () को कॉल नहीं कर सकते हैं? जब आप वह कॉल करते हैं, तो आपको वैसे भी डिक्रिप्टेड बाइट्स की एक सरणी में हाथ करना होगा। क्या वह दूसरा बिंदु नहीं है जहां मूल स्रोत लीक हो सकता है?
आरोही

4
मैं वास्तव में इस जवाब से सहमत नहीं हूं। मेरे लिए ऐसा लगता है, "प्रश्न: पाई खोजने का सबसे आसान तरीका क्या है? उत्तर: 2 * पाई लें और दो से विभाजित करें।" मैं इस विचार से असहमत नहीं हूं, लेकिन क्या आप अधिक विवरण शामिल कर सकते हैं? उदाहरण के लिए, क्या आपको उम्मीद है कि मुख्य कार्यक्रम शुद्ध जावा में लिखे जाएंगे? क्या इसमें वह कोड शामिल है जो संशोधनों की तलाश कर रहा है?
पैट्रिक एम

-1

प्रश्न: अगर मैं अपनी .class फ़ाइलों को एन्क्रिप्ट करता हूं और उन्हें उड़ने पर लोड और डिक्रिप्ट करने के लिए एक कस्टम क्लास लोडर का उपयोग करता हूं, तो क्या यह विघटन को रोक देगा?

A: जावा बाइट-कोड के अपघटन को रोकने की समस्या लगभग उतनी ही पुरानी है जितनी भाषा। बाजार पर उपलब्ध कई औज़ारों के औज़ार के बावजूद, नौसिखिए जावा प्रोग्रामर अपनी बौद्धिक संपदा की रक्षा के लिए नए और चतुर तरीके सोचते रहते हैं। इस जावा Q & A किस्त में, मैं चर्चा के मंचों पर अक्सर एक विचार के आसपास कुछ मिथकों को दूर करता हूं।

चरम आसानी जिसके साथ जावा .class फ़ाइलों को जावा स्रोतों में समेटा जा सकता है, जो मूल रूप से मिलते जुलते हैं, का जावा बाइट-कोड डिज़ाइन लक्ष्यों और ट्रेड-ऑफ़ के साथ बहुत कुछ है। अन्य बातों के अलावा, जावा बाइट कोड को कॉम्पैक्टनेस, प्लेटफ़ॉर्म इंडिपेंडेंस, नेटवर्क मोबिलिटी और बाइट-कोड दुभाषियों और जेआईटी (जस्ट-इन-टाइम) / हॉटस्पॉट डायनामिक कंपाइलर्स द्वारा विश्लेषण में आसानी के लिए डिज़ाइन किया गया था। यकीनन, संकलित .class फाइलें प्रोग्रामर के इरादे को स्पष्ट रूप से व्यक्त करती हैं ताकि वे मूल स्रोत कोड की तुलना में विश्लेषण करना आसान हो सकें।

कई चीजें की जा सकती हैं, अगर पूरी तरह से विघटन को रोकने के लिए नहीं, तो कम से कम इसे और अधिक कठिन बनाने के लिए। उदाहरण के लिए, एक पोस्ट-संकलन कदम के रूप में, आप बाइट कोड को या तो पढ़ने के लिए .class डेटा की मालिश कर सकते हैं या तो पढ़ने के लिए जब विघटित या कठिन हो तो वैध जावा कोड (या दोनों) में विघटित हो सकता है। पूर्व के लिए चरम विधि नाम ओवरलोडिंग कार्य अच्छी तरह से करने की तकनीक, और नियंत्रण संरचनाओं को बनाने के लिए नियंत्रण प्रवाह में हेरफेर करना जावा सिंटैक्स काम के माध्यम से प्रतिनिधित्व करना संभव नहीं है। अधिक सफल वाणिज्यिक पर्यवेक्षक इन और अन्य तकनीकों के मिश्रण का उपयोग करते हैं।

दुर्भाग्य से, दोनों दृष्टिकोणों को वास्तव में उस कोड को बदलना होगा जो जेवीएम चलाएगा, और कई उपयोगकर्ता डरते हैं (ठीक है इसलिए) कि यह परिवर्तन उनके अनुप्रयोगों में नए बग जोड़ सकता है। इसके अलावा, विधि और क्षेत्र का नाम बदलने से काम करना बंद हो सकता है। वास्तविक वर्ग और पैकेज के नाम बदलने से कई अन्य जावा एपीआई (JNDI (जावा नामकरण और निर्देशिका इंटरफ़ेस), URL प्रदाता, आदि) टूट सकते हैं। परिवर्तित नामों के अतिरिक्त, यदि क्लास बाइट-कोड ऑफ़सेट्स और सोर्स लाइन नंबरों के बीच संबंध को बदल दिया जाता है, तो मूल अपवाद स्टैक निशान को पुनर्प्राप्त करना मुश्किल हो सकता है।

फिर मूल जावा स्रोत कोड को बाधित करने का विकल्प है। लेकिन मूल रूप से यह समस्याओं के समान सेट का कारण बनता है। एन्क्रिप्ट, नहीं obfuscate?

शायद ऊपर आपने यह सोच लिया है, "ठीक है, क्या होगा यदि बाइट कोड में हेरफेर करने के बजाय मैं संकलन के बाद अपनी सभी कक्षाओं को एन्क्रिप्ट करता हूं और उन्हें जेवीएम (जो एक कस्टम क्लास लोडर के साथ किया जा सकता है) के अंदर मक्खी पर डिक्रिप्ट करता है? फिर जेवीएम मेरे द्वारा निष्पादित करता है मूल बाइट कोड और अभी तक डिकम्पाइल या रिवर्स इंजीनियर के लिए कुछ भी नहीं है, है ना? "

दुर्भाग्य से, आप गलत होंगे, यह सोचकर कि आप इस विचार के साथ आने वाले पहले व्यक्ति हैं और यह सोचकर कि यह वास्तव में काम करता है। और इसका कारण आपकी एन्क्रिप्शन योजना की ताकत से कोई लेना-देना नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.