2009-12-11 6 views
7

मैं एक तरह से (वस्तु कोड में) अंधेरा करना एक परीक्षण रहा हूँ - क्या जांच करने के लिए है कि एक लाइसेंस कुंजी मान्य है किया जा सकता है की तरह कुछ। जो मैं रोकने की कोशिश कर रहा हूं वह किसी ऐसे कोड के लिए छवि बाइनरी के माध्यम से खोज रहा है जो प्रतिक्रिया को संसाधित करता है।प्रतिक्रिया प्रक्रिया के साथ छेड़छाड़ को रोकने के लिए मैं कोड में एक परीक्षण को कैसे रोक सकता हूं?

bool checkError = foo(); 
if (checkError) // I'd like to avoid making a simple check like this one. 
{ 
    // process response 
} 

यह एक साधारण उदाहरण है, लेकिन नहीं एक सुझाई गई पहुंच:

int check = 71 * 13; 
check += 35 * isValid(); // will only return 0 or 1 

//later (delayed execution of response) 
if (check % 71) 
{ 
    //process response 
} 

संपादित करें: बस स्पष्ट करने के लिए, वास्तविक परीक्षा पहले से ही समाप्त हो गया है और मैं एक पास/असफल वापसी हो रही है। मेरी प्रतिक्रिया प्रसंस्करण एक मूल जेएमपी होगी और जेएमपी के स्थान को खराब करने के तरीके पर पॉइंटर्स में दिलचस्पी होगी।

+0

बहुत बेहतर। :) – GManNickG

+0

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

+0

@ चार्ल्स साल्विया: यह सच है। मैं सिर्फ इस सवाल से सुरक्षा की डिग्री नहीं ढूंढ रहा हूं। ;) हालांकि, यह मेरी पहली बार इन पंक्तियों के साथ कुछ करने का प्रयास कर रहा है और मुझे यह मानना ​​है कि मुझे नहीं पता कि कहां से शुरू करना है। – Dubron

उत्तर

5

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

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

मैं @camccann साथ सहमत हैं कि यह हमले की तरह आप उम्मीद को समझने के लिए मदद मिलेगी। आखिरी उपाय के रूप में, लाइसेंस-चेक को कई हिस्सों में विभाजित करें, ताकि एक शाखा बिंदु को बदलकर बाईपास करना मुश्किल हो सके।

[संपादित करें]

एक और सोचा उपयोग करने के लिए एक राज्य मशीन होगा। this question के शीर्ष उत्तर में कमांड संरचना उदाहरण देखें। लाइसेंस जांच का मूल्यांकन हैश लुकअप के रूप में और डमी फ़ंक्शन कॉल का एक सेट उचित सरणी के साथ सरणी में रखता है। निर्णय कोड है कि उचित समारोह के लिए एक मेज/हैश देखने में लाइसेंस जांच का मूल्यांकन करता है अपने ठेठ

if(){ pass;} else { fail; } 

निर्माण की तरह नहीं होगा।

दो लाभ,
1) वहाँ एक बूलियन हालत बायपास करने के लिए और
2) वे समारोह के पते/नाम जानने के लिए नियंत्रण बढ़ाने के लिए बिना एक सरल जेएमपी अनुदेश ऐसा नहीं कर सकते नहीं है।

SO thread on a state machine turorial
SO thread on state machine implementations

+3

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

+0

@ केवेनके: बहुत बहुत धन्यवाद। यह सही है। – Dubron

+1

@ केवेनके मैंने शाखा को छिपाने के लिए पोस्ट संपादित किया। –

5

कहानियो नहीं रोकने के लिए, केवल हतोत्साहित करता है। एक पर्याप्त कुशल और निर्धारित हमलावर हमेशा जो कुछ भी कहानियो को आप का उपयोग को नाकाम करने में सक्षम हो जाएगा, तो क्या आप पहली बार पता करने की जरूरत है: लोग किस तरह आप यहाँ को विफल करने की कोशिश कर रहे हैं?

+0

उस भेद को बनाने के लिए धन्यवाद। मुझे अपने प्रश्न में "हतोत्साहित" कहा जाना चाहिए था। जिन लोगों को मैं नाकाम करने की कोशिश कर रहा हूं वे शायद नौसिखिया हमलावर हैं क्योंकि अधिक अनुभवी लोगों को शायद कुछ सबसे कठिन तरीकों के बारे में जानने का तरीका मिल जाएगा। – Dubron

3

Secure Programming Cookbook (ओ रेली) एंटी टैम्परिंग (वास्तविक पुस्तक अध्याय, यकीन नहीं क्या वेबसाइट पर उपलब्ध है है) पर एक पूरा अध्याय है। स्वच्छ सामान।

3

आप की तरह भर में जांच छिड़काव द्वारा एक दुर्घटना का कारण बन सकता:

T* data = (T*) new char[sizeof(T) * (check() ? 1 : 0)] 
array[i + 1 * (check() ? 0 : 42)].doStuff(); 

वहाँ Gamasutra पर एक अच्छा लेख के बारे में crack protection in Spyro है कि इसी तरह काम करता है, तो खेल क्रैश नहीं बनाकर आगे जाता है, बस बदतर कार्य और बदतर (आप कभी नहीं दुश्मन मारा, आप धीमी चलना, कुछ महत्वपूर्ण वस्तुओं को बेतरतीब ढंग से आदि आदि गायब हो जाते हैं)

मज़ा सभी प्रोग्रामर के लिए पढ़ा है, और शायद आप के लिए उपयोगी।

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

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