Unpacking binaries
पैक किए गए बाइनरी की पहचान
स्ट्रिंग की कमी: पैक किए गए बाइनरी में लगभग कोई स्ट्रिंग न होना एक सामान्य बात है
बहुत सारी अनउसेड स्ट्रिंग्स: जब कोई मैलवेयर किसी प्रकार के कमर्शियल पैकर का उपयोग कर रहा होता है तो बहुत सारी स्ट्रिंग्स बिना क्रॉस-रेफरेंसेस के पाना आम होता है। यदि ये स्ट्रिंग्स मौजूद हैं तो यह यह नहीं मतलब है कि बाइनरी पैक नहीं है।
आप भी कुछ टूल्स का उपयोग कर सकते हैं ताकि आप जांच सकें कि कौन सा पैकर उपयोग किया गया था बाइनरी को पैक करने के लिए:
मूल अनुशंसाएं
शुरू करें पैक किए गए बाइनरी का विश्लेषण नीचे से IDA में और ऊपर की ओर। अनपैकर्स उस समय बाहर निकल जाते हैं जब अनपैक कोड बाहर निकलता है, इसलिए यह असंभाव है कि अनपैकर शुरुआत में अनपैक कोड को निष्पादित करने के लिए क्रियान्वित करेगा।
JMP's या CALLs की खोज करें रजिस्टर्स या मेमोरी के क्षेत्रों के लिए। यहाँ तक कि फंक्शन्स पुशिंग आर्ग्यूमेंट्स और एड्रेस डायरेक्शन पर कॉल करने वाले
retn
की भी खोज करें, क्योंकि इस मामले में फंक्शन का रिटर्न पहले स्टैक पर पुश किए गए पते को कॉल करने से पहले हो सकता है।VirtualAlloc
पर ब्रेकपॉइंट लगाएं क्योंकि यह मेमोरी में स्थान आवंटित करता है जहां कार्यक्रम अनपैक कोड लिख सकता है। "यूजर कोड तक चलें" या F8 का उपयोग करें फ़ंक्शन को निष्पादित करने के बाद EAX के अंदर मान प्राप्त करने के लिए और "डंप में उस पते का पालन करें"। आप कभी नहीं जान सकते कि क्या यह वह क्षेत्र है जहां अनपैक कोड सहेजा जाएगा।VirtualAlloc
के साथ मान "40" के रूप में एक तर्क का उपयोग करना Read+Write+Execute (कुछ कोड जिसे निष्पादित करने की आवश्यकता है यहाँ कॉपी किया जाएगा)।कोड को अनपैक करते समय अक्सर कई कॉल्स को अंकगणितीय कार्यों और फंक्शन्स जैसे
memcopy
याVirtual
Alloc
के लिए पाना सामान्य है। यदि आप खुद को एक फंक्शन में पाते हैं जो केवल अंकगणितीय कार्यों को करने लगता है और शायद कुछmemcopy
, तो सिफारिश है कि आप कोड के अंत को खोजने की कोशिश करें (शायद एक JMP या किसी रजिस्टर को कॉल करने की) या कम से कम आखिरी फंक्शन को कॉल करने की और फिर उसे चलाने की कोशिश करें क्योंकि कोड दिलचस्प नहीं है।कोड को अनपैक करते समय ध्यान दें जब भी आप मेमोरी क्षेत्र बदलते हैं क्योंकि मेमोरी क्षेत्र का परिवर्तन अनपैकिंग कोड की शुरुआत का संकेत हो सकता है। आप आसानी से प्रक्रिया हैकर का उपयोग करके एक मेमोरी क्षेत्र को डंप कर सकते हैं (प्रक्रिया --> गुण --> मेमोरी)।
कोड को अनपैक करने की कोशिश करते समय एक अच्छा तरीका है जानने के लिए कि क्या आप पहले से ही अनपैक कोड के साथ काम कर रहे हैं (ताकि आप इसे बस डंप कर सकें) बाइनरी की स्ट्रिंग्स की जांच करना। यदि किसी समय आप किसी जंप को करते हैं (शायद मेमोरी क्षेत्र बदलते हैं) और आप देखते हैं कि बहुत सारी स्ट्रिंग्स जोड़ दी गई हैं, तो आप जान सकते हैं आप अनपैक कोड के साथ काम कर रहे हैं। हालांकि, यदि पैकर में पहले से ही बहुत सारी स्ट्रिंग्स हैं तो आप देख सकते हैं कि "http" शब्द कितनी स्ट्रिंग्स में है और देख सकते हैं कि क्या यह संख्या बढ़ती है।
जब आप किसी मेमोरी क्षेत्र से एक एक्जीक्यूटेबल को डंप करते हैं तो आप कुछ हेडर्स को ठीक कर सकते हैं PE-bear का उपयोग करके।
Last updated