
Astaroth/Guildma इंजेक्टर DLL को डिओबफस्केट करने के लिए IDA पायथन स्क्रिप्ट
Astaroth/Guildma इंजेक्टर DLL को डीऑबफसकेट करने के लिए IDA पायथन स्क्रिप्ट
हाल ही में एक Astaroth/Guildma अभियान से इंजेक्टर DLL का विश्लेषण करने की कोशिश करते समय (SANS ISC से इस डायरी के लिए धन्यवाद), मुझे obfuscation का एक वाकई कष्टप्रद प्रयास मिला।
एक फ़ंक्शन (जिसे मैंने नीचे दी गई छवि में time_waster_3000 नाम दिया है) DLL में 1,000 से अधिक बार (!!!) कॉल किया जाता है। यह फ़ंक्शन एक यादृच्छिक word के साथ-साथ छह हार्डकोडेड स्ट्रिंग्स को तर्क के रूप में लेता है। फ़ंक्शन स्वयं अंकगणित की एक खरगोश-छेद (rabbit hole) है, जो जहाँ तक मैं बता सकता था, किसी व्यावहारिक उद्देश्य की पूर्ति नहीं करता (एक रिवर्सर का समय बर्बाद करने के अलावा)। यहाँ DLLEntry उन कष्टप्रद कॉल्स के साथ कैसा दिखता है:
इस IDA पायथन स्क्रिप्ट का उद्देश्य इस जंक फ़ंक्शन के कॉल के साथ-साथ इसके तर्कों से जुड़े कोड के सभी ब्लॉकों को छिपाना है। स्क्रिप्ट चलाने के बाद DLLEntry कैसा दिखता है:
स्क्रिप्ट पैडिंग फ़ंक्शन के कॉल को खोजकर काम करती है, जिसे स्क्रिप्ट में call sub_CHANGEME द्वारा दर्शाया गया है। इसलिए, आपको इसे स्क्रिप्ट में अपने नमूने पर मिले फ़ंक्शन नाम के साथ बदलना होगा। उदाहरण के लिए, idc.print_operand(x, 0) == 'sub_CHANGEME' को idc.print_operand(x, 0) == 'sub_431000' में बदलना।
मैंने तर्क पुश (argument pushes) के बजाय call sub_CHANGEME निर्देश पर पुनरावृति करना चुना। इसका कारण सरल है: हार्डकोडेड स्ट्रिंग्स बाइनरी में कई स्थानों पर मौजूद हैं; इसलिए, जब मैंने उक्त स्ट्रिंग्स के ऑफसेट से जुड़े पुश निर्देशों द्वारा खोज करने की कोशिश की, तो स्क्रिप्ट को इस जंक डेटा के सभी उदाहरण नहीं मिले।
स्क्रिप्ट पहले तर्कों के पासिंग और पैडिंग फ़ंक्शन के कॉल के प्रत्येक उदाहरण को एक संक्षिप्त (collapsed) ब्लॉक के रूप में छिपाकर काम करती थी। चूँकि फ़ंक्शन कई बार लगातार कॉल किया जाता है, इससे डिस्सेम्बली दृश्य में बड़े खाली स्थान बन गए। मैंने इसे अपडेट किया है ताकि इस पैडिंग के क्रमिक उदाहरणों को एक ही संक्षिप्त ब्लॉक में छिपाया जा सके, जो वास्तव में पठनीयता में सुधार करता है।