एक सरल क्रिप्टोग्राफिक कीगेनमे पार्सिंग

हाय, हब्बर।

एक दिसंबर की शाम को विभिन्न केंद्रों से गुजरते हुए, मैंने देखा कि लंबे समय तक उलटने पर कोई लेख नहीं आया है। और क्रैकमे / कीगेनमे - और भी बहुत कुछ। और अचानक यह मुझ पर dawned: क्यों नहीं अपना खुद का ट्यूटोरियल लिखें?



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

आज हम Ksydfius द्वारा "XOR एल्गोरिथम" नामक एक keygenme तैयार करेंगे। आप इस keygenme crackmes.de पर या यहाँ पा सकते हैं।

दिए गए:
-Text सही कुंजी के साथ एन्क्रिप्टेड।
- एक ही पाठ, लेकिन एन्क्रिप्टेड नहीं।
-प्रशिक्षण और स्थूल बल निषिद्ध और निरर्थक है।

अंत में, हमें किसी प्रकार का गुप्त संदेश प्राप्त करना चाहिए।

आवश्यक उपकरण: OllyDBG या कोई अन्य डीबगर।

आइए विश्लेषण का अधिकार प्राप्त करें। ओली में कीजेनम खोलें और प्रवेश बिंदु पर रुकें।



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



प्रेस F9 और रोगी की मुख्य विंडो हमारे सामने दिखाई देती है। "कुंजी" फ़ील्ड में, हम उस सब कुछ में ड्राइव करते हैं जो हमारी दिल की इच्छाएं (मैंने हैलो शब्द लिया) और ठीक पर क्लिक करें।



अगला, ब्रेकडाउन हमारे द्वारा आवश्यक फ़ंक्शन पर काम करेगा। Ctrl + F9 दबाएं और फ़ंक्शन से बाहर निकलने पर रोकें। GetDlgItemTextA के तुरंत बाद, जो दर्ज की गई कुंजी को उठाता है, एक अन्य फ़ंक्शन कॉल का अनुसरण करता है। F7 दबाएं और इसमें प्रवेश करें।



हम तब तक ट्रेस करना जारी रखते हैं जब तक कि हम निम्न अनुभाग तक नहीं पहुँच जाते:

CMP EAX,20 ;20h=32d JNZ SHORT 00401075 ;RETN->ExitProcess 


F8 और keygenme के कुछ टैप्स हमें छोड़ देते हैं। खैर, एक नज़र डालते हैं कि jnz कहाँ जाता है। सबसे पहले, यह फ़ंक्शन एग्जिट कमांड (RETN) की ओर जाता है, और फिर दर्ज की गई लंबाई की तुलना संख्या 20h के साथ की जाती है, जो हमारे मामले में समान नहीं है। फिर jnz इस प्रकार है, एग्जिटप्रोसेस फंक्शन की ओर जाता है, जो हमारे कीगेनमे की प्रक्रिया को पूरा करता है।

ठीक है, keygenme को पुनरारंभ करें और 32 अक्षरों की एक मनमानी स्ट्रिंग दर्ज करें, मैंने एक लिया - 12345678901234567890123456789012। इस बार हम सफलतापूर्वक तुलना के माध्यम से जाते हैं और एक नया फ़ंक्शन दर्ज करते हैं।



और यहाँ, केजेनमे में लगभग सबसे महत्वपूर्ण क्रियाएं होती हैं। EDI में, प्री-कुक अनएन्क्रिप्टेड टेक्स्ट मूव्स, और ESI में, कुंजी दर्ज की गई।



फिर, EDX मान को ESI में जोड़ा जाता है। ऐसा क्यों किया जाता है, मैं थोड़ा नीचे बताऊंगा। फिर, कुंजी से बाइट के साथ लंबे स्ट्रिंग Xor का एक बाइट। EDX मान Xor मान में जोड़ा जाता है, और फिर यह सब निचले केस BL मान के अतिरिक्त जोड़ा जाता है।

इन सभी क्रांतियों के बाद, एक फ़ंक्शन (CALL 00401000) कहा जाता है, जो EBX मान को स्थानांतरित करता है, यानी पिछली प्रक्रिया का परिणाम, EAX में, EBX रजिस्टर 20h पर सेट होता है और EAX को EBX से विभाजित किया जाता है। फ़ंक्शन के अंत में, EBX शून्य पर रीसेट हो जाता है।



फिर, यही बात EDI से अनएन्क्रिप्टेड टेक्स्ट के बाद के बाइट्स के साथ होती है, जब तक कि टेक्स्ट एन्क्रिप्ट न हो जाए। हालांकि, कुंजी के साथ, सब कुछ कुछ और दिलचस्प है। याद रखें, मैंने आपको यह बताने का वादा किया था कि ईएसआई में ईडीएक्स क्यों जोड़ा जाता है? तथ्य यह है कि फ़ंक्शन से शेष ईएक्सएक्स और ईबीएक्स डिवीजन 00401000 ईडीएक्स रजिस्टर में संग्रहीत है। यह शेष ईएसआई रजिस्टर में जोड़ा गया है, जिसमें दर्ज की गई कुंजी है। इसलिए, शेष उस कुंजी संख्या से है जिसे हमने दर्ज किया था, जो EDI से अगले बाइट के साथ xor'ed होगी।

इस समारोह के पहले और दूसरे चक्र के निष्पादन को दर्शाने वाली एक उदाहरण तस्वीर:



पहले चक्र के दौरान, EDX = 00000000, इसलिए कार्यक्रम ने कुंजी के पहले बाइट का उपयोग किया। दूसरे चक्र के दौरान, EDX = 00000006, जिसका अर्थ है कि कार्यक्रम में कुंजी के 7 (1 + 6) बाइट्स का उपयोग किया गया है।

ठीक है, चलो आगे बढ़ते हैं। हमने ब्रेकप्वाइंट को 0x00401079 पते पर प्रक्रिया (आरईटीएन) से बाहर निकलने पर रखा और एफ 9 दबाएं। हम पहले से एन्क्रिप्टेड पाठ के साथ प्रक्रिया से बाहर निकलने पर रोकते हैं।

आगे हम निम्न चित्र देखते हैं:



मुख्य प्रक्रिया से बाहर निकलने के बाद, रजिस्टर EAX, EBX, ECX और EDX को मंजूरी दे दी गई है। हमारी अमान्य कुंजी के साथ एन्क्रिप्ट किया गया स्ट्रिंग ESI में रखा गया है, और उसी स्ट्रिंग को EDI के साथ एन्क्रिप्ट किया गया है, केवल सही कुंजी के साथ एन्क्रिप्ट किया गया है। फिर, ESI से बाइट को AL उप-रजिस्टर में रखा जाता है, EDI से बाइट को तदनुसार CL उप-रजिस्टर में रखा जाता है। अगला, सीएल और एएल से बाइट्स की तुलना की जाती है, और यदि वे समान हैं, तो हमें संदेश डिक्रिप्शन प्रक्रिया में भेजा जाता है (मैं आपको एक रहस्य बताऊंगा कि मुख्य प्रक्रिया में भी वही होता है, केवल सही कुंजी और एन्क्रिप्टेड संदेश एक्सओआर है)। लेकिन कब से हमारे मामले में, ये उप-रजिस्टर समान नहीं हैं, डीबग की गई प्रक्रिया क्रैश हो जाती है।

अब देखते हैं कि धारावाहिक कैसे बनता है। Psevdouravnenie:

सही तरीके से एन्क्रिप्ट किए गए टेक्स्ट का बाइट = (अनएन्क्रिप्टेड टेक्स्ट का बाइट) xor ((कुंजी बाइट [पिछला बाइट मॉड 20 ह]) + (पिछला बाइट कुंजी मॉड 32)।

बेहतर पठनीयता और समझ के लिए चरों द्वारा यह सब सूचित करें:

प्लेनटेक्स्ट बाइट = एस
कुंजी बाइट = x
पिछला सही ढंग से एन्क्रिप्टेड बाइट mod 20h = y

नया समीकरण:

सही ढंग से एन्कोडेड बाइट = s xor (x [y] + y)

क्योंकि हम x [y] में रुचि रखते हैं, इसे अन्य चर के माध्यम से व्यक्त करते हैं:

x [y] = s xor (सही ढंग से एन्क्रिप्टेड पाठ का बाइट - y)

उदाहरण के लिए, हम पहले बाइट्स के एक जोड़े की गणना करते हैं:
x [१] = ५ [xor (३ - ०) = ५४ ह। हम ASCII तालिका को देखते हैं, यह "टी" संकेत है
y = 3 mod 20 = 3
x [1 + 3] = 65 xor (50 - 3) = 28 ह। और यह एक "(" संकेत है।
और इसी तरह, जब तक कि पंक्ति के सभी 32 तत्व भर नहीं जाते।

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

तो, आखिरी बार, हम अपने प्रयोगात्मक खरगोश के लंबे समय से पीड़ित शव को खोलते हैं, कीजेन से चाबी की नकल करते हैं, ओके बटन दबाते हैं, बधाई के साथ मैसेजबॉक्स को निहारते हैं, आनन्दित होते हैं।



वह सब है। पढ़ने के लिए धन्यवाद, मुझे आशा है कि यह काफी मजेदार और जानकारीपूर्ण था।

Source: https://habr.com/ru/post/In164303/


All Articles