
Débogueur noyau de type SoftICE pour Windows 11
BugChecker est un débogueur noyau et utilisateur de type SoftICE pour Windows 11 (et Windows XP également : il prend en charge les versions de Windows de XP à 11, en x86 et x64). BugChecker ne nécessite pas qu'une deuxième machine soit connectée au système en cours de débogage, contrairement à WinDbg et KD. Cette version de BugChecker (contrairement à la version originale développée il y a 20 ans) exploite l'API KD interne et non documentée de NTOSKRNL. L'API KD permet à WinDbg/KD d'effectuer des appels comme la lecture/écriture de la mémoire virtuelle, la lecture/écriture des registres, le placement d'un point d'arrêt à une adresse, etc.
En revanche, l'original BugChecker, tout comme SoftICE, avait l'habitude de « prendre le contrôle » du système, en hookant plusieurs API du noyau (à la fois exportées et privées), en prenant le contrôle de l'APIC, en envoyant des IPI, etc. Cette approche augmente la complexité de manière exponentielle (et réduit la stabilité du système), car l'implémentation doit être compatible avec toutes les versions et sous-versions de Windows prises en charge (au niveau de la signature des fonctions) ainsi qu'avec toutes les configurations matérielles prises en charge. De plus, 20 ans plus tard, PatchGuard rend cette solution impossible.
En revanche, cette version de BugChecker, en interceptant les appels à KdSendPacket et KdReceivePacket dans le noyau, se présente à la machine en cours de débogage comme un deuxième système exécutant un débogueur noyau externe, mais, en réalité, tout se passe sur la même machine. Typiquement, cela est réalisé en remplaçant KDCOM.DLL (qui est le module qui implémente la communication série pour l'API KD dans Windows) et en démarrant le système en mode débogage noyau. Cette approche (inspirée de VirtualKD) réduit la complexité et augmente la stabilité, la compatibilité (et la portabilité, par exemple vers ARM - et la modularité, car les capacités de débogage de bas niveau sont implémentées derrière KdXxxPacket et pourraient être remplacées par une implémentation personnalisée). De plus, la présence d'un débogueur noyau au démarrage (bien que « factice ») désactive PatchGuard.
Pour le moment, BugChecker nécessite un clavier PS/2 pour la saisie et un framebuffer linéaire pour écrire sa sortie. Veuillez noter que le clavier intégré de nombreux ordinateurs portables modernes est encore PS/2.
Démonstration de BugChecker sur Windows 11 22H2, dans VirtualBox 7.0.4. Une condition de point d'arrêt JavaScript est écrite, modifiant le flux d'exécution dans un thread en mode utilisateur.
BugChecker fonctionnant dans un environnement très contraint : un Raspberry Pi 4 (4 Go de RAM), via QEMU sur Windows XP (512 Mo de RAM). Un point d'arrêt est utilisé pour journaliser tous les appels SYSENTER du mode utilisateur vers le noyau. L'index de service est stocké dans un tableau JavaScript.
Exécution de BugChecker directement sur du matériel nu, sur un HP Pavilion Dv2000, un ancien PC avec un clavier PS/2. Le système d'exploitation est Windows 7 Home 32 bits.
Assurez-vous que Secure Boot est désactivé lors de l'installation et de l'utilisation de BugChecker. Vous pouvez généralement le réactiver ultérieurement. Si vous utilisez VMware ou VirtualBox, Secure Boot peut être désactivé dans les paramètres de la machine virtuelle.
Envisagez également d'activer le menu de démarrage hérité, si vous utilisez Windows 8, 10 ou 11, en utilisant la commande : bcdedit /set "{current}" bootmenupolicy legacy. Cela permet une expérience plus fluide lors du démarrage, en permettant de sélectionner l'option de démarrage BugChecker et de désactiver l'application de la signature des pilotes en même temps.
La première étape consiste à démarrer le chargeur de symboles :

Si nécessaire, désactivez les pilotes d'affichage en cliquant sur le bouton « Disable Display Drvs ». La même opération peut être effectuée dans le Gestionnaire de périphériques Windows. Une fois les pilotes d'affichage désactivés, ils restent désactivés même après un redémarrage du système. Ils peuvent être réactivés à tout moment ultérieurement lorsque vous n'utilisez pas BugChecker.
Le point ici est que BugChecker a besoin d'un framebuffer linéaire avec un format de 32 bits par pixel pour dessiner son interface. Lors de la désactivation des pilotes d'affichage, Windows abandonne l'accélération matérielle pour dessiner son interface utilisateur et revient au mode de compatibilité VGA. Si vous exécutez sur du matériel nu ou VMware, vous devez désactiver les pilotes d'affichage. Si vous exécutez sur VirtualBox, vous devez désactiver les pilotes d'affichage ou définir le paramètre vm_screen dans BugChecker.dat, comme décrit ci-dessous. Si vous exécutez sur QEMU, vous n'avez pas besoin de désactiver les pilotes d'affichage mais assurez-vous de spécifier le périphérique d'affichage « -vga std ».