
لحين أن DLLMain هو السبيل الوحيد
للحالات التي يكون فيها DLLMain هو السبيل الوحيد
LdrLockLiberator عبارة عن مجموعة من التقنيات للهروب من قفل المُحمِّل (Loader Lock) أو تجاوزه أثناء تنفيذ الكود الخاص بك من DllMain أو من أي مكان آخر قد يتواجد فيه القفل. تم إصداره بالتزامن مع مقال "الاختطاف المثالي لملفات DLL". نمنحك المفتاح لفتح مُحمِّل المكتبات وتنفيذ ما تريد مع المُحمِّل الخاص بك (على جهازك الخاص)!
تهدف هذه التقنيات إلى أن تكون شاملة ونظيفة وآمنة 100% حيثما أمكن. وهي مصممة للعمل دون تعديل حماية الذاكرة أو المؤشرات. هذا أمر مهم للبقاء متوافقًا مع تقنيات التخفيف الحديثة للاستغلال. البنية المدعومة رسميًا الوحيدة هي x86-64 (حواسيب 32-بت أصبحت منقرضة إلى حد كبير).
هل تريد معرفة الأسباب المعمارية وراء كون DllMain مزعجًا إلى هذا الحد على ويندوز بينما لا تعاني أنظمة التشغيل الشبيهة بيونكس من ذلك؟ تفضل!.
إنها بالضبط كما يبدو اسمها. افتح قفل المُحمِّل (Loader Lock)، واضبط أحداث المُحمِّل، واعكس قيمة LdrpWorkInProgress. يُنصح بإبقاء RUN_PAYLOAD_DIRECTLY_FROM_DLLMAIN غير مُعرَّف لتحقيق أفضل استقرار.
لا تستخدم هذه التقنية في كود الإنتاج. لقد أُنشئت هذه التقنية كنتيجة ثانوية لفضولي الشديد وإصراري على عدم ترك أي حجر دون تقليبه. أي شيء تفعله بهذا الكود فهو على مسؤوليتك.
نستخدم الدالة atexit من CRT التي تستخدمها عادةً ملفات EXE في كود DLL الخاص بنا للهروب من قفل المُحمِّل عند خروج البرنامج. بالنسبة للتحميل الديناميكي (باستخدام LoadLibrary)، يصبح هذا الأمر آمنًا 100% عن طريق تثبيت المكتبة (LDR_ADDREF_DLL_PIN) باستخدام LdrAddRefDll بحيث لا يؤدي استدعاء FreeLibrary لاحقًا إلى إزالة ملف DLL الخاص بنا من الذاكرة.
قريبًا!
تختطف النماذج المقدمة ملف MpClient.dll من C:\Program Files\Windows Defender\Offline\OfflineScannerShell.exe. توجد تعليمات في تعليقات الكود المصدري لتكييف ذلك بسهولة مع أي ثنائي آخر من DLL وبرنامج (بشكل أساسي فقط تحديث الصادرات للتحميلات الثابتة)!
كإثبات للمفهوم، نقوم بتشغيل ShellExecute كحمولة افتراضية. ومع ذلك، يمكنك جعل هذا يفعل أي شيء تريده!
تم اختبار LdrLockLiberator.c الموجود في جذر هذا المشروع للتجميع على Visual Studio 2022.
اربط مع NTDLL عن طريق تحديد مشروع Visual Studio الحالي في نافذة Solution Explorer، ثم انتقل إلى Project > Properties في شريط القوائم. من القوائم المنسدلة Configuration في الأعلى، حدد All Configurations و All Platforms. الآن، انتقل إلى Linker > Input ثم أضف إلى Additional Dependencies: ntdll.lib.
C:\Windows\System32\msvcrt.dll)5edc723b50ea28a070cad361dd0927df402b7a861a036bbcf11d27ebba77657dKitSetup.execd) إلى LdrLockLiberatorWDK في هذا المستودعbuildتم! تم بناء ملف DLL الخاص بك وأصبح جاهزًا للاستخدام!
كبديل عن WDK، من المحتمل أن يعمل التجميع باستخدام MinGW أيضًا.
MIT License - حقوق النشر (C) 2023-2024 Elliot Killick [email protected]