
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.
Interessanterweise ist es, wenn BugChecker auf einem System mit mehr als einer Grafikkarte installiert ist, möglich, die Anzeigetreiber nur einer Grafikkarte zu deaktivieren, und zwar der Karte, die an den Bildschirm angeschlossen ist, der die BugChecker-Benutzeroberfläche anzeigt. Die zweite Karte (als Hauptanzeige eingestellt) behält alle ihre 2D- und 3D-Beschleunigungsfunktionen, einschließlich OpenGL- und DirectX-Unterstützung (HINWEIS: getestet auf VMware mit Windows 11 und einem DisplayLink-Display).
Klicken Sie dann auf 'Start Driver', dann auf 'Auto Detect' und schließlich auf 'Save'. 'Auto Detect' sollte Breite, Höhe, physische Adresse und Stride des Framebuffers automatisch ermitteln können. Sie können diese Einstellungen jedoch manuell festlegen (vergessen Sie nicht, nach Abschluss auf 'Save' zu klicken). Wenn 'Stride' 0 ist, wird es beim Starten des Treibers automatisch als 'Width' * 4 berechnet. Die 'Adresse' (d. h. die physische Adresse des Framebuffers) kann im Windows-Geräte-Manager ermittelt werden, indem Sie auf 'Eigenschaften' des Anzeigegeräts unter dem Tab 'Ressourcen' klicken.
Klicken Sie dann im Abschnitt 'KDCOM Hook Method' auf 'Callback', dann auf 'Copy/Replace Kdcom' und schließlich können Sie das System neu starten.
Dieser Einrichtungsvorgang muss nur einmal durchgeführt werden, und die Anzeigetreiber können bei Bedarf wieder aktiviert werden. Wenn Sie BugChecker verwenden, müssen die Anzeigetreiber jedoch wieder deaktiviert werden, falls Ihre Konfiguration dies erfordert.
Die vm_screen-Einstellung in BugChecker.dat ermöglicht es, die BugChecker-Debugger-Benutzeroberfläche in VirtualBox zu öffnen, ohne vorher eine Bildschirmauflösung im Symbol Loader anzugeben und ohne die Anzeigetreiber zu deaktivieren.
Die Idee ist, direkt auf die I/O-Ports und den Command Buffer des virtuellen Anzeigegeräts zu schreiben, um die aktuelle Bildschirmauflösung zu erhalten und den Hypervisor über Aktualisierungen im Framebuffer zu benachrichtigen.
Diese Lösung wurde vom X.org xf86-video-vmware Treiber inspiriert.
Diese Lösung funktioniert nur für VirtualBox-VMs und durch manuelle Bearbeitung der Datei BugChecker.dat:

Dies ist eine experimentelle Funktion. In Zukunft wird diese Einstellung automatisch vom Symbol Loader hinzugefügt.
Die Befehlsnamen und -syntax wurden so gewählt, dass sie denen des ursprünglichen SoftICE für NT so nahe wie möglich kommen:
Hinweis: Das WDK sollte an seinem Standardort installiert werden, d.h. X:\WinDDK, wobei X das Laufwerk ist, auf dem die BugChecker-Quellen gespeichert sind.
Eine Schritt-für-Schritt-Anleitung zum Bauen des Kernel-Treibers ist hier verfügbar.