
تعطيل PatchGuard وDriver Signature Enforcement عند الإقلاع
EfiGuard هو بوتكيت UEFI محمول بتقنية x64 يقوم بتصحيح مدير الإقلاع ومُحمل الإقلاع ونواة ويندوز أثناء الإقلاع لتعطيل PatchGuard و Driver Signature Enforcement (DSE).
إذا كنت تبحث فقط عن تجربة EfiGuard، انتقل إلى الاستخدام.
يدعم حاليًا جميع إصدارات ويندوز x64 المتوافقة مع EFI التي تم إصدارها على الإطلاق، من Vista SP1 إلى Windows 11.
سهل الاستخدام: يمكن الإقلاع من USB أو من قسم EFI في ويندوز عبر مُحمل يقوم تلقائيًا بإيجاد وتشغيل ويندوز. يمكن أيضًا تحميل وتهيئة برنامج التشغيل يدويًا باستخدام إما UEFI shell أو المُحمل.
يستخدم مكتبة مفكك الشفرة Zydis بشكل مكثف لفك ترميز التعليمات السريع في وقت التشغيل لدعم تحليل أكثر قوة مما هو ممكن مع مطابقة التوقيعات، والتي غالبًا ما تتطلب تغييرات مع تحديثات النظام الجديدة.
يعمل بشكل سلبي: لا يقوم برنامج التشغيل بتحميل أو بدء تشغيل مدير إقلاع ويندوز. بدلاً من ذلك، يتفاعل مع تحميل bootmgfw.efi بواسطة مدير إقلاع البرامج الثابتة عبر قائمة اختيار الإقلاع أو تطبيق EFI مثل المُحمل. إذا تم إقلاع نظام تشغيل غير ويندوز، سيقوم برنامج التشغيل تلقائيًا بإلغاء تحميل نفسه.
يدعم التصحيح على أربع مراحل عندما يبدأ bootmgfw.efi تشغيل bootmgr.efi بدلاً من winload.efi. هذا هو الحال عند تحميل ملف WIM لتشغيل WinPE أو إعداد ويندوز أو وضع استرداد ويندوز.
استرداد سلس: في حالة فشل التصحيح، سيعرض برنامج التشغيل معلومات الخطأ ويطالب إما بمتابعة الإقلاع أو إعادة التشغيل بالضغط على ESC. هذا صحيح حتى مرحلة تصحيح النواة النهائية، لأن مرحلة التصحيح الأخيرة تحدث قبل استدعاء ExitBootServices. العديد من بوتكيتات UEFI لويندوز تقوم بربط OslArchTransferToKernel، والتي بالرغم من سهولة العثور عليها عبر مطابقة الأنماط، إلا أنها دالة تنفذ في الوضع المحمي بعد ExitBootServices. هذا يعني عدم توفر خدمات الإقلاع لإعلام المستخدم بوجود مشكلة.

محاكاة فشل التصحيح مع معلومات الخطأ
قابل للتصحيح: يمكنه إخراج الرسائل إلى مصحح النواة والشاشة (وإن كانت مخزنة مؤقتًا) أثناء مرحلة تصحيح النواة، وإلى منفذ تسلسلي أو الشاشة دون تخزين مؤقت أثناء مراحل تصحيح مدير الإقلاع ومُحمل الإقلاع. إذا تم تجميع برنامج التشغيل مع معلومات تصحيح PDB، فمن الممكن تحميل رموز التصحيح في أي نقطة بعد تهيئة HAL عن طريق تحديد قاعدة برنامج تشغيل DXE الافتراضي وتصحيحه كما تفعل مع برنامج تشغيل NT عادي.
تجاوزات DSE: متاحة إما كتعطيل DSE بنمط UPGDSED مباشر عند الإقلاع أو كخطاف على خدمة SetVariable() EFI runtime. هذا الأخير يعمل كباب خلفي لقراءة/كتابة في وضع النواة يمكن استدعاؤه من ويندوز باستخدام NtSetSystemEnvironmentValueEx ويسمح بتعيين g_CiEnabled/g_CiOptions إلى القيمة المطلوبة. يتم توفير تطبيق صغير بنمط DSEFix باسم EfiDSEFix.exe يمكن استخدامه لهذا الغرض. من الممكن أيضًا ترك DSE مفعلًا وتعطيل PatchGuard فقط. سيستخدم المُحمل طريقة خطاف SetVariable بشكل افتراضي، نظرًا لحقيقة أن بعض برامج مكافحة الغش ومكافحة الفيروسات لا تفهم الفرق بين الغش أو البرامج الضارة وبرامج التشغيل الموقعة ذاتيًا بشكل عام وتستهدف إصلاح UPGDSED.
يدعم النوى ومُحملي الإقلاع المعدلة على القرص عن طريق تصحيح ImgpValidateImageHash في كل مرحلة بالإضافة إلى ImgpFilterValidationFailure، والتي قد تقوم بإبلاغ بعض أنواع الانتهاكات بصمت إلى TPM أو ملف سجل SI.
يسمح بتشغيل Secure Boot مع ويندوز 7 (ليست مزحة!). ويندوز 7 نفسه غير مدرك لـ Secure Boot لأنه لا يدعمه، أو (رسميًا) حتى الإقلاع بدون CSM. هذا مفيد للأشخاص الذين يرغبون في استخدام ويندوز 7 على جهاز مقفل يتطلب WHQL Secure Boot. مقالة الويكي حول كيفية جعل هذا يعمل هنا.

WinObjEx64 على ويندوز 7 مع Secure Boot مفعل
SetVariable سيسبب خطأ SECURE_KERNEL_ERROR إذا تم استخدامه للكتابة إلى g_CiOptions.هناك طريقتان لاستخدام EfiGuard: الإقلاع باستخدام تطبيق المُحمل، الذي سيقوم بتحميل برنامج التشغيل وتشغيل ويندوز نيابة عنك، أو تثبيت برنامج التشغيل كإدخال UEFI driver ليتم تحميله تلقائيًا بواسطة البرامج الثابتة.
يمكن أن يكون تثبيت برنامج التشغيل أفضل في بعض التكوينات المتقدمة مثل الإقلاع المتعدد، لكن المُحمل هو الأسهل استخدامًا ويجب أن يعمل بشكل جيد في جميع التكوينات. انظر الجدول أدناه لأهم الاختلافات بين الطريقتين. إذا كنت غير متأكد، اختر تطبيق المُحمل.
| الموقع | التثبيت | قابلية التخطي؟ | أي نظام تشغيل يتم إقلاعه؟ | |
|---|---|---|---|---|
| UEFI Driver Entry | يجب أن يكون على ESP | عبر UEFI Shell | ❌ | نفس السابق |
مقارنة المُحمل مقابل UEFI driver entry
EFI/Boot/Loader.efi إلى bootx64.efi.X:، يجب أن تكون مسارات الملفين الآن X:/EFI/Boot/{bootx64|EfiGuardDxe}.efiSetVariable (الافتراضي)، قم بتشغيل EfiDSEFix.exe -d من موجه أوامر المسؤول بعد الإقلاع لتعطيل DSE، أو قم بتشغيل EfiDSEFix.exe لرؤية القائمة الكاملة للخيارات.لاحظ أنك لا تحتاج إلى استخدام محرك أقراص منفصل للمُحمل. إذا كان مفضلاً، يمكنك تثبيت EfiGuard على ESP المثبت عليه ويندوز بالفعل. ومع ذلك، هذا أكثر تعقيدًا إلى حد ما حيث ستحتاج إلى إضافة إدخال إقلاع UEFI للمُحمل.
للقيام بذلك، قم بتثبيت ESP عند X: باستخدام mountvol X: /S واتبع الخطوات أعلاه، لكن لا تقم بإعادة تسمية المُحمل وانسخ كلا الملفين ببساطة إلى X:/EFI/Boot. بعد ذلك، ستحتاج إلى إضافة إدخال إقلاع UEFI يدويًا من UEFI Shell باستخدام bcfg boot addp 0 Loader.efi "EfiGuard"، أو بدلاً من ذلك باستخدام efibootmgr (لينكس)، أو EasyUEFI (ويندوز)، أو ما شابه ذلك.
X: باستخدام mountvol X: /S.EfiGuardDxe.efi إلى X:/EFI/Boot/EfiGuardDxe.efi.bcfg driver add 0 EfiGuardDxe.efi "EfiGuardDxe".SetVariable (الافتراضي)، قم بتشغيل EfiDSEFix.exe -d من موجه أوامر المسؤول بعد الإقلاع لتعطيل DSE، أو قم بتشغيل EfiDSEFix.exe لرؤية القائمة الكاملة للخيارات.ملاحظة: اعتمادًا على البرامج الثابتة الخاصة بك، قد تحتاج إلى استخدام "addp" في الخطوة 3 بدلاً من "add". يُعرف أن VirtualBox يتطلب ذلك، وربما بعض البرامج الثابتة للوحات الأم أيضًا.
ملاحظة: بعض البرامج الثابتة القديمة جدًا أو غير المتوافقة قد لا تدعم طريقة التثبيت هذه على الإطلاق. على هذه الأنظمة، لن يكون لديك خيار سوى استخدام المُحمل بدلاً من ذلك.
يتطلب EfiGuard EDK2 للبناء. إذا لم يكن لديك EDK2 مثبتًا، اتبع الخطوات في Getting Started with EDK2 أولاً لأن نظام بناء EDK2 معقد إلى حد ما في الإعداد. يفترض هذا القسم أن لديك دليل workspace يشير إليه المتغير البيئي WORKSPACE الخاص بك، مع نسخة من EDK2 مسحوبة في workspace/edk2. المترجمات المدعومة هي MSVC و Clang و GCC و ICC.
workspace/edk2/EfiGuardPkg.build -a X64 -t VS2019 -p EfiGuardPkg/EfiGuardPkg.dsc -b RELEASE، مع استبدال سلسلة الأدوات الخاصة بك بـ VS2019.سينتج عن ذلك EfiGuardDxe.efi و Loader.efi في workspace/Build/EfiGuard/RELEASE_VS2019/X64.
يتطلب EfiDSEFix Visual Studio للبناء.
EfiGuard.sln وقم ببناء الحل.سيكون الملف الثنائي الناتج EfiDSEFix.exe في Application/EfiDSEFix/bin.
يتضمن حل Visual Studio أيضًا مشاريع لـ EfiGuardDxe.efi و Loader.efi والتي يمكن استخدامها مع VisualUefi، لكن هذه المشاريع لا تُبنى افتراضيًا لأنها لن ترتبط بدون كود إضافي، وسيكون ناتج البناء أدنى (أكبر) مما ينتجه EDK2. Loader.efi لن يرتبط على الإطلاق بسبب عدم وجود UefiBootManagerLib في VisualUefi. لذلك، تُستخدم ملفات المشروع هذه كمساعدة تطوير فقط ويجب أن تظل ملفات EFI تُجمع باستخدام EDK2. لإعداد VisualUefi لهذا الغرض، انسخ المستودع إلى workspace/VisualUefi وافتح EfiGuard.sln.
بينما EfiGuard هو بوتكيت UEFI، إلا أنه لم يبدأ كواحد. كان EfiGuard في الأصل مُصححًا على القرص يعمل على NT (مشابه لـ UPGDSED)، ويهدف إلى اختبار جدوى نهج قائم على مفكك الشفرة، بدلاً من استخدام رموز PDB والتوقيعات الخاصة بالإصدار. لا يزال PatchNtoskrnl.c يشبه إلى حد كبير هذا التصميم الأصلي. فقط بعد أن أثبت هذا النهج نجاحه، دون الحاجة إلى تعديلات في الكود لأكثر من عام من تحديثات ويندوز، دخل UEFI إلى الصورة كوسيلة لتحسين القدرات وسهولة الاستخدام بشكل أكبر.
بعض الفوائد التي يوفرها نهج البوتكيت تشمل:
bcdedit.ImgpValidateImageHash (على الرغم من أن هذا لا يزال اختياريًا).db.كان التجسيد الأولي لـ EfiGuard كبوتكيت محاولة لجعل UEFI-Bootkit الخاص بـ dude719 يعمل مع الإصدارات الحديثة من ويندوز 10، لأنه أصبح قديمًا ولم يعد يعمل على الإصدارات الأحدث (مثل UPGDSED، غالبًا بسبب مسح الأنماط الحساسة للإصدار). بينما تمكنت في النهاية من جعله يعمل، لم أكن راضيًا عن النتيجة، ويرجع ذلك في الغالب إلى اختيار ربط OslArchTransferToKernel، والتي كما ذكرنا أعلاه تُنفذ في الوضع المحمي وبعد استدعاء ExitBootServices. بالإضافة إلى ذلك، لم أكن راضيًا عن القدرة على تصحيح بعض إصدارات ويندوز 10 فقط؛ أردت أن يعمل البوتكيت على كل إصدار متوافق مع EFI من ويندوز x64 تم إصداره حتى الآن. ولهذا السبب، أعدت كتابة البوتكيت من الصفر مع الأهداف التالية:
يظهر في الرسم التخطيطي أعلاه نظرة عامة كبيرة لسير عمل الإقلاع النهائي لـ EfiGuard. للحصول على التفاصيل الخاصة بخطافات وتصحيحات المكونات الفردية، انظر EfiGuardDxe/PatchXxx.c في ملفات المصدر. لتهيئة/إلغاء تحميل برنامج التشغيل وخطافات EFI Boot and Runtime Services، انظر EfiGuardDxe.c.
EfiGuard مرخص تحت GPLv3. الملفات في الوحدة الفرعية EfiGuardDxe/Zydis مرخصة تحت رخصة MIT.
| Loader | في أي مكان | غير مطلوب | ✔️ | ويندوز |