एक मैलवेयर शोधकर्ता के रूप में, आप अक्सर जटिल, भारी अस्पष्ट नमूनों के विरुद्ध होते हैं। और GuLoader, जिस मैलवेयर से हम आज निपट रहे हैं, वह एक उत्कृष्ट मामला है।
इस छद्म कोड पर एक नज़र डालें, जो इसके असेंबली कोड को विघटित करके बनाया गया है - यह बदसूरत और अपठनीय है।
इस तरह की पहेली का सामना करने पर, आप खुद को नुकसान में पा सकते हैं। आपको कहाँ से शुरू करना चाहिए? आप इस नमूने के विश्लेषण से कैसे निपटते हैं? आइए इसे तोड़ दें।
इस लेख में, हम एक संदर्भ के रूप में GuLoader का उपयोग करके ऐसे कोड को अस्पष्ट करने की रणनीतियों का पता लगाएंगे। आप इसके बारे में जानेंगे:
यह लेख ANY.RUN द्वारा पहले प्रकाशित GuLoader मालवेयर विश्लेषण पर आधारित है। हम जिस नमूने का विश्लेषण करेंगे, उसे खोजने के लिए हमारे ब्लॉग पर जाएँ, साथ ही अनपैकिंग निर्देश और एक गीदरा स्क्रिप्ट जो इस बिंदु से हम जो कुछ भी कवर करने जा रहे हैं, उसे आंशिक रूप से स्वचालित करता है।
यह लेख स्थिर विश्लेषण पर केंद्रित है। लेकिन अगर आप गतिशील रूप से गुलोडर नमूने का विश्लेषण करना चाहते हैं, तो आप ANY.RUN क्लाउड मालवेयर सैंडबॉक्स का उपयोग कर सकते हैं।
अपने व्यवसाय ईमेल का उपयोग करके एंटरप्राइज़ योजना के 14-दिन के निःशुल्क परीक्षण के लिए आवेदन करें । वीएम इंस्टेंसेस, असीमित कार्यों और विंडोज संस्करण 7 से 11 के विस्तारित जीवनकाल का लाभ उठाएं।
डायनेमिक विश्लेषण आपको यह देखने देता है कि मैलवेयर के व्यवहार को उसके तकनीकी सेटअप से जोड़कर वास्तविक दुनिया में कैसे काम करता है। यह विभिन्न सिस्टम सेटअपों में अपने कार्यों की जांच करने और आईओसी एकत्र करने का एक तरीका है।
और देर न करते हुए, आइए गोता लगाएँ।
नमूने को अनपैक करने के बाद, हम शेलकोड के मैन्युअल विश्लेषण से शुरू करते हैं और जल्दी से महसूस करते हैं कि यह अस्पष्ट है। कोड का अध्ययन करने से हमें गूलोडर द्वारा उपयोग की जाने वाली आपत्तिजनक तकनीकों को श्रेणियों में समूहित करने में मदद मिलती है:
यह बंद करने, उपयोग किए जा रहे आपत्तिजनक तरीकों का विश्लेषण करने और डिबोफस्केशन रणनीति विकसित करने का एक अच्छा समय है।
उदाहरण के लिए, हमारे मामले में, इनमें से अधिकतर तकनीकें कोड पेश करती हैं जो अंतिम निष्पादन परिणाम को नहीं बदलती हैं। इसलिए, पठनीयता में सुधार के लिए हम अक्सर उन्हें सुरक्षित रूप से "एनओपी" कर सकते हैं। लेकिन सावधानी के साथ आगे बढ़ें - सभी उलझे हुए कोड प्रोग्राम के संचालन के लिए अप्रासंगिक नहीं हैं, जैसा कि हम जल्द ही खोज लेंगे।
अब, आइए इन अस्पष्ट तकनीकों की अलग-अलग जाँच करें, और देखें कि उन्हें कैसे पराजित किया जाए।
कोड कई एक्सएमएम निर्देशों से अटा पड़ा है। ये अव्यवस्थित प्रतीत होते हैं और विश्लेषण प्रक्रिया में जटिलता जोड़ते हैं। हम अनपैक्ड शेलकोड के पहले बाइट से ही उनका सामना करते हैं।
ध्यान दें कि डिफ़ॉल्ट समर्थन की कमी के कारण कई इम्यूलेशन इंजन उन पर ठोकर खाते हैं। हमने परीक्षण के लिए Angr, Triton, और Ghidra के एम्बेडेड इंजन लगाए - सभी कम पड़ गए।
GuLoader के मामले में, XMM निर्देश वास्तव में कोड के इच्छित व्यवहार को प्रभावित नहीं करते हैं। आप ढेर सारे मैलवेयर में इसी तरह की आपत्तिजनक विधियों का सामना करेंगे। नतीजतन, हम सभी एक्सएमएम निर्देशों को "एनओपी" से सुरक्षित रूप से बदल सकते हैं, जैसा कि निम्न तालिका में दिखाया गया है:
यहां बताया गया है कि गिदरा डिस्सेम्बलर में परिणाम कैसा दिखता है:
बिना शर्त JMP निर्देश कोड को छोटे टुकड़ों में विभाजित करते हैं। एंटीवायरस सॉफ़्टवेयर और अन्य सुरक्षा उपकरणों द्वारा पता लगाने से बचने के लिए इस विधि का अक्सर उपयोग किया जाता है। इसके अतिरिक्त, यह विश्लेषकों के काम को अधिक समय लेने वाला और निराशाजनक बना सकता है, क्योंकि उन्हें इन ब्लॉकों के बीच कूदना चाहिए, खासकर जब बड़ी मात्रा में कोड से निपटना हो। गुलोडर और अन्य मैलवेयर आमतौर पर इस तकनीक का इस्तेमाल करते हैं।
इस आपत्तिजनक विधि को हराना काफी आसान है। डिकंपिल्ड कोड में डिस्सेम्बलर अक्सर इन ब्लॉकों को सफलतापूर्वक जोड़ता है, कोड पठनीयता में सुधार करता है, यहां तक कि इन बिना शर्त कूदों के साथ भी। इस प्रकार, हम छोटे ब्लॉकों को मर्ज करने की आवश्यकता के बिना उन्हें वैसे ही छोड़ सकते हैं।
जंक असेंबली निर्देश अक्सर अस्पष्टता की एक अतिरिक्त परत के रूप में चलन में आते हैं। ये निर्देश कोई ठोस कार्य नहीं करते हैं, आमतौर पर रजिस्टर मान, निष्पादन प्रवाह, या मेमोरी को अपरिवर्तित छोड़ देते हैं।
आप इनका सामना GuLoader के भीतर भी करेंगे।
उन निर्देशों के लिए देखें जो कोई क्रिया नहीं करते हैं ("NOP", "FNOP") और जो शून्य बिट्स ("SHL reg, 0"; "ROL reg, 0") द्वारा शिफ्ट या रोटेट करते हैं। अन्य गैर-प्रभावशाली निर्देश जैसे "OR reg, 0", "XOR reg, 0", "CLD", "WAIT" भी मौजूद हैं।
फर्जी तुलना निर्देशों को संबोधित करना जंक वाले को "एनओपी" के साथ बदलने की तुलना में अधिक चुनौतीपूर्ण है। हम सभी तुलना निर्देशों को नहीं हटा सकते क्योंकि कुछ सही कोड फ़ंक्शन के लिए आवश्यक हैं। इससे निपटने का एक तरीका यह है कि हमारे सामने आने वाले सभी तुलना निर्देशों को "चिह्नित" कर दिया जाए। यदि कोई निर्देश नहीं मिलता है जो तुलना के परिणाम का उपयोग करता है, तो इसे एनओपी करना सुरक्षित है। यदि हमें कोई सशर्त उछाल या समान मिलता है, तो हम हटाने से बचने के लिए तुलना को अचिह्नित कर देते हैं।
निम्न तालिका एक उदाहरण दिखाती है जहां "सीएमपी ईडीएक्स, 0x0" को छोड़कर सभी तुलना निर्देशों को चुनिंदा रूप से एनओपी के साथ बदल दिया गया था:
GuLoader नकली "PUSHAD" निर्देशों का उपयोग करने की अस्पष्ट रणनीति को भी नियोजित करता है, जो "POPAD" निर्देश से मेल खाता है। वे अस्थायी रूप से रजिस्टर मूल्यों को संशोधित कर सकते हैं लेकिन "POPAD" द्वारा मूल रजिस्टर मूल्यों को पुनर्स्थापित करके निरस्त कर दिया जाता है।
हमारे शोध से पता चला है कि GuLoader में सभी "PUSHAD" निर्देश बाहरी हैं। इसलिए, हम इसे "PUSHAD", "POPAD", और मध्यवर्ती निर्देशों को NOP से बदलकर संबोधित करते हैं:
हालांकि, GuLoader में सभी "POPAD" निर्देश कबाड़ नहीं हैं। हम उन्हें बिना किसी संगत "पुषाद" के छोड़ देते हैं।
पिछले एक के समान एक और अस्पष्टता तकनीक नकली "पुश" निर्देशों का उपयोग है। ये निर्देश स्टैक पर मान को केवल तुरंत पॉप ऑफ करने के लिए पुश करते हैं।
एक उदाहरण "पुश एसएस" निर्देश को शामिल करना है, संभवतः एक रजिस्टर या मेमोरी स्थान को संशोधित करने वाले निर्देशों के बाद। हालाँकि, बाद में "POP SS" स्टैक पॉइंटर को उसके प्रारंभिक मान पर पुनर्स्थापित करता है।
नकली PUSH निर्देशों को पराजित करना नकली PUSHAD की प्रक्रिया के समान है, लेकिन गैर-पुश रजिस्टरों को अपरिवर्तित छोड़ना महत्वपूर्ण है।
अपारदर्शी विधेय सशर्त बयान हैं जो हमेशा सही या गलत लौटते हैं, फिर भी उनका विश्लेषण या भविष्यवाणी करना कठिन होता है। ये GuLoader के कोड में पाए जाते हैं और तार्किक समझ को जटिल बनाते हैं।
उदाहरण के लिए, "MOV BL, 0xB6" और "CMP BL, 0xB6" जैसे निर्देशों की एक जोड़ी के बाद "JNZ ADDR" जैसी सशर्त छलांग लगाई जा सकती है। तुलना हमेशा झूठी होती है क्योंकि तुलना मूल्य स्थानांतरित मूल्य के बराबर होता है, जिससे छलांग अनावश्यक और चकरा देने वाली हो जाती है।
कूदने की स्थिति की "भविष्यवाणी" करने की आवश्यकता के कारण अपारदर्शी विधेय पर काबू पाना चुनौतीपूर्ण लग सकता है। हालाँकि, हमारी स्थिति अधिक सीधी है क्योंकि सभी अपारदर्शी विधेय "PUSHAD" और "POPAD" ब्लॉकों के अंतर्गत आते हैं। इसलिए, हम एनओपी के साथ इन निर्देशों के बीच सभी विधेय को प्रतिस्थापित करते हैं।
अस्पष्ट अंकगणितीय अभिव्यक्ति GuLoader द्वारा उपयोग की जाने वाली अधिक रोचक तकनीकों में से हैं। वे किए गए वास्तविक कार्यों को समझना कठिन बनाते हैं। इन भावों में जोड़ या घटाव जैसी अंकगणितीय क्रियाएं शामिल हैं। कभी-कभी, वे नकली तुलना, अपारदर्शी विधेय और जंक निर्देश जैसे अन्य अवरोधों के साथ मिश्रित होते हैं।
एक उदाहरण एक स्थिर मान को एक रजिस्टर में ले जा रहा है और अंकगणितीय संचालन निष्पादित कर रहा है:
एक अन्य उदाहरण स्टैक पर एक स्थिर मान को धकेल रहा है और मेमोरी पर गणना कर रहा है:
GuLoader के अंकगणितीय भावों को अस्पष्ट करने के लिए, हम नकली तुलनाओं को संभालने के समान दृष्टिकोण अपनाते हैं। हम सभी "MOV" निर्देशों को चिह्नित करते हैं जहां दूसरा तर्क एक स्केलर मान है, और सभी "PUSH" निर्देश जहां तर्क स्केलर है। एक अंकगणितीय ऑपरेशन का सामना करने पर, हम पहले निर्देश में निरंतर मान को अपडेट करते हैं और वर्तमान को NOP से बदल देते हैं। इस तरह, पहले निर्देश का परिणाम होता है, और बाद के अंकगणितीय निर्देशों को NOP से बदल दिया जाता है।
नीचे अनुकूलित "MOV" और "PUSH" संचालन के उदाहरण दिए गए हैं:
ऑपरेंड आकार से सावधान रहें। संचालन के दौरान सही आकार को बनाए रखना महत्वपूर्ण है।
ANY.RUN विशेषज्ञों के इस लेख में, हमने गुलोडर का उपयोग वास्तविक दुनिया के उदाहरण के रूप में किया है, ताकि अस्पष्टता कम करने की विशिष्ट रणनीतियों को उजागर किया जा सके। हमने कोड का विश्लेषण करने के साथ शुरुआत की, फिर इसी तरह की आपत्तिजनक रणनीति को समूहीकृत किया, और अंत में, प्रत्येक से निपटने के लिए अनोखे तरीके सोचे।
लेकिन यह समझना महत्वपूर्ण है कि ये तकनीकें एक आकार-फिट-सभी समाधान नहीं हैं। प्रत्येक मैलवेयर नमूना अपनी अनूठी अस्पष्टता रणनीतियों को प्रस्तुत कर सकता है जिन्हें अद्वितीय प्रतिवादों की आवश्यकता होती है।
हमारी चर्चा अस्पष्टता जैसे जटिल कार्य को स्पष्ट, प्रबंधनीय चरणों में विभाजित करने के महत्व को रेखांकित करती है। याद रखें कि किसी भी मैलवेयर की उलझन को सफलतापूर्वक दूर करने के लिए विस्तृत विश्लेषण, अस्पष्टता पैटर्न का पता लगाना और अनुकूलित कार्यनीतियां बनाना शामिल है।