
आइकन का उपयोग करके explorer प्रक्रिया में DLLs इंजेक्ट करें
यह एक Windows Explorer DLL इंजेक्शन तकनीक है जो Windows पर change icon डायलॉग का उपयोग करती है।
यह उपयोगकर्ताओं को उनके explorer प्रोसेस में एक दुर्भावनापूर्ण DLL लोड करने के लिए धोखा दे सकती है:
https://github.com/0xda568/IconJector/assets/61665703/06428402-764c-4279-b762-1d01082552c8
इसके अतिरिक्त, इसका उपयोग किसी अन्य प्रोसेस से एक DLL को explorer में इंजेक्ट करने के लिए भी किया जा सकता है:
https://github.com/0xda568/IconJector/assets/61665703/bbf53775-ad8d-422b-b186-663ff5074976
कोड संग्रहीत करने के अलावा, DLL का उपयोग आइकन जैसे संसाधनों को संग्रहीत करने के लिए भी किया जाता है। प्रदर्शन में आप देख सकते हैं कि डिफ़ॉल्ट आइकन shell32.dll में संग्रहीत हैं:

वास्तव में, आधुनिक Windows संस्करणों में, वे shell32.dll.mui में संग्रहीत होते हैं, लेकिन फिर भी उन्हें shell32.dll के रूप में प्रदर्शित किया जाता है
explorer प्रोसेस के लिए डायलॉग में DLL में संग्रहीत सभी आइकन प्रदर्शित करने में सक्षम होने हेतु, उसे DLL को मेमोरी में लोड करने की आवश्यकता होती है ताकि उसे पार्स किया जा सके।
इसके अलावा, Windows में DLL में एक वैकल्पिक DllMain फ़ंक्शन परिभाषित करने की क्षमता होती है, जिसे LoadLibrary और FreeLibrary फ़ंक्शन का उपयोग करके DLL को लोड या अनलोड करने पर कॉल किया जाता है।
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, // handle to DLL module
DWORD fdwReason, // reason for calling function
LPVOID lpvReserved ) // reserved
{
// Perform actions based on the reason for calling.
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
// Initialize once for each new process.
// Return FALSE to fail DLL load.
break;
case DLL_THREAD_ATTACH:
// Do thread-specific initialization.
break;
case DLL_THREAD_DETACH:
// Do thread-specific cleanup.
break;
case DLL_PROCESS_DETACH:
if (lpvReserved != nullptr)
{
break; // do not do cleanup if process termination scenario
}
// Perform any necessary cleanup.
break;
}
return TRUE; // Successful DLL_PROCESS_ATTACH.
}
इसका अर्थ है कि यदि DllMain फ़ंक्शन वाला एक DLL explorer द्वारा लोड किया जाता है, तो DllMain फ़ंक्शन में परिभाषित कोड explorer की मेमोरी में निष्पादित होगा।
और यही वास्तव में यहाँ किया जा रहा है। इसके अलावा, DLL को एक आइकन के रूप में प्रच्छन्न किया जा रहा है:
"आइकन" वास्तव में एक साधारण DLL फ़ाइल है जिसका .ico एक्सटेंशन है, जो Resource Hacker का उपयोग करके जोड़े गए एक आइकन संसाधन के साथ कैलकुलेटर ऐप खोलती है। (आइकन को Visual Studio में भी जोड़ा जा सकता है)
फ़ोल्डर दृश्य में आइकन की उपस्थिति के संबंध में कुछ विसंगतियाँ हैं। मैंने इसे दो अलग-अलग Windows 10 संस्करणों (नवीनतम और एक पुराने) और Windows 11 पर परीक्षण किया है।
दोनों Windows 10 संस्करणों पर, DLL के अंदर संग्रहीत आइकन तब प्रदर्शित नहीं हुआ जब एक्सटेंशन को .ico में बदला गया था

हालाँकि, नवीनतम Windows 10 संस्करण पर, यह तब तक काम करता रहा जब तक मैंने फोटो ऐप के अंदर "आइकन" खोलने का प्रयास नहीं किया। तब से, मैं इसे दोबारा नहीं बना पाया हूँ।

Windows 11 पर, प्रच्छन्न DLL को Explorer दृश्य में एक सामान्य आइकन की तरह प्रदर्शित किया गया। हालाँकि, जब इसे फोटो ऐप में खोला जाता है, तो एक त्रुटि प्रदर्शित होती है।
https://github.com/0xda568/IconJector/assets/61665703/748c1012-1d2c-47dd-915f-860ffc6d1b05
किसी उपयोगकर्ता को DLL को मैन्युअल रूप से लोड करने के लिए धोखा देने के अलावा, एक हमलावर के पास इस तकनीक का उपयोग करके DLL फ़ाइल को explorer प्रोसेस में प्रोग्रामेटिक रूप से इंजेक्ट करने का विकल्प भी होता है:
पहले, temp निर्देशिका में एक फ़ोल्डर बनाया जाता है, और SHObjectProperties का उपयोग करके फ़ोल्डर के गुण खोले जाते हैं। सिस्टम भाषा से स्वतंत्र रूप से विंडो का हैंडल प्राप्त करने के लिए, EnumWindows का उपयोग एक कॉलबैक फ़ंक्शन के साथ किया जाता है जो प्रत्येक खुली विंडो में विशिष्ट फ़ोल्डर नाम की जाँच करता है।

गुण पृष्ठ के माध्यम से, change icon डायलॉग लागू किया जाता है, जिसका हैंडल भी EnumWindows के साथ प्राप्त किया जाता है। अंत में, आइकन पथ को एक DLL (जिसका इस मामले में .ico एक्सटेंशन है) में बदल दिया जाता है, जिससे OK बटन दबाए जाने के बाद explorer DLL को लोड कर लेता है।
यह Explorer प्रोसेस में DLL इंजेक्ट करने का एक बहुत ही गुप्त तरीका है क्योंकि यह सामान्य DLL-इंजेक्शन API का उपयोग नहीं करता है। हालाँकि, यह दो छोटे पॉपअप उत्पन्न करता है, जो बहुत परेशान करने वाले नहीं हैं। इसलिए इसका उपयोग किसी हमलावर द्वारा वैध explorer प्रोसेस के माध्यम से कोड निष्पादित करने या UMD रूटकिट लोड करने के लिए AV बाईपास तकनीक के रूप में किया जा सकता है।
इसके अलावा, .ico फ़ाइलों के रूप में प्रच्छन्न DLL का प्रसार एक दिलचस्प हमला वेक्टर हो सकता है।
सही विंडो हैंडल प्राप्त करने के लिए, मैंने Spy++ का उपयोग किया, जो Visual Studio के साथ स्थापित होने वाला एक उपकरण है।

Microsoft से Bill G. को सुंदर फ़ोल्डर आइकन के लिए बहुत धन्यवाद!
इंटरनेट पर मौजूद अज्ञात व्यक्ति को, सुंदर इंजेक्शन आइकन के लिए धन्यवाद!