
SoftICE-ähnlicher Kernel-Debugger für Windows 11
BugChecker ist ein SoftICE-ähnlicher Kernel- und User-Debugger für Windows 11 (sowie Windows XP: es wird Windows-Versionen von XP bis 11 unterstützt, sowohl x86 als auch x64). BugChecker benötigt keinen zweiten Rechner, der mit dem zu debuggenden System verbunden ist, wie dies bei WinDbg und KD der Fall ist. Diese Version von BugChecker (anders als die vor 20 Jahren entwickelte Originalversion) nutzt die interne und undokumentierte KD-API in NTOSKRNL. Die KD-API ermöglicht WinDbg/KD Aufrufe wie Lesen/Schreiben von virtuellem Speicher, Lesen/Schreiben von Registern, Setzen eines Breakpoints an einer Adresse usw.
Im Gegensatz dazu pflegte das ursprüngliche BugChecker, wie auch SoftICE, das System zu 'übernehmen', indem es mehrere Kernel-APIs (sowohl exportierte als auch private) hookte, die Kontrolle über den APIC übernahm, IPIs sendete usw. Dieser Ansatz erhöht die Komplexität exponentiell (und verringert die Systemstabilität), da die Implementierung mit allen unterstützten Versionen und Unterversionen von Windows (auf Funktionsebene) sowie allen möglichen unterstützten Hardwarekonfigurationen kompatibel sein muss. Darüber hinaus macht PatchGuard diese Lösung 20 Jahre später unmöglich.
Im Gegensatz dazu präsentiert sich diese Version von BugChecker, indem sie Aufrufe von KdSendPacket und KdReceivePacket im Kernel abfängt, der zu debuggenden Maschine als zweites System, das einen externen Kernel-Debugger ausführt, aber in Wirklichkeit geschieht alles auf demselben Rechner. Typischerweise wird dies erreicht, indem KDCOM.DLL (das Modul, das die serielle Kabelkommunikation für die KD-API in Windows implementiert) ersetzt und das System im Kernel-Debugging-Modus gestartet wird. Dieser Ansatz (inspiriert von VirtualKD) reduziert die Komplexität und erhöht Stabilität und Kompatibilität (und Portabilität, z. B. zu ARM – und Modularität, da die Fähigkeiten des unteren Debugger-Levels hinter KdXxxPacket implementiert und durch eine benutzerdefinierte Implementierung ersetzt werden können). Darüber hinaus sorgt das Vorhandensein eines Kernel-Debuggers beim Start (wenn auch 'gefälscht') dafür, dass Windows PatchGuard deaktiviert.
Derzeit benötigt BugChecker eine PS/2-Tastatur für die Eingabe und einen linearen Framebuffer, um seine Ausgabe zu schreiben. Bitte beachten Sie, dass die eingebaute Tastatur vieler moderner Laptops immer noch PS/2 ist.
Demonstration von BugChecker unter Windows 11 22H2, in VirtualBox 7.0.4. Es wird eine JavaScript-Haltepunktsbedingung geschrieben, die den Ausführungsfluss in einem Benutzermodus-Thread ändert.
BugChecker läuft in einer sehr eingeschränkten Umgebung: einem Raspberry Pi 4 (4 GB RAM) über QEMU unter Windows XP (512 MB RAM). Ein Haltepunkt wird verwendet, um alle SYSENTER-Aufrufe vom Benutzermodus zum Kernel zu protokollieren. Der Service-Index wird in einem JavaScript-Array gespeichert.
BugChecker läuft direkt auf Bare Metal auf einem HP Pavilion Dv2000, einem alten PC mit PS/2-Tastatur. Das Betriebssystem ist Windows 7 Home 32-Bit.
Stellen Sie sicher, dass Secure Boot deaktiviert ist, wenn Sie BugChecker installieren und verwenden. In der Regel können Sie es später wieder aktivieren. Wenn Sie VMware oder VirtualBox verwenden, kann Secure Boot in den Einstellungen der virtuellen Maschine deaktiviert werden.
Erwägen Sie auch, das Legacy-Boot-Menü zu aktivieren, wenn Sie Windows 8, 10 oder 11 verwenden, mit dem Befehl: bcdedit /set "{current}" bootmenupolicy legacy. Es ermöglicht ein reibungsloseres Erlebnis beim Booten, da Sie die BugChecker-Boot-Option auswählen und gleichzeitig die Treibersignaturerzwingung deaktivieren können.
Der erste Schritt ist, den Symbol Loader zu starten:

Falls erforderlich, deaktivieren Sie die Anzeigetreiber, indem Sie auf die Schaltfläche 'Disable Display Drvs' klicken. Dasselbe kann im Windows-Geräte-Manager erreicht werden. Nachdem die Anzeigetreiber deaktiviert wurden, bleiben sie auch nach einem Systemneustart deaktiviert. Sie können später jederzeit wieder aktiviert werden, wenn BugChecker nicht verwendet wird.
Der Punkt hier ist, dass BugChecker einen linearen Framebuffer mit einem Format von 32 Bit pro Pixel benötigt, um seine Oberfläche zu zeichnen. Wenn die Anzeigetreiber deaktiviert werden, verwirft Windows die Hardwarebeschleunigung zum Zeichnen seiner Benutzeroberfläche und fällt auf den VGA-Kompatibilitätsmodus zurück. Wenn Sie auf Bare Metal oder VMware laufen, sollten Sie die Anzeigetreiber deaktivieren. Wenn Sie auf VirtualBox laufen, sollten Sie die Anzeigetreiber deaktivieren oder die vm_screen-Einstellung in BugChecker.dat setzen, wie unten beschrieben. Wenn Sie auf QEMU laufen, müssen Sie die Anzeigetreiber nicht deaktivieren, aber stellen Sie sicher, dass Sie das Anzeigegerät '-vga std' angeben.
Beachten Sie, dass der VGA-Kompatibilitätsmodus die maximale Bildschirmauflösung einschränken kann. VMware ist auf eine maximale Auflösung von 1152x864 beschränkt. QEMU mit dem Anzeigegerät '-vga std' leidet nicht unter dieser Einschränkung.