2009-02-21 16 views
25

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

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

; some twiddling with xor 
    ; and data, result in eax 
    jmp eax 
    mov eax, 0x310fac09 
    ; rest of code here 

मैं सिर्फ दिनचर्या जो दो बार, फिर बातें बुलाया गया था से अधिक कदम रखा बस केला चला गया। थोड़ी देर बाद मुझे एहसास हुआ कि थोड़ा सा झुकाव परिणाम हमेशा एक जैसा था, यानी jmp eax हमेशा mov eax, 0x310fac09 निर्देश में सीधे कूद गया। मैंने बाइट्स को विच्छेदित किया और वहां 0f31, rdtsc निर्देश था जिसे डीएलएल में कुछ कॉल के बीच बिताए गए समय को मापने के लिए उपयोग किया गया था।

तो मेरा प्रश्न SO पर है: आपकी पसंदीदा एंटी-डिबगिंग चाल क्या है?

+10

यह मेरी राय है कि मैं वास्तव में अपने सिस्टम पर कोड नहीं चलाना चाहता हूं जिसने डीबगिंग को रोकने के लिए चीजें की हैं। यह दिखाता है कि कोड के लेखक पर भरोसा नहीं किया जा सकता है। – bruceatk

+1

मैं ब्रूससेक से सहमत हूं, खासकर डीएलएल और अन्य घटकों के लिए जो मैं अपने आवेदन के निर्माण के लिए उपयोग करता हूं। मैं उपयोग किए जाने वाले पूर्ण अनुप्रयोगों से कम चिंतित हूं। मुझे आश्चर्य नहीं है कि कंपनी बैंककैप्ट गई है :) - वे बेहतर सुरक्षा के समय से अच्छे कोड का उत्पादन करने में समय व्यतीत करेंगे। – Michael

+0

@ ब्रूसैटक तो आप विंडोज नहीं चलाते? ऑपरेटिंग सिस्टम में कुछ एंटी-डिबगर ट्रिक्स शामिल हैं जो इसके कुछ और अधिक रोचक सुरक्षा तंत्र को छिपाने में मदद करते हैं। – mrduclaw

उत्तर

27

मेरी पसंदीदा चाल एक अस्पष्ट माइक्रोप्रोसेसर के लिए एक सरल निर्देश एमुलेटर लिखना है।

कॉपी सुरक्षा और कुछ मूल कार्यक्षमता तब माइक्रोप्रोसेसर के लिए संकलित की जाएगी (जीसीसी यहां एक बड़ी मदद है) और कार्यक्रम में बाइनरी ब्लॉब के रूप में जुड़ा हुआ है।

इसके पीछे विचार यह है कि कॉपी सुरक्षा सामान्य x86 कोड में मौजूद नहीं है और इस तरह इसे अलग नहीं किया जा सकता है।आप पूरे एमुलेटर को हटा नहीं सकते क्योंकि यह प्रोग्राम से कोर कार्यक्षमता को हटा देगा।

प्रोग्राम को हैक करने का एकमात्र मौका इंजीनियर को रिवर्स करना है जो माइक्रोप्रोसेसर एमुलेटर करता है।

मैंने एम्यूपीएस 32 का उपयोग इम्यूलेशन के लिए किया है क्योंकि यह अनुकरण करना इतना आसान था (इसमें सरल सी-कोड की केवल 500 लाइनें थीं)। चीजों को और भी अस्पष्ट बनाने के लिए मैंने कच्चे MIPS32 opcodes का उपयोग नहीं किया। इसके बजाय प्रत्येक ऑपोड को अपने स्वयं के पते के साथ xored किया गया था।

कॉपी सुरक्षा की बाइनरी कचरा-डेटा की तरह दिखती है।

अत्यधिक अनुशंसित! एक दरार बाहर आने से पहले 6 महीने से अधिक समय लगा (यह एक गेम प्रोजेक्ट के लिए था)।

+0

तो मूल रूप से आप जानते हैं कि आप अंततः असफल हो जाएंगे? – fow

+0

छह महीने एक लंबा समय है जब हम किसी एप्लिकेशन को क्रैक करने के बारे में बात कर रहे हैं। – Irwin

+3

मैं कहूंगा कि किसी ने कोशिश करने से 6 महीने पहले लिया था। यह प्रयास के लायक नहीं है। मुझे यकीन है कि आपने जो कुछ भी किया है, वह आसानी से किसी चीज से दूर हो गया था जिसे आपने कभी नहीं सोचा था। – bruceatk

0

डीबगर के माध्यम से असेंबली को हटाने के लिए nop का उपयोग करना एक उपयोगी चाल है। बेशक, कोड वापस रखना बहुत कठिन है !!!

+1

डीबगर के आधार पर एक 'पूर्ववत' सुविधा होनी चाहिए। OllyDbg में एक है, बस संशोधित बाइट्स का चयन करें और ALT + बैकस्पेस दबाएं। – Irwin

6

मैं कई आरसीई समुदायों का सदस्य रहा हूं और हैकिंग & क्रैकिंग का मेरा उचित हिस्सा रहा है। मेरे समय से मुझे एहसास हुआ है कि इस तरह की flimsy चाल आमतौर पर अस्थिर और बदसूरत हैं। अधिकांश जेनेरिक एंटी-डिबगिंग चाल ओएस विशिष्ट हैं और बिल्कुल 'पोर्टेबल' नहीं हैं।

उपर्युक्त उदाहरण में, आप संभावित रूप से इनलाइन असेंबली और naked फ़ंक्शन __declspec का उपयोग कर रहे हैं, दोनों जो x64 आर्किटेक्चर पर संकलित करते समय MSVC द्वारा समर्थित नहीं हैं। उपर्युक्त चाल को लागू करने के लिए निश्चित रूप से अभी भी तरीके हैं, लेकिन जो भी लंबे समय तक पीछे हट रहा है वह कुछ मिनटों में उस चाल को स्पॉट और हारने में सक्षम होगा।

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

2

मैं आभासी मशीन सुझाव दूसरा। मैंने एक एमआईपीएस I सिम्युलेटर लागू किया है कि (अब) mipsel-elf-gcc से उत्पन्न बाइनरी निष्पादित कर सकता है। उस कोड/डेटा एन्क्रिप्शन क्षमताओं (एईएस या अपनी पसंद के किसी भी अन्य एल्गोरिदम के साथ) में जोड़ें, स्वयं सिमुलेशन की क्षमता (ताकि आप नेस्टेड सिमुलेटर हो) और आपके पास एक बहुत अच्छा कोड obfuscator है।

एमआईपीएस I चुनने की अच्छी सुविधा यह है कि 1) इसे कार्यान्वित करना आसान है, 2) मैं सी में कोड लिख सकता हूं, इसे अपने डेस्कटॉप पर डीबग कर सकता हूं और इसे पूरा होने पर बस एमआईपीएस के लिए इसे संकलित कर सकता हूं। कस्टम ओपोड को डीबग करने या कस्टम वीएम के लिए मैन्युअल रूप से कोड लिखने की कोई आवश्यकता नहीं है ..

+0

Wtf - आप एमआईपीएस का भी उपयोग करते हैं? मैंने सोचा कि मैं अकेला था जो इस तरह से करता है। –

+0

खैर, मैं पहले एक कस्टम निर्देश सेट तैयार करना चाहता था, लेकिन यह मेरे लिए जल्दी से हुआ कि मैं खुद को मैन्युअल रूप से लिखने और डीबग करने के लिए कोड की निंदा करता हूं। तो मैं gcc द्वारा समर्थित एक साधारण सीपीयू की तलाश में गया :-) – zvrba

3

सबसे आधुनिक obfuscation विधि वर्चुअल मशीन प्रतीत होता है।

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

सबसे पुराने चाल अब बेकार हैं:

  • Isdebuggerpresent: बहुत लंगड़ा और आसान
  • अन्य डिबगर/ब्रेकप्वाइंट detections
  • पैच करने के लिए
  • Ring0 सामान: उपयोगकर्ताओं, ड्राइवरों स्थापित करने के लिए पसंद नहीं है तुम हो सकता है वास्तव में उनके सिस्टम आदि पर कुछ तोड़ते हैं
  • अन्य छोटी चीजें जो सभी जानते हैं, या जो आपके सॉफ़्टवेयर को अस्थिर बनाता है। याद रखें कि यहां तक ​​कि यदि कोई क्रैक आपके प्रोग्राम को अस्थिर बनाता है लेकिन यह अभी भी काम करता है, तो यह अस्थिरता आपको दोषी ठहराएगी।

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

List of instruction formats supported by IDA pro disassembler

1

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

स्टैक पर एक वापसी पता बदलने से भी एक अच्छा समय बर्बाद हो जाता है।

3

मैं यह पसंद करूंगा कि लोग ठोस, भरोसेमंद सॉफ़्टवेयर लिखें और ऐसा करने के लिए विज्ञापित किया जाए। कि वे उचित लाइसेंस के साथ उचित मूल्य के लिए भी इसे बेचते हैं।

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

+0

आपत्तिजनक? मुझे प्यार होगा कि जिसने इस आपत्तिजनक को मुझसे संपर्क करने के लिए लेबल करने का फैसला किया और समझाया कि इसके बारे में क्या अपमानजनक है। [email protected] – bruceatk

+0

+1 "आक्रामक" का मुकाबला करने के लिए। परमाणु ऊर्जा चिंताओं के लिए वर्चुअल पॉइंट +1। –

+1

मैंने आपको आक्रामक नहीं बताया, लेकिन मैंने आपको रेट किया क्योंकि आपकी पोस्ट वास्तव में विषय से बाहर है। – rhinovirus

6

एक बच्चे की प्रक्रिया को स्पिन करें जो एक डीबगर & के रूप में अभिभावक को जोड़ता है कुंजी चर को संशोधित करता है। बाल प्रक्रिया निवासी को रखने और कुछ प्रमुख संचालन के लिए आईपीसी के रूप में डीबगर मेमोरी ऑपरेशंस का उपयोग करने के लिए बोनस अंक।

मेरे सिस्टम पर, आप एक ही प्रक्रिया में दो डिबगर्स संलग्न नहीं कर सकते हैं।

इस बारे में अच्छी बात यह है कि जब तक वे w/चीजों को छेड़छाड़ करने की कोशिश नहीं करते हैं।

4
+0

मुझे यकीन है कि जोकरों के माध्यम से कदम उठाने के लिए मैं उस पहलू में से एक मेसियर के साथ आ सकता हूं जो कम ओएस-विशिष्ट सामान पर निर्भर करता है। – Joshua

2

मेरा व्यक्तिगत पसंदीदा Amiga, जहां एक सह प्रोसेसर (blitter) बड़े डेटा कर वहाँ पर था: (और अन्य काला जादू/Vodoo ...)

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

जब आप एक्शन रीप्ले कारतूस संलग्न करते हैं, तो CPU को रोकना मतलब होगा कि ब्लिटर स्मृति को साफ़ करना जारी रखेगा।

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