दिलचस्प पोस्ट
एंड्रॉइड: सटीक ऊंचाई कैसे प्राप्त करें? पुनरावर्तक में पुनरावर्तक क्या पोर्टेबल तरीके से सरणी के लिए प्लेसमेंट नई इस्तेमाल किया जा सकता है? उथले मर्ज के बजाय गहरी मर्ज कैसे करें? फ्लास्क में स्थिर फ़ाइलों की सेवा कैसे करें सामग्री-व्यवस्था: "इनलाइन" और "अनुलग्नक" के बीच अंतर क्या हैं? सी #% AppData% के पथ को प्राप्त करना data.table बनाम dplyr: क्या एक अच्छी तरह से कुछ कर सकता है जो अन्य नहीं कर सकता है या खराब नहीं कर सकता है? कैसे एक स्ट्रिंग को तारीख में परिवर्तित करने के लिए mysql? लिंक क्लिक होने पर जावास्क्रिप्ट फ़ंक्शन काम नहीं करता है कोणीय जे एस एनजी क्लास सशर्त जॉप्शनपैन.शोइनपुटडियलोग में एकाधिक इनपुट एक्सएमएल का उपयोग कर एक्शनबार एक्टिविटी के एक्शनबार का पृष्ठभूमि का रंग कैसे बदल सकता हूं? JSON ऑब्जेक्ट स्ट्रिंग से सी # क्लास फ़ाइल को स्वत: जनरेट कैसे करें सीसीवी को एन्कोड करने के लिए कुशलतापूर्वक पार्स करने का सबसे मजबूत तरीका क्या है?

रिवर्स इंजीनियरिंग से निष्पादन योग्य रक्षा?

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

अब यह मेरे लिए एक नया विषय है, और इंटरनेट वास्तव में रिवर्स इंजीनियरिंग के खिलाफ रोकथाम के लिए संसाधन नहीं है बल्कि इसके बारे में कई जानकारी दर्शाती है कि कैसे इंजीनियर को रिवर्स करना है

मैंने अभी तक सोचा है कि कुछ चीजें हैं:

  • कोड इंजेक्शन (वास्तविक फ़ंक्शन कॉल से पहले और बाद में डमी फ़ंक्शन को कॉल करना)
  • कोड ओब्बस्स्ट्रक्शन (बाइनरी के डिस्प्लेक्शन का उलझाव)
  • अपना स्टार्टअप दिनचर्या लिखें (डिबगर्स को बाइंड करने के लिए कठिन)

    void startup(); int _start() { startup( ); exit (0) } void startup() { /* code here */ } 
  • डीबगर्स के लिए रनटाइम चेक (और पता लगाए जाने पर बाहर निकलें)

  • समारोह trampolines

      void trampoline(void (*fnptr)(), bool ping = false) { if(ping) fnptr(); else trampoline(fnptr, true); } 
  • बेकार आवंटन और deallocations (स्टैक एक बहुत कुछ बदलता है)

  • बेतरतीब डमी कॉल और ट्रैम्पॉलिन्स (डिस्मैटैंग आउटपुट में कूदने के टन)
  • कास्टिंग के टोंस (अस्पष्ट disassembly के लिए)

मेरा मतलब ये है कि ये कुछ चीजें जिनके बारे में मैंने सोचा था, लेकिन वे सभी के आसपास काम किया जा सकता है या कोड विश्लेषकों द्वारा सही समय सीमा प्रदान किए जा सकते हैं। क्या मेरे पास कोई अन्य विकल्प है?

वेब के समाधान से एकत्रित समाधान "रिवर्स इंजीनियरिंग से निष्पादन योग्य रक्षा?"

क्या अंबर ने कहा ठीक है ठीक है आप रिवर्स इंजीनियरिंग को कठिन बना सकते हैं, लेकिन आप इसे कभी भी नहीं रोक सकते। आपको रिवर्स इंजीनियरिंग की रोकथाम पर भरोसा रखने वाले "सुरक्षा" पर भरोसा नहीं करना चाहिए।

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

लेकिन वे सबके आसपास काम किया जा सकता है या कोड एनालिसिस द्वारा सही समय सीमा को देखते हुए इसका पता लगाया जा सकता है

यदि आप लोगों को एक प्रोग्राम देते हैं जो वे चलाने में समर्थ हैं, तो वे रिवर्स-इंजीनियर को पर्याप्त समय दिए भी सक्षम होंगे। यही कार्यक्रमों की प्रकृति है जैसे ही द्विआधारी किसी को समझना चाहता है, आप अंतिम रिवर्स-इंजीनियरिंग को रोक नहीं सकते हैं। आखिरकार, कंप्यूटर को इसे चलाने के लिए इसे समझने में सक्षम होना चाहिए, और इंसान केवल एक धीमी कंप्यूटर है।

सुरक्षित नेट सीनिनेल (पूर्व में अलादीन) यद्यपि चेतावनियां – उनके एपीआई बेकार हैं, प्रलेखन बेकार है, और उन दोनों को अपने एसडीके टूल की तुलना में महान हैं

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

हम एचएसपी एचएल संरक्षण को लागू करने से पहले, 7 ज्ञात समुद्री डाकू थे, जिन्होंने उत्पाद से डॉटस्कसेटर की सुरक्षा को छीन लिया था। हमने सॉफ्टवेयर में एक प्रमुख अद्यतन के रूप में एक ही समय में HASP संरक्षण जोड़ा है, जो वास्तविक समय में वीडियो पर कुछ भारी गणना करता है। सबसे अच्छा मैं प्रोफाइलिंग और बेंचमार्किंग से कह सकता हूं, हास्प एचएल संरक्षण केवल 3% से गहन गणना को धीमा कर दिया। चूंकि उस सॉफ़्टवेयर को लगभग 5 साल पहले जारी किया गया था, इसलिए उत्पाद का एक नया समुद्री डाकू पाया नहीं गया है। यह सॉफ्टवेयर जो इसे सुरक्षित करता है वह बाजार के क्षेत्र में अत्यधिक मांग में है, और ग्राहक कई प्रतिद्वंद्वियों से परिचित है जो सक्रिय रूप से इंजीनियर को रिवर्स करने की कोशिश कर रहा है (सफलता के बिना अभी तक)। हम जानते हैं कि उन्होंने रूस के कुछ समूहों से सहायता मांगने की कोशिश की है जो सॉफ्टवेयर संरक्षण को तोड़ने के लिए एक सेवा का विज्ञापन करती है, क्योंकि विभिन्न समाचार समूहों और मंचों पर कई पदों में संरक्षित उत्पाद के नए संस्करण शामिल हैं

हाल ही में हमने एक छोटे प्रोजेक्ट पर अपने सॉफ़्टवेयर लाइसेंस समाधान (एचएएसपी एसएल) की कोशिश की, जो काम करने के लिए सीधी आसान था अगर आप पहले से ही एचएल उत्पाद से परिचित हैं यह काम करने के लिए प्रतीत होता है; कोई चोरी की चोरी की घटनाओं की जानकारी नहीं है, लेकिन यह उत्पाद मांग में बहुत कम है ..

बेशक, कोई सुरक्षा सही नहीं हो सकती। अगर कोई पर्याप्त रूप से प्रेरित है और जला करने के लिए गंभीर नकदी है, तो मुझे यकीन है कि HASP द्वारा उठाए गए सुरक्षा को खारिज किया जा सकता है।

उदाहरण के लिए, एईएस एल्गोरिथम ले लो। यह बहुत ही, बहुत सार्वजनिक एल्गोरिथ्म है, और यह बहुत सुरक्षित है क्यूं कर? दो कारण: बहुत सारे स्मार्ट लोगों द्वारा इसकी समीक्षा की गई है, और "गुप्त" हिस्सा खुद एल्गोरिदम नहीं है – गुप्त हिस्सा कुंजी है जो एल्गोरिदम के लिए एक इनपुट है। कोड को गुप्त बनाने की बजाय, आपके प्रोटोकॉल को एक "गुप्त" के साथ डिजाइन करने का एक बेहतर तरीका है जो आपके कोड के बाहर है कोड को हमेशा कोई मायने नहीं समझा जा सकता है कि आप क्या करते हैं, और (आदर्श रूप से) उत्पन्न किए गए रहस्य को केवल बड़े पैमाने पर क्रूर बल के दृष्टिकोण या चोरी के द्वारा खतरे में डाला जा सकता है।

मुझे लगता है कि एक दिलचस्प सवाल यह है, "आप अपने कोड को अस्पष्ट क्यों करना चाहते हैं?" आप अपने एल्गोरिदम को क्रैक करने के लिए हमलावरों के लिए मुश्किल बनाना चाहते हैं? अपने कोड में शोषण करने वाली कीड़े खोजने के लिए उन्हें कठिन बनाने के लिए? यदि कोड पहले स्थान पर अनुपस्थित था तो आपको कोड को अस्पष्ट करने की आवश्यकता नहीं होगी। समस्या की जड़ तोड़फोड़ सॉफ्टवेयर है अपनी समस्या की जड़ को ठीक करें, न सिर्फ उसे ढंकाएं

साथ ही, आप अपना कोड अधिक भ्रमित करते हैं, यह आपके लिए सुरक्षा कीड़े खोजने के लिए कठिन होगा। हां, यह हैकर्स के लिए कठिन होगा, लेकिन आपको बगों को भी ढूंढना होगा कोड को अब तक बनाए रखना आसान होना चाहिए, और यहां तक ​​कि अच्छी तरह से लिखित स्पष्ट कोड बनाए रखना मुश्किल हो सकता है। इसे खराब न करें

सबसे अच्छा विरोधी डिस्साइमर ट्रिक्स, विशेष रूप से चर शब्द लंबाई अनुदेश सेट पर कोडांतरक / मशीन कोड में हैं, न कि सी। उदाहरण के लिए

 CLC BCC over .byte 0x09 over: 

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

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

उपरोक्त पुरानी और अच्छी तरह से ज्ञात हैं, मुझे यह पता करने के लिए मौजूदा उपकरण के बारे में पर्याप्त जानकारी नहीं है कि क्या वे पहले से ही ऐसी चीजों के साथ काम कर रहे हैं। स्वयं को संशोधित कोड डीबगर का दौरा कर सकता / कर सकता है, लेकिन मानव समस्या में संकीर्ण / संकीर्ण हो सकता है और उसके बाद स्वयं को संशोधित कोड देख सकता है और उसके आस-पास काम करता है।

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

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

रिवर्स-इंजिनियर को कोड मुश्किल बनाकर कोड ओब्स्फ्यूसेक्शन कहा जाता है।

आपके द्वारा उल्लेख की गई अधिकांश तकनीकों के आसपास काम करना काफी आसान है वे कुछ बेकार कोड जोड़ने पर केंद्र लेकिन बेकार कोड का पता लगाने और हटाने के लिए आसान है, आपको एक साफ कार्यक्रम छोड़कर

प्रभावी रूप से अस्पष्टता के लिए, आपको निष्पादित होने वाले बेकार बिटों पर निर्भर अपने प्रोग्राम के व्यवहार को बनाने की आवश्यकता है। उदाहरण के लिए, ऐसा करने के बजाय:

 a = useless_computation(); a = 42; 

यह करो:

 a = complicated_computation_that_uses_many_inputs_but_always_returns_42(); 

या ऐसा करने के बजाय:

 if (running_under_a_debugger()) abort(); a = 42; 

ऐसा करें (जहां running_under_a_debugger एक फ़ंक्शन के रूप में आसानी से पहचाने जाने योग्य नहीं है, यह running_under_a_debugger कि कोड डीबगर के अंतर्गत चल रहा है या नहीं – यह डिबगर पता लगाने के साथ उपयोगी कंप्यूटेशन को मिला देना चाहिए):

 a = 42 - running_under_a_debugger(); 

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

 some_function(); 

ऐसा करें, जहां आप some_data_structure में बिट्स के सटीक अपेक्षित लेआउट को जानते हैं:

 goto (md5sum(&some_data_structure, 42) & 0xffffffff) + MAGIC_CONSTANT; 

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

अब जब मैंने आपको बताया है कि अस्पष्टता कठिन है और महंगा है, मैं आपको यह बताने जा रहा हूं कि यह आपके लिए भी नहीं है । तुम लिखो

वर्तमान प्रोटोकॉल जिस पर मैं काम कर रहा हूं, कभी भी विभिन्न लोगों की सुरक्षा के लिए निरीक्षण या समझने योग्य नहीं होना चाहिए

यह एक लाल झंडा उठाता है यह अस्पष्टता की सुरक्षा है , जिसमें बहुत खराब रिकॉर्ड है। अगर प्रोटोकॉल की सुरक्षा प्रोटोकॉल को नहीं जानती लोगों पर निर्भर करती है, तो आप पहले ही खो गए हैं

अनुशंसित पाठ:

  • सुरक्षा बाइबल: रॉस एंडरसन द्वारा सुरक्षा इंजीनियरिंग
  • अस्पष्ट बाइबल: क्रिश्चियन कोल्बर्ग और जसवीर नागरा द्वारा अभियुक्त सॉफ्टवेयर

कई बार, आपके उत्पाद का डर है कि रिवर्स इंजीनियर बनना गलत है। हाँ, यह रिवर्स इंजीनियर हो सकता है; लेकिन यह थोड़े समय के लिए इतना प्रसिद्ध हो जाएगा, कि हैकर्स इसे उलटा करने के लिए लायक मिलेगा। यह? (यह काम कोड की पर्याप्त पंक्तियों के लिए थोड़ी सी समय की गतिविधि नहीं है)।

अगर यह वास्तव में एक पैसा अर्जक बन जाता है, तो आपको कानूनी तरीके जैसे पेटेंट और / या कॉपीराइट के उपयोग से बचाने के लिए पर्याप्त पैसा इकट्ठा करना चाहिए था

आईएमएचओ, मूल सावधानी बरतें जो आप ले जा रहे हैं और इसे छोड़ दें। यदि यह रिवर्स इंजीनियरिंग का एक बिंदु बन जाता है तो इसका मतलब है कि आपने एक अच्छी नौकरी की है, तो आप इसे दूर करने के लिए बेहतर तरीके ढूंढेंगे। सौभाग्य।

http://en.wikipedia.org/wiki/Security_by_obscurity#Arguments_against का एक पठन लें। मुझे यकीन है कि अन्य शायद एक बेहतर स्रोत भी दे सकते हैं कि क्यों अंधकार द्वारा सुरक्षा एक बुरी चीज है

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

जुलाई 2013 के बाद से, क्रिप्टोग्राफ़िक रूप से मजबूत अस्पष्टता ( अनूरेबिलिटी ऑब्बिस्केक्शन के रूप में ) में नए सिरे से ब्याज दिया गया है, जो अमित सहाय से मूल शोध से प्रेरित था।

  • सभी सर्किटों के लिए सहायक , गर्ग, नृत्यांगना, हेलवी, रेकोवा, जल, उम्मीदवार अस्पष्टता और कार्यात्मक एन्क्रिप्शन (21 जुलाई, 2013)।
  • सहाय, जल, कैसे पहचानने योग्यता अव्यवस्था का उपयोग करें: डेनिज एन्क्रिप्शन, और अधिक
  • सहाय, बराक, गर्ग, कलई, पानथ, बीबीयिक हमलों के खिलाफ सुरक्षा का संरक्षण (4 फरवरी, 2014)।

आप इस क्वांटा पत्रिका लेख में और आईईईई स्पेक्ट्रम लेख में कुछ डिस्टिल्ड जानकारी पा सकते हैं।

वर्तमान में इस तकनीक का उपयोग करने के लिए आवश्यक संसाधनों की मात्रा इसे अव्यवहारिक बना देती है, लेकिन AFAICT सर्वसम्मति भविष्य के बारे में आशावादी नहीं है।

मैं यह बहुत लापरवाही से कहता हूं, लेकिन हर किसी को जो आसानी से अस्पष्टता प्रौद्योगिकी को खारिज करने के लिए इस्तेमाल किया जाता है – यह अलग है अगर यह सचमुच काम कर रहा है और व्यावहारिक साबित हुआ है, यह वास्तव में प्रमुख है, और सिर्फ अस्पष्टता के लिए नहीं है

अगर कोई समय आपके बाइनरी को रिवर्स करने के लिए समय बिताना चाहता है तो आप उनको रोकने के लिए कुछ भी नहीं कर सकते। आप अगर मामूली अधिक कठिन बना सकते हैं लेकिन इसके बारे में है अगर आप वास्तव में इस बारे में जानना चाहते हैं तो http://www.hex-rays.com/idapro/ की एक प्रति प्राप्त करें और कुछ बिनरियों को अलग करें।

तथ्य यह है कि सीपीयू को कोड निष्पादित करने की ज़रूरत है, वह आपके पूर्ववत है। सीपीयू केवल मशीन कोड निष्पादित करता है … और प्रोग्रामर मशीन कोड पढ़ सकते हैं।

कहा जा रहा है … आप की संभावना एक अलग मुद्दा है जो एक और रास्ता हल किया जा सकता है क्या आप रक्षा करने की कोशिश कर रहे हैं? आपकी समस्या के आधार पर आप अपने उत्पाद की सुरक्षा के लिए एन्क्रिप्शन का उपयोग कर सकते हैं।

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

मैं इस साहित्य के पीछे हूं, परन्तु एक अनिवार्य विचार जिसे मैं जानता हूं, यह है कि आप किसी आक्रमणकर्ता को उस कोड को देखने से नहीं रोक पाएंगे, जिसे आप निष्पादित करेंगे, लेकिन आप उस कोड के साथ इसे घेर सकते हैं जो निष्पादित नहीं है , और इसकी लागत एक हमलावर घातीय समय (सर्वोत्तम ज्ञात तकनीकों का उपयोग करके) यह पता लगाने के लिए कि आपके कोड के कौन-से टुकड़े निष्पादित होते हैं और जो नहीं हैं।

हाल ही में एक पेपर है जिसे " प्रोग्राम ऑब्स्ट्रसेशन एंड वन-टाइम प्रोग्राम " कहा जाता है। यदि आप वास्तव में अपने आवेदन की सुरक्षा के बारे में गंभीर हैं सरल और सार्वभौमिक हार्डवेयर के प्रयोग से सामान्य रूप से कागज सैद्धांतिक असंभव परिणाम के आसपास चला जाता है।

अगर आप अतिरिक्त हार्डवेयर की जरूरत नहीं उठा सकते हैं, तो एक अन्य पेपर भी है जो सैद्धांतिक रूप से सबसे अच्छा संभव ऑब्सफ्यूसेक्शन देता है " सबसे अच्छा संभव ओब्स्फ्यूसेकेशन ", एक ही कार्यक्षमता और समान आकार वाले सभी प्रोग्रामों के बीच। हालांकि काग़ज़ से पता चलता है कि सूचना-सर्वोत्तम सिद्धांत संभवतः बहुपद पदानुक्रम का पतन दर्शाता है।

यदि ये परिणाम आपकी आवश्यकताओं के लिए काम नहीं करते हैं तो उन कागजात को कम से कम आपको संबंधित साहित्य में चलने के लिए पर्याप्त पुस्तकालय की ओर ले जाना चाहिए।

अद्यतन: अस्पष्टता की एक नई धारणा, जिसे अप्रभेद्य अस्पष्टता कहा जाता है, असंभव परिणाम (पेपर) को कम कर सकता है

कोई पासा नहीं, आप अपने कोड को जुदाई से नहीं बचा सकते आप क्या कर सकते हैं व्यापार लॉजिक के लिए सर्वर सेट अप करें और अपने ऐप के लिए इसे प्रदान करने के लिए webservice का उपयोग करें। बेशक, यह परिदृश्य हमेशा संभव नहीं होता है

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

लेकिन यह अब और सुरक्षित नहीं है .. और इससे कोई फर्क नहीं पड़ता कि आप अपने कोड को कैसे पैक करते हैं, आप हमेशा किसी लोड किए गए निष्पादन योग्य मेमोरी डंप कर सकते हैं और इसे आईडीए प्रो जैसे किसी डिस्साइम्बलर से अलग कर सकते हैं।

आईडीए प्रो भी सी स्रोत कोड ट्रांसफार्मर के लिए एक निफ्टी असेंबली कोड के साथ आता है, हालांकि उत्पन्न कोड एक सूचक / पते गणितीय गंदगी की तरह अधिक दिखेगा .. अगर आप मूल से इसकी तुलना करते हैं तो आप सभी त्रुटियों को ठीक कर सकते हैं और कुछ भी चीर कर सकते हैं।

संभवत: आपका सबसे अच्छा विकल्प अभी भी वर्चुअलाइजेशन का उपयोग कर रहा है, जो अन्य तरक्की का परिचय देता है, जिसे बायपास करने के लिए आवश्यक है, लेकिन जैसा कि एसएसपोक ने अपने जवाब में कहा, यह तकनीक 100% सुरक्षित भी नहीं है


मुद्दा यह है कि आपको अंतिम सुरक्षा नहीं मिलेगी, क्योंकि ऐसी कोई चीज नहीं है, और यदि कभी भी हो, तो यह लंबे समय तक नहीं रहेगा, जिसका अर्थ है कि यह पहली जगह पर अंतिम सुरक्षा नहीं थी।

जो भी मनुष्य इकट्ठा होता है, वह अलग हो सकता है।

यह आमतौर पर सच है कि (उचित) disassembling अक्सर (थोड़ा या अधिक) कठिन काम है, तो आपके प्रतिद्वंद्वी अधिक कुशल होना चाहिए, लेकिन आप मान सकते हैं कि वहाँ हमेशा इस तरह की गुणवत्ता में से किसी एक है, और यह एक सुरक्षित शर्त है

यदि आप आरई के विरुद्ध कुछ बचाव करना चाहते हैं, तो आपको आरई द्वारा इस्तेमाल की गई कम से कम सामान्य तकनीक जानना चाहिए।

इस प्रकार शब्द

रिवर्स इंजीनियरिंग के प्रति रोकथाम के लिए इंटरनेट वास्तव में संसाधनकारी नहीं है, बल्कि इंजीनियर को रिवर्स करने के बारे में कई जानकारी दर्शाती है

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

(सॉफ़्टवेयर का उदाहरण गलत तरीके से सुरक्षा का उपयोग कर रहा है, इस तरह की सुरक्षा को व्यावहारिक रूप से अस्तित्वहीन बनाते हैं। अस्पष्ट बोलने से बचने के लिए मैं आपको इंटरनेट पर संक्षेप में वर्णित एक उदाहरण देता हूँ: सीडी-रॉम v4 पर ऑक्सफोर्ड इंग्लिश डिक्शनरी सेकंड एडिशन। निम्न पृष्ठ में SecuROM का इसका असफल उपयोग: CD-ROM पर 16-, 32-, या 64-bit Windows वातावरण में ऑक्सफ़ोर्ड इंग्लिश डिक्शनरी (OED): हार्ड डिस्क इंस्टॉलेशन, बग, वर्ड प्रसंस्करण मैक्रोज़, नेटवर्किंग, फॉन्ट, और तो आगे )

सब कुछ समय लगता है

यदि आप इस विषय में नए हैं और आपके पास आरई सामान में ठीक से आने के लिए महीनों या सालों के लिए नहीं है, तो अन्य लोगों द्वारा उपलब्ध समाधानों के साथ जाएं। यहां समस्या स्पष्ट है, वे पहले से ही मौजूद हैं, इसलिए आप पहले से ही जानते हैं कि वे 100% सुरक्षित नहीं हैं, लेकिन अपनी नई सुरक्षा बनाने से आपको केवल एक झूठी भावना की रक्षा की जानी होगी, जब तक आप वास्तव में कला की अच्छी तरह से जानते नहीं रिवर्स इंजीनियरिंग और सुरक्षा (लेकिन आप इस समय कम से कम नहीं)।

सॉफ़्टवेयर सुरक्षा का मुद्दा, नए लोगों को डराता है, आम आरई को बेचता है, और अपने आवेदन के केंद्र के लिए (उम्मीद की दिलचस्प) यात्रा के बाद अनुभवी आरई के चेहरे पर मुस्कान डालता है।

व्यापारिक बातचीत में आप कह सकते हैं कि यह प्रतियोगिता में देरी के बारे में है, जितना संभव हो उतना संभव है।

(ब्लैकहैट 2006 में दिखाए गए फिलिप बियोनडी और फैब्रिस डिसक्लेक्स द्वारा स्काइप में अच्छा प्रस्तुति रजत सुई को देखें )।


आप जानते हैं कि वहाँ आरई के बारे में बहुत सारी चीज़ें हैं, इसलिए इसे पढ़ने शुरू करें। 🙂

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

मुझे नहीं लगता है कि कोई भी कोड अबाधनीय है, लेकिन इसके लिए किसी के लिए प्रयास करना चाहते हैं, इसके लिए पुरस्कारों को महान होना चाहिए।

ऐसा करने के बाद कहा गया है कि ऐसी बातें हैं जिन्हें आप करना चाहिए:

  • उच्चतम अनुकूलन स्तर का उपयोग संभव (रिवर्स इंजीनियरिंग न केवल असेंबली अनुक्रम पाने के बारे में है, यह कोड को समझने और इसे उच्च-स्तरीय भाषा जैसे सी के रूप में समेटने के बारे में है)। बेहद अनुकूलित कोड का पालन करने के लिए बी-एच हो सकता है।
  • संरचनाओं को घने से ज़्यादा ज़्यादा डेटा प्रकार की आवश्यकता नहीं है। आधिकारिक कोड रिलीज के बीच पुनर्व्यवस्थित संरचना के सदस्यों। संरचनाओं में छंटनी बिट क्षेत्रों में भी कुछ भी आप उपयोग कर सकते हैं।
  • आप कुछ निश्चित मूल्यों की उपस्थिति की जांच कर सकते हैं जिन्हें बदला नहीं जाना चाहिए (एक कॉपीराइट संदेश एक उदाहरण है)। यदि एक बाइट वेक्टर में "vwxyz" होता है तो आप "एबीसीडीई" वाला एक अन्य बाइट वेक्टर बना सकते हैं और अंतर की तुलना कर सकते हैं। ऐसा करने वाला फ़ंक्शन वैक्टर को पॉइंटर्स नहीं पास किया जाना चाहिए, लेकिन अन्य मॉड्यूल में परिभाषित बाहरी पॉइंटर्स का प्रयोग करें (छद्म-सी कोड) "चार * p1 = और स्ट्रिंग 1 [539];" और "चार पी 2 = और स्ट्रिंग 2 [-11731];" इस तरह से दो स्ट्रिंग्स पर बिल्कुल इंगित करने वाला कोई संकेत नहीं होगा। तुलना कोड में आप " (पी 1-539 + आई) – * (पी 2 + 11731 + आई) == कुछ मान" के लिए तुलना करें। क्रैकर को लगता है कि यह स्ट्रिंग 1 को बदलने के लिए सुरक्षित है क्योंकि कोई इसे संदर्भित नहीं करता है। कुछ अप्रत्याशित जगह में परीक्षा दफनाने

यह देखना है कि क्या आसान है और क्या करना मुश्किल है, यह विधानसभा कोड को अपने आप को हैक करने का प्रयास करें। विचारों को पॉप अप करना चाहिए ताकि आप इंजीनियर को रिवर्स करने के लिए कोड को और अधिक मुश्किल बनाने के लिए प्रयोग कर सकें और डिबगिंग को और अधिक कठिन बना सकें।

As many already said: On a regular CPU you cant stop them from doing, you can just delay them. As my old crypto teacher told me: You dont need perfect encryption, breaking the code must be just more expensive than the gain. Same holds for your obfuscation.

But 3 additional notes:

  1. It is possible to make reverse engineering impossible, BUT (and this is a very very big but), you cant do it on a conventional cpu. I did also much hardware development, and often FPGA are used. Eg the Virtex 5 FX have a PowerPC CPU on them, and you can use the APU to implement own CPU opcodes in your hardware. You could use this facility to really decrypt incstuctions for the PowerPC, that is not accessible by the outside or other software, or even execute the command in the hardware. As the FPGA has builtin AES encryption for its configuration bitstream, you could not reverse engineer it (except someone manages to break AES, but then I guess we have other problems…). This ways vendors of hardware IP also protect their work.

  2. You speak from protocol. You dont say what kind of protocol it is, but when it is a network protocol you should at least protect it against network sniffing. This can you indeed do by encryption. But if you want to protect the en/decryption from an owner of the software, you are back to the obfuscation.

  3. Do make your programm undebuggable/unrunnable. Try to use some kind of detection of debugging and apply it eg in some formula oder adding a debug register content to a magic constant. It is much harder if your program looks in debug mode is if it where running normal, but makes a complete wrong computation, operation, or some other. Eg I know some eco games, that had a really nasty copy-protection (I know you dont want copyprotection, but it is similar): The stolen version altered the mined resources after 30 mins of game play, and suddenly you got just a single resource. The pirate just cracked it (ie reverse engineered it) – checked if it run, and volia released it. Such slight behaviour changings are very hard to detect, esp. if they do not appear instantly to detection, but only delayed.

So finally I would suggest: Estimate what is the gain of the people reverse engineering your software, translate this into some time (eg by using the cheapest indian salary) and make the reverse engineering so time costing that it is bigger.

To be able to select the right option, You should think of the following aspects:

  1. Is it likely that "new users" do not want to pay but use Your software?
  2. Is it likely that existing customers need more licences than they have?
  3. How much are potential users willing to pay?
  4. Do You want to give licences per user / concurrent users / workstation / company?
  5. Does Your software need training / customization to be useful?

If the answer to question 5 is "yes", then do not worry about illegal copies. They wouldn't be useful anyway.

If the answer to question 1 is "yes", then first think about pricing (see question 3).

If You answer questions 2 "yes", then a "pay per use" model might be appropriate for You.

From my experience, pay per use + customization and training is the best protection for Your software, because:

  • New users are attracted by the pricing model (little use -> little pay)
  • There are almost no "anonymous users", because they need training and customization.
  • No software restrictions scares potential customers away.
  • There is a continuous stream of money from existing customers.
  • You get valuable feedback for development from Your customers, because of a long-term business relationship.

Before You think of introducing DRM or obfuscation, You might think of these points and if they are applicable to Your software.

To avoid reverse engineering, you must not give the code to users. That said, I recommend using an online application…however (since you gave no context) that could be pointless on yours.

Contrary to what most people say, based on their intuition and personal experience, I don't think cryptographically-safe program obfuscation is proven to be impossible in general.

This is one example of a perfectly obfuscated program statement to demonstrate my point:

 printf("1677741794\n"); 

One can never guess that what it really does is

 printf("%d\n", 0xBAADF00D ^ 0xDEADBEEF); 

There is an interesting paper on this subject, which proves some impossibility results. It is called "On the (Im)possibility of Obfuscating Programs" .

Although the paper does prove that the obfuscation making the program non-distinguishable from the function it implements is impossible, obfuscation defined in some weaker way may still be possible!

Security through obscurity doesn't work as has been demonstrated by people much cleverer than the both of us. If you must protect the communication protocol of your customers then you are morally obliged to use the best code that is in the open and fully scrutinized by experts.

This is for the situation where people can inspect the code. If your application is to run on an embedded microprocessor, you can choose one that has a sealing facility, which makes it impossible to inspect the code or observe more than trivial parameters like current usage while it runs. (It is, except by hardware invading techniques, where you carefully dismantle the chip and use advanced equipment to inspect currents on individual transistors.)

I'm the author of a reverse engineering assembler for the x86. If you're ready for a cold surprise, send me the result of your best efforts. (Contact me through my websites.) Few I have seen in the answers would present a substantial hurdle to me. If you want to see how sophisticated reverse engineering code works, you should really study websites with reverse engineering challenges.

Your question could use some clarification. How do you expect to keep a protocol secret if the computer code is amenable to reverse engineering? If my protocol would be to send an RSA encrypted message (even public key) what do you gain by keeping the protocol secret? For all practical purposes an inspector would be confronted with a sequence of random bits.

Groetjes Albert

Traditional reverse engineering techniques depend on the ability of a smart agent using a disassembler to answer questions about the code. If you want strong safety, you have do to things that provably prevent the agent from getting such answers.

You can do that by relying on the Halting Program ("does program X halt?") which in general cannot be solved. Adding programs that are difficult to reason about to your program, makes your program difficult to reason about. It is easier to construct such programs than to tear them apart. You can also add code to program that has varying degrees of difficulty for reasoning; a great candidate is the program of reasoning about aliases ("pointers").

Collberg et al have a paper ("Manufacturing Cheap, Resilient and Stealthy Opaque Constructs") that discusses these topics and defines a variety of "opaque" predicates that can make it very difficult to reason about code:

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.39.1946&rep=rep1&type=pdf

I have not seen Collberg's specific methods applied to production code, especially not C or C++ source code.

The DashO Java obfuscator seems to use similar ideas. http://www.cs.arizona.edu/~collberg/Teaching/620/2008/Assignments/tools/DashO/

FIRST THING TO REMEMBER ABOUT HIDING YOUR CODE : Not all of your code needs to be hidden.

THE END GOAL : My end goal for most software programs is the ability to sell different licenses that will turn on and off specific features within my programs.

BEST TECHNIQUE : I find that building in a system of hooks and filters like WordPress offers, is the absolute best method when trying to confuse your opponents. This allows you to encrypt certain trigger associations without actually encrypting the code.

The reason that you do this, is because you'll want to encrypt the least amount of code possible.

KNOW YOUR CRACKERS : Know this: The main reason for cracking code is not because of malicious distribution of licensing, it's actually because NEED to change your code and they don't really NEED to distribute free copies.

GETTING STARTED : Set aside the small amount of code that you're going to encrypt, the rest of the code should try and be crammed into ONE file to increase complexity and understanding.

PREPARING TO ENCRYPT : You're going to be encrypting in layers with my system, it's also going to be a very complex procedure so build another program that will be responsible for the encryption process.

STEP ONE : Obfuscate using base64 names for everything. Once done, base64 the obfuscated code and save it into a temporary file that will later be used to decrypt and run this code. सही बात?

I'll repeat since you'll be doing this again and again. You're going to create a base64 string and save it into another file as a variable that will be decrypted and rendered.

STEP TWO : You're going to read in this temporary file as a string and obfuscate it, then base64 it and save it into a second temp file that will be used to decrypt and render it for the end user.

STEP THREE : Repeat step two as many times as you would like. Once you have this working properly without decrypt errors, then you're going to want to start building in land mines for your opponents.

LAND MINE ONE : You're going to want to keep the fact that you're being notified an absolute secret. So build in a cracker attempt security warning mail system for layer 2. This will be fired letting you know the specifics about your opponent if anything is to go wrong.

LAND MINE TWO : Dependencies. You don't want your opponent to be able to run layer one, without layer 3 or 4 or 5, or even the actual program it was designed for. So make sure that within layer one you include some sort of kill script that will activate if the program isn't present, or the other layers.

I'm sure you can come up with you're own landmines, have fun with it.

THING TO REMEMBER : You can actually encrypt your code instead of base64'ing it. That way a simple base64 willnt decrypt the program.

REWARD : Keep in mind that this can actually be a symbiotic relationship between you and you'r opponent. I always place a comment inside of layer one, the comment congratulates the cracker and gives them a promo code to use in order to receive a cash reward from you.

Make the cash reward significant with no prejudice involved. I normally say something like $500. If your guy is the first to crack the code, then pay him his money and become his friend. If he's a friend of yours he's not going to distribute your software. Ask him how he did it and how you can improve!

GOOD LUCK!

Have anyone tried CodeMorth: http://www.sourceformat.com/code-obfuscator.htm ? Or Themida: http://www.oreans.com/themida_features.php ?

Later one looks more promissing.