
حقن ملفات DLL في عملية المستكشف باستخدام الأيقونات
هذه تقنية حقن لملفات DLL في مستكشف Windows تستخدم مربع حوار تغيير الأيقونة في Windows.
يمكنها خداع المستخدمين لتحميل ملف DLL خبيث في عملية المستكشف الخاصة بهم:
https://github.com/0xda568/IconJector/assets/61665703/06428402-764c-4279-b762-1d01082552c8
بالإضافة إلى ذلك، يمكن استخدامها لحقن DLL من عملية أخرى في المستكشف:
https://github.com/0xda568/IconJector/assets/61665703/bbf53775-ad8d-422b-b186-663ff5074976
إلى جانب احتوائها على الكود البرمجي، تُستخدم ملفات DLL أيضًا لتخزين موارد مثل الأيقونات. في العرض التوضيحي يمكنك رؤية أن الأيقونات الافتراضية مخزّنة في shell32.dll:

في الواقع، في إصدارات Windows الحديثة، يتم تخزينها في shell32.dll.mui، لكنها ما تزال تُعرض على أنها shell32.dll
لكي تتمكن عملية المستكشف من عرض جميع الأيقونات المخزنة في ملف DLL داخل مربع الحوار، يجب عليها تحميل ملف DLL في الذاكرة حتى يمكن تحليله.
علاوة على ذلك، تمتلك ملفات DLL في Windows القدرة على تعريف دالة DllMain اختيارية، والتي يتم استدعاؤها عند تحميل ملف DLL أو إلغاء تحميله باستخدام دالتي LoadLibrary وFreeLibrary.
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.
}
هذا يعني أنه إذا تم تحميل ملف DLL يحتوي على دالة DllMain بواسطة المستكشف، فإن الكود المعرّف في دالة DllMain سيُنفَّذ في ذاكرة المستكشف.
وهذا هو بالضبط ما يتم هنا. إضافة إلى ذلك، يتم إخفاء ملف DLL على هيئة أيقونة:
«الأيقونة» هي في الواقع ملف DLL بسيط بامتداد .ico يفتح تطبيق الآلة الحاسبة مع مورد أيقونة تمت إضافته باستخدام Resource Hacker. (يمكن أيضًا إضافة الأيقونة في Visual Studio)
توجد بعض الحالات الشاذة فيما يتعلق بمظهر الأيقونة في عرض المجلد. لقد اختبرت هذا على إصدارين مختلفين من Windows 10 (الأحدث وإصدار أقدم) وعلى Windows 11.
في كلا إصدارَي Windows 10، لم يتم عرض الأيقونة المخزنة داخل ملف DLL عند تغيير الامتداد إلى .ico

ومع ذلك، في أحدث إصدار من Windows 10، عملت بشكل صحيح حتى حاولت فتح «الأيقونة» داخل تطبيق الصور. ومنذ ذلك الحين، لم أتمكن من إعادة تكرار ذلك.

في Windows 11، تم عرض ملف DLL المموّه تمامًا مثل أيقونة عادية في عرض المستكشف. ومع ذلك، عند فتحه في تطبيق الصور، يظهر خطأ.
https://github.com/0xda568/IconJector/assets/61665703/748c1012-1d2c-47dd-915f-860ffc6d1b05
إلى جانب خداع المستخدم لتحميل ملف DLL يدويًا، أمام المهاجم أيضًا خيار استخدام هذه التقنية لحقن ملف DLL في عملية المستكشف برمجيًا:
أولًا، يتم إنشاء مجلد في المجلد المؤقت، ويتم فتح خصائص المجلد باستخدام SHObjectProperties. لاسترداد مقبض النافذة بغض النظر عن لغة النظام، يتم استخدام EnumWindows مع دالة استدعاء تتحقق من اسم المجلد المميز في كل نافذة مفتوحة.

من خلال صفحة الخصائص، يتم استدعاء مربع حوار تغيير الأيقونة، والذي يتم أيضًا استرداد مقبضه باستخدام EnumWindows. أخيرًا، يتم تغيير مسار الأيقونة إلى ملف DLL (والذي له امتداد .ico في هذه الحالة)، مما يجعل المستكشف يقوم بتحميل ملف DLL بعد الضغط على زر OK.
هذه طريقة خفية جدًا لحقن DLL في عملية المستكشف لأنها لا تستخدم واجهة برمجة التطبيقات المعتادة لحقن DLL. ومع ذلك، فإنها تُنتج نافذتين منبثقتين قصيرتين، ليستا مزعجتين كثيرًا. لذلك يمكن لمهاجم استخدامها كأسلوب لتجنب برامج مكافحة الفيروسات لتنفيذ كود عبر عملية المستكشف الشرعية أو لتحميل rootkit من نوع UMD.
أيضًا، قد يكون نشر ملفات DLL متنكرة كملفات .ico ناقل هجوم مثيرًا للاهتمام.
للحصول على مقابض النوافذ الصحيحة، استخدمت Spy++، وهي أداة يتم تثبيتها مع Visual Studio.

شكرًا جزيلًا لـ Bill G. من Microsoft على أيقونة المجلد الجميلة!
شكرًا لك، أيها الشخص العشوائي على الإنترنت، على أيقونة الحقن الجميلة!