
बूट समय पर PatchGuard और Driver Signature Enforcement अक्षम करें
EfiGuard एक पोर्टेबल x64 UEFI बूटकिट है जो Windows बूट मैनेजर, बूट लोडर और कर्नेल को बूट समय पर पैच करता है ताकि PatchGuard और Driver Signature Enforcement (DSE) को अक्षम किया जा सके।
यदि आप केवल EfiGuard आज़माना चाहते हैं, तो उपयोग पर जाएं।
वर्तमान में Vista SP1 से Windows 11 तक जारी सभी EFI-संगत Windows x64 संस्करणों का समर्थन करता है।
उपयोग में आसान: एक लोडर के माध्यम से USB स्टिक या Windows EFI विभाजन से बूट किया जा सकता है जो स्वचालित रूप से Windows को ढूंढता और बूट करता है। ड्राइवर को UEFI शेल या लोडर का उपयोग करके मैन्युअल रूप से भी लोड और कॉन्फ़िगर किया जा सकता है।
Zydis डिसेसम्बलर लाइब्रेरी का व्यापक उपयोग करता है ताकि फास्ट रनटाइम इंस्ट्रक्शन डिकोडिंग के लिए सिग्नेचर मैचिंग की तुलना में अधिक मजबूत विश्लेषण का समर्थन किया जा सके, जिसमें अक्सर नए OS अपडेट के साथ बदलाव की आवश्यकता होती है।
निष्क्रिय रूप से काम करता है: ड्राइवर Windows बूट मैनेजर को लोड या शुरू नहीं करता है। इसके बजाय यह फर्मवेयर बूट मैनेजर द्वारा bootmgfw.efi के लोड होने पर कार्य करता है, बूट चयन मेनू या लोडर जैसे EFI एप्लिकेशन के माध्यम से। यदि गैर-Windows OS बूट किया जाता है, तो ड्राइवर स्वचालित रूप से स्वयं को अनलोड कर देगा।
चार-चरणीय पैचिंग का समर्थन करता है जब bootmgfw.efi bootmgr.efi शुरू करता है, winload.efi के बजाय। यह तब होता है जब WinPE, Windows Setup या Windows Recovery मोड को बूट करने के लिए WIM फ़ाइल लोड की जाती है।
सुगम पुनर्प्राप्ति: पैच विफलता की स्थिति में, ड्राइवर त्रुटि जानकारी प्रदर्शित करेगा और बूट जारी रखने या ESC दबाकर रीबूट करने का संकेत देगा। यह अंतिम कर्नेल पैच चरण तक भी सच है, क्योंकि अंतिम पैच चरण ExitBootServices कॉल करने से पहले होता है। कई UEFI Windows बूटकिट OslArchTransferToKernel को हुक करते हैं, जबकि पैटर्न मैचिंग द्वारा खोजना आसान है, यह एक फ़ंक्शन है जो ExitBootServices के बाद संरक्षित मोड में निष्पादित होता है। इसका मतलब है कि उपयोगकर्ता को यह बताने के लिए कोई बूट सेवाएँ उपलब्ध नहीं हैं कि कुछ गलत हो गया है।

त्रुटि जानकारी के साथ अनुकरित पैच विफलता
डीबग करने योग्य: कर्नेल पैचिंग चरण के दौरान कर्नेल डीबगर और स्क्रीन पर संदेश आउटपुट कर सकता है (हालांकि बफर किए गए), और बूट मैनेजर और बूट लोडर पैचिंग चरणों के दौरान सीरियल पोर्ट या अनबफर्ड स्क्रीन पर। यदि ड्राइवर PDB डीबग जानकारी के साथ संकलित किया गया है, तो HAL आरंभीकरण के बाद किसी भी बिंदु पर वर्चुअल DXE ड्राइवर बेस निर्दिष्ट करके और इसे सामान्य NT ड्राइवर की तरह डीबग करके डीबग प्रतीकों को लोड करना संभव है।
DSE बाईपास: बूट समय पर सीधे UPGDSED-शैली DSE अक्षम करने के रूप में या SetVariable() EFI रनटाइम सेवा पर हुक के रूप में उपलब्ध। बाद वाला एक मनमाना कर्नेल मोड रीड/राइट बैकडोर के रूप में कार्य करता है जिसे Windows से NtSetSystemEnvironmentValueEx का उपयोग करके कॉल किया जा सकता है और g_CiEnabled/g_CiOptions को वांछित मान पर सेट करने की अनुमति देता है। एक छोटा DSEFix-शैली एप्लिकेशन जिसका नाम EfiDSEFix.exe है, प्रदान किया गया है जिसका उपयोग ऐसा करने के लिए किया जा सकता है। DSE को सक्षम छोड़ना और केवल PatchGuard को अक्षम करना भी संभव है। लोडर डिफ़ॉल्ट रूप से SetVariable हुक विधि का उपयोग करेगा, इस तथ्य के कारण कि कुछ एंटी-चीट और एंटी-वायरस प्रोग्राम चीट या मैलवेयर और सामान्य रूप से स्व-हस्ताक्षरित ड्राइवरों के बीच अंतर नहीं समझते हैं और UPGDSED फिक्स को लक्षित करते हैं।
हर चरण पर ImgpValidateImageHash के साथ-साथ ImgpFilterValidationFailure को पैच करके डिस्क पर संशोधित कर्नेल और बूट लोडर का समर्थन करता है, जो चुपचाप TPM या SI लॉग फ़ाइल में कुछ प्रकार के उल्लंघनों की रिपोर्ट कर सकता है।
Windows 7 के साथ Secure Boot को काम करने की अनुमति देता है (मज़ाक नहीं!)। Windows 7 स्वयं Secure Boot से अनजान है क्योंकि यह इसका समर्थन नहीं करता है, या (आधिकारिक तौर पर) CSM के बिना बूट भी नहीं करता है। यह उन लोगों के लिए उपयोगी है जो एक लॉक डाउन डिवाइस पर Windows 7 का उपयोग करना चाहते हैं जिसके लिए WHQL Secure Boot की आवश्यकता है। इसे काम करने के तरीके पर विकी प्रविष्टि यहाँ है।

Secure Boot सक्षम के साथ Windows 7 पर WinObjEx64
SetVariable हुक यदि g_CiOptions में लिखने के लिए उपयोग किया जाता है तो SECURE_KERNEL_ERROR बगचेक का कारण बनेगा।EfiGuard का उपयोग करने के दो तरीके हैं: लोडर एप्लिकेशन को बूट करना, जो आपके लिए ड्राइवर को लोड करेगा और Windows शुरू करेगा, या ड्राइवर को UEFI ड्राइवर प्रविष्टि के रूप में स्थापित करना ताकि यह फर्मवेयर द्वारा स्वचालित रूप से लोड हो जाए।
कुछ उन्नत कॉन्फ़िगरेशन में जैसे कि मल्टी-बूटिंग करते समय ड्राइवर स्थापित करना बेहतर हो सकता है, लेकिन लोडर का उपयोग करना सबसे आसान है और सभी कॉन्फ़िगरेशन में अच्छी तरह से काम करना चाहिए। दो विधियों के बीच सबसे महत्वपूर्ण अंतरों के लिए नीचे दी गई तालिका देखें। यदि अनिश्चित हैं, तो लोडर एप्लिकेशन चुनें।
| स्थान | स्थापना | छोड़ने योग्य? | कौन सा OS बूट होता है? | |
|---|---|---|---|---|
| UEFI ड्राइवर प्रविष्टि | ESP पर होना चाहिए | UEFI शेल के माध्यम से | ❌ |
लोडर बनाम UEFI ड्राइवर प्रविष्टि तुलना
EFI/Boot/Loader.efi का नाम बदलकर bootx64.efi करें।X: मानते हुए, दो फ़ाइलों के पथ अब X:/EFI/Boot/{bootx64|EfiGuardDxe}.efi होने चाहिए।SetVariable हुक (डिफ़ॉल्ट) के साथ बूट किया है, तो बूट के बाद DSE को अक्षम करने के लिए एक व्यवस्थापक कमांड प्रॉम्प्ट से EfiDSEFix.exe -d चलाएं, या विकल्पों की पूरी सूची देखने के लिए EfiDSEFix.exe चलाएं।ध्यान दें कि आपको लोडर के लिए एक अलग ड्राइव का उपयोग करने की आवश्यकता नहीं है। यदि पसंद किया जाए, तो आप EfiGuard को उस ESP पर स्थापित कर सकते हैं जिस पर Windows पहले से स्थापित है। हालांकि, यह कुछ अधिक जटिल है क्योंकि आपको लोडर के लिए एक UEFI बूट प्रविष्टि जोड़ने की आवश्यकता होगी।
ऐसा करने के लिए, mountvol X: /S का उपयोग करके ESP को X: पर माउंट करें और उपरोक्त चरणों का पालन करें, लेकिन लोडर का नाम न बदलें और बस दोनों फ़ाइलों को X:/EFI/Boot में कॉपी करें। उसके बाद, आपको UEFI Shell से bcfg boot addp 0 Loader.efi "EfiGuard" का उपयोग करके मैन्युअल रूप से एक UEFI बूट प्रविष्टि जोड़ने की आवश्यकता होगी, या वैकल्पिक रूप से efibootmgr (Linux), EasyUEFI (Windows), या इसी तरह का उपयोग करें।
mountvol X: /S का उपयोग करके ESP को X: पर माउंट करें।EfiGuardDxe.efi को X:/EFI/Boot/EfiGuardDxe.efi पर कॉपी करें।bcfg driver add 0 EfiGuardDxe.efi "EfiGuardDxe"।SetVariable हुक (डिफ़ॉल्ट) के साथ बूट किया है, तो बूट के बाद DSE को अक्षम करने के लिए एक व्यवस्थापक कमांड प्रॉम्प्ट से EfiDSEFix.exe -d चलाएं, या विकल्पों की पूरी सूची देखने के लिए EfiDSEFix.exe चलाएं।नोट: आपके फर्मवेयर के आधार पर, आपको चरण 3 में "add" के बजाय "addp" का उपयोग करने की आवश्यकता हो सकती है। VirtualBox को इसकी आवश्यकता होने के लिए जाना जाता है, और संभवतः कुछ मदरबोर्ड फर्मवेयर भी ऐसा करते हैं।
नोट: कुछ बहुत पुराने या गैर-अनुपालक फर्मवेयर इस स्थापना विधि का बिल्कुल भी समर्थन नहीं कर सकते हैं। ऐसे सिस्टम पर आपके पास लोडर का उपयोग करने के अलावा कोई विकल्प नहीं होगा।
EfiGuard को बनाने के लिए EDK2 की आवश्यकता होती है। यदि आपने EDK2 स्थापित नहीं किया है, तो पहले Getting Started with EDK2 में दिए गए चरणों का पालन करें क्योंकि EDK2 बिल्ड सिस्टम सेट अप करना काफी जटिल है। यह खंड मानता है कि आपके पास एक workspace निर्देशिका है जिस पर आपका WORKSPACE पर्यावरण चर इंगित करता है, जिसमें workspace/edk2 में EDK2 की एक प्रति चेक आउट की गई है। समर्थित कंपाइलर MSVC, Clang, GCC और ICC हैं।
workspace/edk2/EfiGuardPkg में क्लोन करें।build -a X64 -t VS2019 -p EfiGuardPkg/EfiGuardPkg.dsc -b RELEASE चलाएं, VS2019 के लिए अपने टूलचेन को प्रतिस्थापित करें।यह workspace/Build/EfiGuard/RELEASE_VS2019/X64 में EfiGuardDxe.efi और Loader.efi उत्पन्न करेगा।
EfiDSEFix को बनाने के लिए Visual Studio की आवश्यकता होती है।
EfiGuard.sln खोलें और समाधान बनाएं।आउटपुट बाइनरी EfiDSEFix.exe Application/EfiDSEFix/bin में होगी।
Visual Studio समाधान में EfiGuardDxe.efi और Loader.efi के लिए प्रोजेक्ट भी शामिल हैं जिनका उपयोग VisualUefi के साथ किया जा सकता है, लेकिन ये प्रोजेक्ट डिफ़ॉल्ट रूप से नहीं बनाए जाते हैं क्योंकि वे अतिरिक्त कोड के बिना लिंक नहीं होंगे, और बिल्ड आउटपुट EDK2 द्वारा उत्पादित की तुलना में निम्न (बड़ा) होगा। Loader.efi VisualUefi में UefiBootManagerLib की कमी के कारण बिल्कुल भी लिंक नहीं होगा। इस प्रकार ये प्रोजेक्ट फ़ाइलें केवल विकास सहायता के रूप में अभिप्रेत हैं और EFI फ़ाइलों को अभी भी EDK2 के साथ संकलित किया जाना चाहिए। इस उद्देश्य के लिए VisualUefi सेट अप करने के लिए, रिपॉजिटरी को workspace/VisualUefi में क्लोन करें और EfiGuard.sln खोलें।
जबकि EfiGuard एक UEFI बूटकिट है, यह एक के रूप में शुरू नहीं हुआ था। EfiGuard मूल रूप से NT पर चलने वाला एक ऑन-डिस्क पैचर था (UPGDSED के समान), जिसका उद्देश्य PDB प्रतीकों और संस्करण-विशिष्ट हस्ताक्षरों के उपयोग के विपरीत, एक डिसेसम्बलर-आधारित दृष्टिकोण की व्यवहार्यता का परीक्षण करना था। PatchNtoskrnl.c अभी भी इस मूल डिज़ाइन जैसा दिखता है। केवल इस दृष्टिकोण के सफल साबित होने के बाद, एक वर्ष से अधिक के Windows अपडेट में कोड में कोई संशोधन की आवश्यकता नहीं थी, तब UEFI क्षमताओं और उपयोग में आसानी को और बेहतर बनाने के तरीके के रूप में चित्र में आया।
बूटकिट दृष्टिकोण द्वारा प्रदान किए गए कुछ लाभों में शामिल हैं:
bcdedit का उपयोग करके बूट कॉन्फ़िगरेशन स्टोर को संशोधित करने की आवश्यकता नहीं।ImgpValidateImageHash को पैच करने की आवश्यकता नहीं (हालांकि यह अभी भी वैकल्पिक रूप से किया जाता है)।db स्टोर में जोड़ने में सक्षम हों।बूटकिट के रूप में EfiGuard का प्रारंभिक अवतार dude719 के UEFI-Bootkit को Windows 10 के हाल के संस्करणों के साथ काम करने का एक प्रयास था, क्योंकि यह पुराना हो गया था और नवीनतम संस्करणों पर काम नहीं करता (UPGDSED की तरह, जो अक्सर संस्करण-संवेदनशील पैटर्न स्कैन के कारण होता है)। जबकि मैंने अंततः इसे काम करवा लिया, मैं परिणाम से असंतुष्ट था, मुख्यतः OslArchTransferToKernel को हुक करने के विकल्प के कारण, जो जैसा कि ऊपर बताया गया है, संरक्षित मोड में और ExitBootServices कॉल होने के बाद निष्पादित होता है। इसके अलावा, मैं केवल Windows 10 के कुछ संस्करणों को पैच करने में सक्षम होने से संतुष्ट नहीं था; मैं चाहता था कि बूटकिट आज तक जारी Windows x64 के हर EFI-संगत संस्करण पर काम करे। इस कारण से, मैंने निम्नलिखित उद्देश्यों के साथ बूटकिट को खरोंच से फिर से लिखा:
अंतिम EfiGuard बूट प्रवाह का एक बड़ा चित्र अवलोकन ऊपर दिए गए आरेख में दिखाया गया है। व्यक्तिगत घटक-विशिष्ट हुक और पैच के लिए, स्रोत फ़ाइलों में EfiGuardPkg/PatchXxx.c देखें। ड्राइवर आरंभीकरण/अनलोडिंग और EFI बूट और रनटाइम सेवाओं के हुक के लिए, EfiGuardDxe.c देखें।
EfiGuard GPLv3 के तहत लाइसेंस प्राप्त है। EfiGuardDxe/Zydis उपमॉड्यूल में फ़ाइलें MIT लाइसेंस के तहत लाइसेंस प्राप्त हैं।
| पहले जैसा ही |
| लोडर | कहीं भी | आवश्यक नहीं | ✔️ | Windows |