Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
BugChecker — Débogueur noyau de type SoftICE pour Windows 11 | Kitploit
Outils/GitHubGitHub/vitoplantamura/bugchecker
Analyse Dynamique (Sandboxing)Rétro-ingénierieDébogueursAnalyse de Binaires
GitHubvitoplantamura/bugchecker

BugChecker

Débogueur noyau de type SoftICE pour Windows 11

Voir le dépôt
1.1k144il y a 3 ansVérifié par Kitploit

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

BugChecker

Introduction

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.

Fonctionnalités

  • Prise en charge de Windows XP à Windows 11, x86 et x64, et des noyaux SMP. Prise en charge des processus WOW64 sur x64.
  • Intégration de QuickJSPP, qui est un portage de QuickJS vers MSVC++. Avant d'appeler QuickJS, BugChecker sauvegarde l'état FPU (sur x86) et bascule vers une pile étendue de 128 Ko.
  • Les commandes acceptent des expressions JS. Par exemple, « U rip+rax*4 » et « U MyJsFn(rax+2) » sont des commandes valides. Des fonctions personnalisées peuvent être définies dans la fenêtre de script. Les registres du CPU sont automatiquement déclarés comme variables de portée globale par BugChecker.
  • Prise en charge des fichiers de symboles PDB. Les fichiers PDB peuvent être spécifiés manuellement ou le chargeur de symboles peut les télécharger depuis un serveur de symboles.
  • Le code JavaScript peut appeler les fonctions asynchrones suivantes : WriteReg, ReadMem, WriteMem.
  • Les points d'arrêt peuvent avoir une condition JS : si la condition est évaluée à 0, aucun « breakin » ne se produit. Cela permet de définir des « Logpoints » et des points d'arrêt qui peuvent modifier le flux d'exécution.
  • La fenêtre de journal affiche les messages envoyés au débogueur noyau (par exemple les messages DbgPrint).
  • Fenêtre JavaScript avec coloration syntaxique.
  • La touche Tab permet, étant donné quelques chiffres, de parcourir tous les nombres hexadécimaux à l'écran ou, étant donné quelques caractères, de parcourir tous les symboles contenant ces caractères.
  • EASTL et les coroutines C++20 facilitent la création de nouvelles commandes. N'hésitez pas à envoyer vos pull requests !

Vidéos (YouTube)

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.

Regarder la vidéo

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.

Regarder la vidéo

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.

Regarder la vidéo

Instructions d'installation

Introduction

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.

Instructions

La première étape consiste à démarrer le chargeur de symboles :

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 ».

Notez que le mode de compatibilité VGA pourrait limiter la résolution maximale de l'écran. VMware est limité à une résolution maximale de 1152x864. QEMU avec le périphérique d'affichage « -vga std » ne souffre pas de cette limitation.

Fait intéressant, si BugChecker est installé sur un système avec plus d'une carte graphique, il est possible de désactiver les pilotes d'affichage d'une seule carte graphique, qui sera la carte connectée à l'écran affichant l'interface utilisateur de BugChecker. La deuxième carte (définie comme affichage principal) conservera toutes ses fonctionnalités d'accélération 2D et 3D, y compris la prise en charge d'OpenGL et DirectX (REMARQUE : testé sur VMware, avec Windows 11 et un écran DisplayLink).

Cliquez ensuite sur « Start Driver », puis sur « Auto Detect » et enfin sur « Save ». « Auto Detect » devrait être en mesure de déterminer automatiquement la largeur, la hauteur, l'adresse physique et le pas du framebuffer. Cependant, vous pouvez spécifier ces paramètres manuellement (n'oubliez pas de cliquer sur « Save » une fois terminé). Si « Stride » est 0, il est calculé comme « Width » * 4 automatiquement lors du démarrage du pilote. « Address » (c'est-à-dire l'adresse physique du framebuffer) peut être obtenue dans le Gestionnaire de périphériques Windows, en cliquant sur « Propriétés » du périphérique d'affichage, sous l'onglet « Ressources ».

Ensuite, cliquez sur « Callback » dans la section « KDCOM Hook Method », puis sur « Copy/Replace Kdcom » et enfin vous pouvez redémarrer le système.

Cette procédure de configuration ne doit être effectuée qu'une seule fois et les pilotes d'affichage peuvent être réactivés si nécessaire. Cependant, lors de l'utilisation de BugChecker, les pilotes d'affichage doivent être à nouveau désactivés si votre configuration l'exige.

Paramètre vm_screen pour VirtualBox (Expérimental)

Le paramètre vm_screen dans BugChecker.dat permet d'ouvrir l'interface utilisateur du débogueur BugChecker dans VirtualBox sans spécifier à l'avance une résolution d'écran dans le chargeur de symboles et sans désactiver les pilotes d'affichage.

L'idée est d'écrire directement sur les ports d'E/S et le tampon de commande du périphérique d'affichage virtuel pour obtenir la résolution d'écran actuelle et notifier l'hyperviseur de toute mise à jour du framebuffer.

Cette solution a été inspirée par le pilote X.org xf86-video-vmware.

Cette solution fonctionne uniquement pour les machines virtuelles VirtualBox et en éditant manuellement le fichier BugChecker.dat :

vm_screen

  • Dans le chargeur de symboles, définissez manuellement la largeur et la hauteur du framebuffer à la résolution maximale possible (c'est-à-dire les dimensions de votre écran d'ordinateur). Définissez le pas à 0.
  • Le fichier BugChecker.dat est créé par le chargeur de symboles dans « C:\Windows\BugChecker ».
  • Le paramètre vm_screen doit être ajouté sous « settings->framebuffer ».
  • La hiérarchie des paramètres dans ce fichier est déterminée par les caractères de tabulation (pas les espaces).
  • Le format du paramètre est Adresse_de_début_du_tampon_de_commande (virgule) Adresse_de_fin_du_tampon_de_commande (virgule) Base_du_port_d'E/S.
  • IMPORTANT : Dans les paramètres de la machine virtuelle, sous Affichage, sélectionnez « VBoxSVGA » comme contrôleur graphique et décochez « Activer l'accélération 3D ».

Il s'agit d'une fonctionnalité expérimentale. À l'avenir, ce paramètre sera automatiquement ajouté par le chargeur de symboles.

Commandes implémentées

Le nom de la commande et la syntaxe sont choisis pour être aussi proches que possible de ceux du SoftICE original pour NT :

  • ? expression-javascript : Évaluer une expression JavaScript.
  • ADDR eprocess : Basculer vers le contexte du processus (retourne le contrôle au système d'exploitation).
  • BC liste|* : Supprimer un ou plusieurs points d'arrêt.
  • BD liste|* : Désactiver un ou plusieurs points d'arrêt.
  • BE liste|* : Activer un ou plusieurs points d'arrêt.
  • BL (aucun paramètre) : Lister tous les points d'arrêt.
  • BPX adresse [-t|-p|-kt thread|-kp processus] [WHEN expression-js] : Définir un point d'arrêt sur l'exécution.
  • CLS (aucun paramètre) : Effacer la fenêtre de journal.
  • COLOR [normal bold reverse help line]|[reset] : Afficher, définir ou réinitialiser les couleurs de l'écran.
  • DB/DW/DD/DQ [adresse] [-l longueur-en-octets] : Afficher la mémoire sous forme de valeurs 8/16/32/64 bits.
  • EB/EW/ED/EQ adresse -v valeurs-séparées-par-des-espaces : Modifier la mémoire sous forme de valeurs 8/16/32/64 bits.
  • KL EN|IT : Définir la disposition du clavier.
  • LINES [nb-lignes] : Afficher ou définir le nombre actuel de lignes d'affichage.
  • MOD [-u|-s] [chaîne-recherche] : Afficher les informations sur le module.
  • P [RET] : Exécuter une étape de programme.
  • PAGEIN adresse : Forcer une page mémoire à être chargée en mémoire (retourne le contrôle au système d'exploitation).
  • PROC [chaîne-recherche] : Afficher les informations sur le processus.
  • R nom-registre -v valeur : Modifier la valeur d'un registre.
  • STACK [pointeur-pile] : Analyser la pile à la recherche d'adresses de retour.
  • T (aucun paramètre) : Tracer une instruction.
  • THREAD [-kt thread|-kp processus] : Afficher les informations sur le thread.
  • U adresse|DEST : Désassembler les instructions.
  • VER (aucun paramètre) : Afficher les informations de version.
  • WD [taille-fenêtre] : Activer/désactiver la fenêtre du désassembleur ou définir sa taille.
  • WIDTH [nb-colonnes] : Afficher ou définir le nombre actuel de colonnes d'affichage.
  • WR (aucun paramètre) : Activer/désactiver la fenêtre des registres.

Instructions de construction

Prérequis

  • Visual Studio 2019
  • Windows Driver Kit 7.1.0

Remarque : Le WDK doit être installé dans son emplacement par défaut, c'est-à-dire X:\WinDDK, où X est le lecteur où les sources de BugChecker sont sauvegardées.

Un guide étape par étape pour la construction du pilote noyau est disponible ici.

Description des projets Visual Studio

  • BugChecker : il s'agit du pilote noyau BugChecker, où l'intégralité du débogueur est implémentée. Les fichiers de sortie « Release|x86 » et « Release|x64 » sont inclus dans le paquet final. Lors de l'initialisation, le pilote charge son fichier de configuration à « \SystemRoot\BugChecker\BugChecker.dat » (tous les fichiers de symboles sont également stockés dans ce répertoire), puis il essaie de localiser « KDCOM.dll » dans l'espace noyau. S'il est trouvé, il essaie d'appeler sa fonction exportée « KdSetBugCheckerCallbacks », hookant ainsi KdSendPacket et KdReceivePacket.
  • SymLoader : il s'agit du chargeur de symboles. Seul le fichier de sortie « Release|x86 » est inclus dans le paquet final. Le chargeur de symboles est utilisé pour modifier la configuration de BugChecker (la configuration est écrite dans « \SystemRoot\BugChecker\BugChecker.dat »), pour télécharger les fichiers PDB et pour installer le module KDCOM.dll personnalisé.
  • KDCOM : il s'agit du module KDCOM.dll personnalisé que NTOSKRNL charge au démarrage du système. Il exporte la fonction « KdSetBugCheckerCallbacks » que le pilote appelle pour hooker KdSendPacket et KdReceivePacket.
  • pdb : il s'agit du projet Ghidra « pdb ». La version originale affiche le contenu d'un fichier PDB sur la sortie standard au format xml. Le code a été modifié pour générer un fichier BCS à la place.
  • NativeUtil : étant donné que le chargeur de symboles est une application WOW64 sur Windows x64, les appels aux API qui doivent être effectués à partir d'images natives de l'architecture ont été déplacés ici (par exemple les appels à l'API d'installation des périphériques et des pilotes).
  • HttpToHttpsProxy : il s'agit d'une application ASP.NET Core dont la fonction est d'agir comme un proxy Internet pour le chargeur de symboles lorsqu'il est exécuté sous Windows XP. Étant donné que XP a un support TLS obsolète, le chargeur de symboles ne peut pas télécharger de fichiers depuis un serveur de symboles arbitraire. Après avoir déployé cette application sur un IIS sur le même réseau, il est possible de télécharger des fichiers depuis un serveur de symboles sous Windows XP en ajoutant « http://<VOTRE_ADRESSE_IP_SERVEUR_IIS>/HttpToHttpsProxy/ » à l'URL du serveur dans le chargeur de symboles.

Crédits

  • VirtualKD : la première preuve de concept de BugChecker a été construite en modifiant VirtualKD.
  • BazisLib : le code derrière le bouton « Copy/Replace Kdcom + Add Boot Entry » dans le chargeur de symboles provient de VirtualKD et utilise BazisLib.
  • EASTL : Impossible d'utiliser le STL MSVC++ ici. EASTL est une excellente alternative.
  • Ghidra : le projet « pdb » dans BugChecker provient de Ghidra. Il a été modifié pour générer des fichiers BCS.
  • Zydis : pour la fenêtre du désassembleur dans BugChecker.
  • QuickJSPP, qui est un portage de QuickJS vers MSVC++ : pour le moteur JavaScript intégré dans le pilote noyau.
  • ReactOS : pour les définitions de types internes KD de Windows.
  • SerenityOS : pour les fonctions de manipulation de bitmap bas niveau utilisées par l'allocateur mémoire de BugChecker. Comme j'ai commencé BugChecker après avoir vu une vidéo d'Andreas (après 10 ans d'abstinence de C/C++ et de tout type de programmation bas niveau), je voulais inclure un petit morceau de SerenityOS dans BugChecker.
Télécharger l’outil
  • WS [taille-fenêtre] : Activer/désactiver la fenêtre de script ou définir sa taille.
  • X (aucun paramètre) : Quitter l'écran de BugChecker.