BugChecker
परिचय
BugChecker SoftICE जैसा कर्नेल और उपयोगकर्ता डिबगर है जो Windows 11 (और Windows XP भी: यह Windows XP से 11 तक के संस्करणों, x86 और x64 दोनों का समर्थन करता है) के लिए है। BugChecker को WinDbg और KD की तरह डीबग किए जा रहे सिस्टम से जुड़ने के लिए दूसरी मशीन की आवश्यकता नहीं होती है। BugChecker का यह संस्करण (20 साल पहले विकसित मूल संस्करण के विपरीत) NTOSKRNL में आंतरिक और अप्रलेखित KD API का लाभ उठाता है। KD API WinDbg/KD को कॉल करने की अनुमति देता है जैसे रीड/राइट वर्चुअल मेमोरी, रीड/राइट रजिस्टर, किसी पते पर ब्रेकपॉइंट लगाना आदि।
इसके विपरीत, मूल BugChecker, SoftICE की तरह, कई कर्नेल API (निर्यातित और निजी दोनों) को हुक करके, APIC का नियंत्रण लेकर, IPIs भेजकर, आदि द्वारा सिस्टम को "अपने कब्जे में" लेता था। यह दृष्टिकोण जटिलता को तेजी से बढ़ाता है (और सिस्टम स्थिरता को कम करता है), क्योंकि कार्यान्वयन को Windows के सभी समर्थित संस्करणों और उप-संस्करणों (फ़ंक्शन हस्ताक्षर स्तर पर) के साथ-साथ सभी संभावित समर्थित हार्डवेयर कॉन्फ़िगरेशन के साथ संगत होना चाहिए। इसके अलावा, 20 साल बाद, PatchGuard इस समाधान को असंभव बना देता है।
इसके विपरीत, BugChecker का यह संस्करण, कर्नेल में KdSendPacket और KdReceivePacket पर कॉल को इंटरसेप्ट करके, डीबग की जा रही मशीन को एक बाहरी कर्नेल डिबगर चलाने वाली दूसरी प्रणाली के रूप में प्रस्तुत करता है, लेकिन वास्तव में, सब कुछ उसी मशीन पर होता है। आमतौर पर यह KDCOM.DLL को बदलकर (जो Windows में KD API के लिए सीरियल केबल संचार लागू करने वाला मॉड्यूल है) प्राप्त किया जाता है और सिस्टम को कर्नेल डिबगिंग मोड में प्रारंभ करके प्राप्त किया जाता है। यह दृष्टिकोण (VirtualKD से प्रेरित) जटिलता को कम करता है और स्थिरता और संगतता (और पोर्टेबिलिटी, उदाहरण के लिए, ARM तक - और मॉड्यूलरिटी, क्योंकि निचले स्तर की डिबगर क्षमताएं KdXxxPacket के पीछे लागू होती हैं और एक कस्टम कार्यान्वयन से बदली जा सकती हैं) को बढ़ाता है। इसके अलावा, बूट समय पर एक कर्नेल डिबगर (हालांकि "नकली") की उपस्थिति Windows को PatchGuard को अक्षम करने का कारण बनती है।
फिलहाल, BugChecker को इनपुट के लिए PS/2 कीबोर्ड और अपना आउटपुट लिखने के लिए एक लीनियर फ्रेमबफर की आवश्यकता होती है। कृपया ध्यान दें कि कई आधुनिक लैपटॉप का अंतर्निहित कीबोर्ड अभी भी PS/2 है।
विशेषताएं
- Windows XP से Windows 11, x86 और x64, और SMP कर्नेल के लिए समर्थन। x64 पर WOW64 प्रक्रियाओं के लिए समर्थन।
- QuickJSPP का एकीकरण, जो QuickJS का MSVC++ पर एक पोर्ट है। QuickJS को कॉल करने से पहले, BugChecker FPU स्थिति (x86 पर) को सहेजता है और 128KB के विस्तारित स्टैक पर स्विच करता है।
- कमांड JS एक्सप्रेशन स्वीकार करते हैं। उदाहरण के लिए, "U rip+rax*4" और "U MyJsFn(rax+2)" मान्य कमांड हैं। कस्टम फ़ंक्शन स्क्रिप्ट विंडो में परिभाषित किए जा सकते हैं। CPU रजिस्टर BugChecker द्वारा स्वचालित रूप से ग्लोबल स्कोप वेरिएबल के रूप में घोषित किए जाते हैं।
- PDB प्रतीक फ़ाइलों के लिए समर्थन। PDB फ़ाइलों को मैन्युअल रूप से निर्दिष्ट किया जा सकता है या सिंबल लोडर उन्हें सिंबल सर्वर से डाउनलोड कर सकता है।
- JavaScript कोड निम्नलिखित अतुल्यकालिक फ़ंक्शन कॉल कर सकता है: WriteReg, ReadMem, WriteMem।
- ब्रेकपॉइंट में JS स्थिति हो सकती है: यदि स्थिति 0 का मूल्यांकन करती है, तो कोई "ब्रेकिन" नहीं होता है। यह "लॉगपॉइंट" और ऐसे ब्रेकपॉइंट सेट करने की अनुमति देता है जो निष्पादन के प्रवाह को बदल सकते हैं।
- लॉग विंडो कर्नेल डिबगर को भेजे गए संदेश दिखाती है (उदाहरण के लिए DbgPrint संदेश)।
- सिंटैक्स हाइलाइटिंग के साथ JavaScript विंडो।
- टैब कुंजी, कुछ अंक दिए जाने पर, स्क्रीन पर सभी हेक्स संख्याओं के माध्यम से चक्र करने की अनुमति देती है, या कुछ अक्षर दिए जाने पर, उन अक्षरों वाले सभी प्रतीकों के माध्यम से चक्र करने की अनुमति देती है।
- EASTL और C++20 कोरूटीन नए कमांड बनाना आसान बनाते हैं। अपने पुल अनुरोध भेजने के लिए स्वतंत्र महसूस करें!
वीडियो (यूट्यूब)
Windows 11 22H2 पर, VirtualBox 7.0.4 के अंदर BugChecker का प्रदर्शन। एक JavaScript ब्रेकपॉइंट स्थिति लिखी गई है जो उपयोगकर्ता मोड थ्रेड में निष्पादन के प्रवाह को बदल देती है।

BugChecker एक बहुत ही सीमित वातावरण में चल रहा है: एक Raspberry Pi 4 (4GB RAM), Windows XP (512MB RAM) पर QEMU के माध्यम से। एक ब्रेकपॉइंट का उपयोग उपयोगकर्ता मोड से कर्नेल तक सभी SYSENTER कॉल को लॉग करने के लिए किया जाता है। सेवा सूचकांक एक जावास्क्रिप्ट सरणी में संग्रहीत किया जाता है।

BugChecker को सीधे बेयर मेटल पर, HP Pavilion Dv2000 पर चलाना, जो PS/2 कीबोर्ड वाला एक पुराना पीसी है। ओएस Windows 7 Home 32bit है।

स्थापना निर्देश
परिचय
सुनिश्चित करें कि BugChecker को स्थापित और उपयोग करते समय Secure Boot अक्षम है। आमतौर पर आप इसे बाद में पुनः सक्षम कर सकते हैं। यदि आप VMware या VirtualBox का उपयोग कर रहे हैं, तो Secure Boot को वर्चुअल मशीन सेटिंग्स में अक्षम किया जा सकता है।
यदि Windows 8, 10 या 11 का उपयोग कर रहे हैं, तो लीगेसी बूट मेनू को सक्षम करने पर भी विचार करें, कमांड का उपयोग करके: bcdedit /set "{current}" bootmenupolicy legacy। यह बूट के दौरान एक सहज अनुभव की अनुमति देता है, BugChecker बूट विकल्प का चयन करने और फिर उसी समय ड्राइवर सिग्नेचर एनफोर्समेंट को अक्षम करने की अनुमति देता है।
निर्देश
पहला कदम सिंबल लोडर प्रारंभ करना है:

यदि आवश्यक हो, तो "Disable Display Drvs" बटन पर क्लिक करके डिस्प्ले ड्राइवरों को अक्षम करें। वही काम Windows डिवाइस मैनेजर में भी किया जा सकता है। डिस्प्ले ड्राइवरों को अक्षम करने के बाद, वे सिस्टम रीबूट के बाद भी अक्षम रहते हैं। उन्हें बाद में किसी भी समय फिर से सक्षम किया जा सकता है जब BugChecker का उपयोग नहीं कर रहे हों।
यहाँ मुद्दा यह है कि BugChecker को अपना इंटरफ़ेस खींचने के लिए 32 बिट्स-प्रति-पिक्सेल प्रारूप के साथ एक लीनियर फ्रेमबफर की आवश्यकता होती है। डिस्प्ले ड्राइवरों को अक्षम करने पर, Windows अपने UI को खींचने के लिए हार्डवेयर त्वरण को खारिज कर देता है और VGA संगतता मोड पर वापस आ जाता है। यदि बेयर मेटल या VMware पर चल रहे हैं, तो आपको डिस्प्ले ड्राइवरों को अक्षम करना चाहिए। यदि VirtualBox पर चल रहे हैं, तो आपको डिस्प्ले ड्राइवरों को अक्षम करना चाहिए या BugChecker.dat में vm_screen सेटिंग सेट करनी चाहिए, जैसा कि नीचे वर्णित है। यदि QEMU पर चल रहे हैं, तो आपको डिस्प्ले ड्राइवरों को अक्षम करने की आवश्यकता नहीं है, लेकिन "-vga std" डिस्प्ले डिवाइस निर्दिष्ट करना सुनिश्चित करें।
ध्यान दें कि VGA संगतता मोड अधिकतम स्क्रीन रिज़ॉल्यूशन को सीमित कर सकता है। VMware 1152x864 के अधिकतम रिज़ॉल्यूशन तक सीमित है। "-vga std" डिस्प्ले डिवाइस वाला QEMU इस सीमा से ग्रस्त नहीं है।
दिलचस्प बात यह है कि यदि BugChecker एक से अधिक ग्राफिक्स कार्ड वाले सिस्टम पर स्थापित है, तो केवल एक ग्राफिक्स कार्ड के डिस्प्ले ड्राइवरों को अक्षम करना संभव है, जो वह कार्ड होगा जो उस स्क्रीन से जुड़ा होगा जो BugChecker UI दिखाएगा। दूसरा कार्ड (मुख्य डिस्प्ले के रूप में सेट) अपनी सभी 2D और 3D त्वरण सुविधाओं को बरकरार रखेगा, जिसमें OpenGL और DirectX समर्थन शामिल है (नोट: VMware पर, Windows 11 और DisplayLink डिस्प्ले के साथ परीक्षण किया गया)।
फिर "Start Driver" पर क्लिक करें, फिर "Auto Detect" पर और अंत में "Save" पर क्लिक करें। "Auto Detect" को फ्रेमबफर की चौड़ाई, ऊंचाई, भौतिक पता और स्ट्राइड स्वचालित रूप से निर्धारित करने में सक्षम होना चाहिए। हालांकि, आप इन सेटिंग्स को मैन्युअल रूप से निर्दिष्ट कर सकते हैं (समाप्त होने पर "Save" पर क्लिक करना न भूलें)। यदि "Stride" 0 है, तो ड्राइवर शुरू करते समय इसकी गणना "Width" * 4 के रूप में स्वचालित रूप से की जाती है। "Address" (अर्थात फ्रेमबफर का भौतिक पता) Windows डिवाइस मैनेजर में, डिस्प्ले डिवाइस के "Properties" पर क्लिक करके, "Resources" टैब के अंतर्गत प्राप्त किया जा सकता है।
फिर "KDCOM Hook Method" अनुभाग में "Callback" पर क्लिक करें, फिर "Copy/Replace Kdcom" पर क्लिक करें और अंत में आप सिस्टम को रीबूट कर सकते हैं।
यह सेटअप प्रक्रिया केवल एक बार करनी होती है और यदि आवश्यक हो तो डिस्प्ले ड्राइवरों को पुनः सक्षम किया जा सकता है। हालांकि, BugChecker का उपयोग करते समय, यदि आपके कॉन्फ़िगरेशन के लिए आवश्यक हो, तो डिस्प्ले ड्राइवरों को फिर से अक्षम किया जाना चाहिए।
VirtualBox के लिए vm_screen सेटिंग (प्रायोगिक)
BugChecker.dat में vm_screen सेटिंग आपको सिंबल लोडर में पहले से स्क्रीन रिज़ॉल्यूशन निर्दिष्ट किए बिना और डिस्प्ले ड्राइवरों को अक्षम किए बिना VirtualBox में BugChecker डिबगर UI खोलने की अनुमति देती है।
विचार वर्चुअल डिस्प्ले डिवाइस के I/O पोर्ट और कमांड बफर पर सीधे लिखना है ताकि वर्तमान स्क्रीन रिज़ॉल्यूशन प्राप्त किया जा सके और फ्रेमबफर में किसी भी अद्यतन के हाइपरवाइजर को सूचित किया जा सके।
यह समाधान X.org xf86-video-vmware ड्राइवर से प्रेरित था।
यह समाधान केवल VirtualBox VMs के लिए काम करता है और BugChecker.dat फ़ाइल को मैन्युअल रूप से संपादित करके:

- सिंबल लोडर में, फ्रेमबफर की चौड़ाई और ऊंचाई मैन्युअल रूप से अधिकतम संभव रिज़ॉल्यूशन (अर्थात आपके कंप्यूटर स्क्रीन के आयाम) पर सेट करें। स्ट्राइड को 0 पर सेट करें।
- BugChecker.dat फ़ाइल सिंबल लोडर द्वारा "C:\Windows\BugChecker" में बनाई जाती है।
- vm_screen सेटिंग को "settings->framebuffer" के अंतर्गत जोड़ा जाना चाहिए।
- इस फ़ाइल में सेटिंग्स का पदानुक्रम टैबुलेशन वर्णों (रिक्त स्थान नहीं) द्वारा निर्धारित किया जाता है।
- सेटिंग का प्रारूप Command_Buffer_Start_Address (कॉमा) Command_Buffer_End_Address (कॉमा) I/O_Port_Base है
- महत्वपूर्ण: VM सेटिंग में, डिस्प्ले के अंतर्गत, ग्राफिक्स कंट्रोलर के रूप में "VBoxSVGA" चुनें और "Enable 3D Acceleration" को अनचेक करें।
यह एक प्रायोगिक सुविधा है। भविष्य में, यह सेटिंग सिंबल लोडर द्वारा स्वचालित रूप से जोड़ी जाएगी।
कार्यान्वित कमांड
कमांड का नाम और सिंटैक्स मूल SoftICE for NT के जितना संभव हो उतना करीब चुना गया है:
- ? javascript-expression: एक जावास्क्रिप्ट एक्सप्रेशन का मूल्यांकन करें।
- ADDR eprocess: प्रक्रिया संदर्भ पर स्विच करें (नियंत्रण OS पर वापस करता है)।
- BC list|*: एक या अधिक ब्रेकपॉइंट साफ़ करें।
- BD list|*: एक या अधिक ब्रेकपॉइंट अक्षम करें।
- BE list|*: एक या अधिक ब्रेकपॉइंट सक्षम करें।
- BL (कोई पैरामीटर नहीं): सभी ब्रेकपॉइंट सूचीबद्ध करें।
- BPX address [-t|-p|-kt thread|-kp process] [WHEN js-expression]: निष्पादन पर ब्रेकपॉइंट सेट करें।
- CLS (कोई पैरामीटर नहीं): लॉग विंडो साफ़ करें।
- COLOR [normal bold reverse help line]|[reset]: स्क्रीन रंग प्रदर्शित करें, सेट करें या रीसेट करें।
- DB/DW/DD/DQ [address] [-l len-in-bytes]: मेमोरी को 8/16/32/64-बिट मानों के रूप में प्रदर्शित करें।
- EB/EW/ED/EQ address -v space-separated-values: मेमोरी को 8/16/32/64-बिट मानों के रूप में संपादित करें।
- KL EN|IT: कीबोर्ड लेआउट सेट करें।
- LINES [rows-num]: वर्तमान डिस्प्ले पंक्तियाँ प्रदर्शित या सेट करें।
- MOD [-u|-s] [search-string]: मॉड्यूल जानकारी प्रदर्शित करें।
- P [RET]: एक प्रोग्राम स्टेप निष्पादित करें।
- PAGEIN address: मेमोरी के एक पेज को पेज इन करने के लिए बाध्य करें (नियंत्रण OS पर वापस करता है)।
- PROC [search-string]: प्रक्रिया जानकारी प्रदर्शित करें।
- R register-name -v value: एक रजिस्टर मान बदलें।
- STACK [stack-ptr]: रिटर्न पतों की खोज करते हुए स्टैक को स्कैन करें।
- T (कोई पैरामीटर नहीं): एक निर्देश ट्रेस करें।
- THREAD [-kt thread|-kp process]: थ्रेड जानकारी प्रदर्शित करें।
- U address|DEST: निर्देशों को डिसअसेंबल करें।
- VER (कोई पैरामीटर नहीं): संस्करण जानकारी प्रदर्शित करें।
- WD [window-size]: डिसअसेंबलर विंडो टॉगल करें या उसका आकार सेट करें।
- WIDTH [columns-num]: वर्तमान डिस्प्ले कॉलम प्रदर्शित या सेट करें।
- WR (कोई पैरामीटर नहीं): रजिस्टर विंडो टॉगल करें।
- WS [window-size]: स्क्रिप्ट विंडो टॉगल करें या उसका आकार सेट करें।
- X (कोई पैरामीटर नहीं): BugChecker स्क्रीन से बाहर निकलें।
बिल्ड निर्देश
पूर्वापेक्षाएँ
- Visual Studio 2019
- Windows Driver Kit 7.1.0
नोट: WDK को उसकी डिफ़ॉल्ट स्थान पर स्थापित किया जाना चाहिए, अर्थात X:\WinDDK, जहाँ X वह ड्राइव है जहाँ BugChecker स्रोत सहेजे गए हैं।
कर्नेल ड्राइवर बनाने के लिए एक चरण-दर-चरण मार्गदर्शिका यहाँ उपलब्ध है।
Visual Studio प्रोजेक्ट विवरण
- BugChecker: यह BugChecker कर्नेल ड्राइवर है, जहाँ डिबगर का संपूर्ण भाग लागू किया गया है। "Release|x86" और "Release|x64" आउटपुट फ़ाइलें अंतिम पैकेज में शामिल हैं। आरंभीकरण के दौरान, ड्राइवर अपनी कॉन्फ़िगरेशन फ़ाइल को "\SystemRoot\BugChecker\BugChecker.dat" पर लोड करता है (सभी प्रतीक फ़ाइलें भी इस निर्देशिका में संग्रहीत होती हैं) और फिर कर्नेल स्पेस में "KDCOM.dll" का पता लगाने का प्रयास करता है। यदि मिल जाता है, तो यह अपने "KdSetBugCheckerCallbacks" निर्यातित फ़ंक्शन को कॉल करने का प्रयास करता है, इस प्रकार KdSendPacket और KdReceivePacket को हुक करता है।
- SymLoader: यह सिंबल लोडर है। केवल "Release|x86" आउटपुट फ़ाइल अंतिम पैकेज में शामिल है। सिंबल लोडर का उपयोग BugChecker कॉन्फ़िगरेशन को बदलने (कॉन्फ़िगरेशन "\SystemRoot\BugChecker\BugChecker.dat" में लिखा जाता है), PDB फ़ाइलों को डाउनलोड करने और कस्टम KDCOM.dll मॉड्यूल को स्थापित करने के लिए किया जाता है।
- KDCOM: यह कस्टम KDCOM.dll मॉड्यूल है जिसे NTOSKRNL सिस्टम स्टार्टअप पर लोड करता है। यह "KdSetBugCheckerCallbacks" फ़ंक्शन निर्यात करता है जिसे ड्राइवर KdSendPacket और KdReceivePacket को हुक करने के लिए कॉल करता है।
- pdb: यह Ghidra का "pdb" प्रोजेक्ट है। मूल संस्करण PDB फ़ाइल की सामग्री को xml प्रारूप में मानक आउटपुट पर आउटपुट करता है। इसके बजाय BCS फ़ाइल उत्पन्न करने के लिए कोड को संशोधित किया गया था।
- NativeUtil: चूँकि सिंबल लोडर Windows x64 में एक WOW64 एप्लिकेशन है, उन API के कॉल जो आर्किटेक्चर नेटिव इमेज से किए जाने चाहिए, उन्हें यहाँ ले जाया गया (उदाहरण के लिए Device and Driver Installation API के कॉल)।
- HttpToHttpsProxy: यह एक ASP.NET Core एप्लिकेशन है जिसका कार्य Windows XP में चलने पर सिंबल लोडर के लिए इंटरनेट प्रॉक्सी के रूप में कार्य करना है। चूंकि XP में पुराना TLS समर्थन है, सिंबल लोडर एक मनमाना सिंबल सर्वर से फ़ाइलें डाउनलोड नहीं कर सकता है। उसी नेटवर्क पर IIS में इस एप्लिकेशन को तैनात करने के बाद, सिंबल लोडर में सर्वर URL से पहले "http://<आपका_IIS_सर्वर_IP>/HttpToHttpsProxy/" जोड़कर Windows XP में सिंबल सर्वर से फ़ाइलें डाउनलोड करना संभव है।
क्रेडिट
- VirtualKD: BugChecker का पहला POC VirtualKD को संशोधित करके बनाया गया था।
- BazisLib: सिंबल लोडर में "Copy/Replace Kdcom + Add Boot Entry" बटन के पीछे का कोड VirtualKD से है और BazisLib का उपयोग करता है।
- EASTL: यहाँ MSVC++ STL का उपयोग करने का कोई तरीका नहीं है। EASTL एक उत्कृष्ट विकल्प है।
- Ghidra: BugChecker में "pdb" प्रोजेक्ट Ghidra से है। इसे BCS फ़ाइलें उत्पन्न करने के लिए संशोधित किया गया था।
- Zydis: BugChecker में डिसअसेंबलर विंडो के लिए।
- QuickJSPP, जो QuickJS का MSVC++ पर एक पोर्ट है: कर्नेल ड्राइवर में एकीकृत जावास्क्रिप्ट इंजन के लिए।
- ReactOS: Windows KD आंतरिक प्रकार परिभाषाओं के लिए।
- SerenityOS: BugChecker मेमोरी आवंटक द्वारा उपयोग किए जाने वाले निम्न-स्तरीय बिटमैप हेरफेर फ़ंक्शन के लिए। चूंकि मैंने BugChecker को Andreas का एक वीडियो देखने के बाद शुरू किया था (C/C++ और किसी भी प्रकार की निम्न-स्तरीय प्रोग्रामिंग से 10 वर्षों की परहेज़ के बाद), मैं BugChecker में SerenityOS का एक छोटा सा टुकड़ा शामिल करना चाहता था।