2008-09-19 5 views
8

मेरा प्रश्न बहुत सरल है: आप एक निष्पादन योग्य फ़ाइल हैं जो "एक्सेस दी गई" या "एक्सेस अस्वीकृत" आउटपुट करती है और बुरे व्यक्ति आपको अपने एल्गोरिदम को समझने या अपने अंदरूनी पैच को हर समय "पहुंच प्रदान" करने के लिए पैच करने का प्रयास करते हैं।स्वयं मान्य बाइनरी?

इस परिचय के बाद, आप शायद सोच रहे होंगे कि मैं क्या कर रहा हूं। क्या वह बाहर निकलने के बाद डायब्लो 3 को तोड़ने जा रहा है? मैं आपकी चिंताओं को शांत कर सकता हूं, मैं उन क्रैकर्स में से एक नहीं हूं। मेरा लक्ष्य क्रैक्स हैं।

क्रैक्स पर पाया जा सकता है - उदाहरण के लिए - www.crackmes.de। एक क्रैक एक छोटा निष्पादन योग्य है (अधिकतर समय) में धारावाहिक के आधार पर एक सीरियल और आउटपुट "एक्सेस दी गई" या "एक्सेस अस्वीकृत" सत्यापित करने के लिए थोड़ा एल्गोरिदम होता है। लक्ष्य यह निष्पादन योग्य आउटपुट हर समय "पहुंच प्रदान" करना है। जिन विधियों को आप उपयोग करने की अनुमति देते हैं उन्हें लेखक द्वारा प्रतिबंधित किया जा सकता है - कोई पैचिंग नहीं, कोई डिस्सेम्बल नहीं है - या बाइनरी, ओबजडम्प और हेक्स संपादक के साथ आप जो भी कर सकते हैं उसे शामिल कर सकते हैं। क्रैकिंग क्रैक्स मज़े का एक हिस्सा है, निश्चित रूप से, हालांकि, एक प्रोग्रामर के रूप में, मैं सोच रहा हूं कि आप मुश्किलों को कैसे बना सकते हैं।

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

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

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

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

  • :

    मेरे विचार वर्तमान में से मिलकर बनता है।

  • द्विआधारी के चेकसमिंग भागों और उन लोगों के साथ रनटाइम पर गणना की गई चेकसम की तुलना करें।
  • कोड में आपके कार्यों के लिए सकारात्मक और नकारात्मक रनटाइम-चेक है। धारावाहिक सत्यापन पर दुष्प्रभाव के साथ। :)

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

उत्तर

6

आप "विरोधी रिवर्सिंग तकनीक" में शामिल हो रहे हैं। और यह मूल रूप से एक कला है। इससे भी बदतर यह है कि यदि आप नए लोगों को रोकते हैं, तो ओली और आईडीए प्रो के लिए "विरोधी विरोधी रिवर्सिंग प्लगइन्स" भी हैं जो वे आपके कई प्रतिद्वंद्वियों को डाउनलोड और बाईपास कर सकते हैं।

काउंटर उपायों में जाल डीबगर एपीआई द्वारा डीबगर पहचान, या 'सिंगल स्टेपिंग' का पता लगाना शामिल है। आप कोड डाल सकते हैं कि डीबगर ब्रेकिन का पता लगाने के बाद, कार्य करना जारी रहता है, लेकिन कार्यक्रम में बाद में यादृच्छिक समय पर अभिनय करना शुरू कर देता है। यह वास्तव में एक बिल्ली और माउस गेम है और क्रैकर्स का एक महत्वपूर्ण ऊपरी हाथ है।

चेक आउट करें ... http://www.openrce.org/reference_library/anti_reversing - कुछ बाहर क्या है।

http://www.amazon.com/Reversing-Secrets-Engineering-Eldad-Eilam/dp/0764574817/ - इस पुस्तक में वास्तव में तकनीक के माध्यम से वास्तव में अच्छी विरोधी रिवर्सिंग जानकारी और कदम हैं। अगर आप सामान्य रूप से int उलट रहे हैं तो शुरू करने के लिए बढ़िया जगह।

1

मेरा मानना ​​है कि ये चीजें आम तौर पर उनके मुकाबले ज्यादा परेशानी होती हैं।

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

बस व्यापार की लागत के रूप में समुद्री डाकू देखें - पाइरेटेड सॉफ़्टवेयर की बढ़ती लागत शून्य है यदि आप सुनिश्चित करते हैं कि सभी समर्थन केवल ग्राहकों को भुगतान करने के लिए किया जाता है। tpm on wikipedia

यह आप विशेष चिप पर एक द्विआधारी है, जो एक तरह से सत्यापन के रूप में कार्य कर सकता है की क्रिप्टोग्राफिक जांच रकम स्टोर करने के लिए अनुमति देता है:

+0

हाँ, वाणिज्यिक सॉफ्टवेयर के लिए, मैं पूरी तरह से सहमत हूं। स्वयं-सत्यापन की परतों और परतों सहित बस चीजों को बहुत ही जटिल और केवल परेशान कर देगा। लेकिन यह वाणिज्यिक सॉफ्टवेयर के लिए नहीं है - यह एक गेम है, और लक्ष्य एक तरफ बहुत सारे प्रयास करना है। – Tetha

1

TPM प्रौद्योगिकी नहीं है।

नोट: टीपीएम में एक खराब रैप है क्योंकि इसका उपयोग डीआरएम के लिए किया जा सकता है। लेकिन क्षेत्र में विशेषज्ञों के लिए, यह अनुचित है, और यहां तक ​​कि open-TPM समूह भी है जो लिनक्स उपयोगकर्ताओं को वास्तव में नियंत्रित करता है कि उनके टीपीएम चिप का उपयोग कैसे किया जाता है।

1

इस समस्या का सबसे मजबूत समाधान Trusted Computing है। असल में आप एप्लिकेशन को एन्क्रिप्ट करेंगे और डिक्रिप्शन कुंजी को एक विशेष चिप (Trusted Platform Module) पर प्रेषित करेंगे, चिप केवल एक बार "विश्वसनीय" स्थिति में सत्यापित होने के बाद एप्लिकेशन को डिक्रिप्ट करेगा: कोई मेमोरी दर्शक/संपादक नहीं, कोई डिबगर्स नहीं आदि। मूल रूप से, आपको डिक्रिप्ट किए गए प्रोग्राम कोड को देखने में सक्षम होने के लिए विशेष हार्डवेयर की आवश्यकता होगी।

0

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

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

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

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

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

0

प्रतिलिपि संरक्षण और सुरक्षा Keeping the Pirates at Bay: Implementing Crack Protection for Spyro: Year of the Dragon

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

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