↓ Aller au contenu

01 - Introduction à KDAMonitor : développer un driver Windows Kernel

·1065 mots·6 mins
Elouan Charbonnier
Auteur
Elouan Charbonnier
KDAMonitor - Cet article fait partie d'une série.
Partie 1: Cet article

Bienvenue dans cette première série de mon blog ! Elle va servir à la fois d’expérimentation pour mes prochaines séries d’articles et de journal de développement de KDAMonitor.

Le projet peut être retrouvé dans ce dépôt : KDAMonitor.


En quoi consiste KDAMonitor ?
#

KDAMonitor est l’abréviation de Kernel Driver Activity Monitor; le but de ce projet est de faire ce que fait globalement Sysmon de Microsoft. Ce projet sera constitué de deux composants :

  • Le driver qui va récupérer des événements, les logger dans un fichier .jsonl et les envoyer au client. Voici la liste des événements gérés par le driver :
    • création/destruction de processus
    • chargement d’image
    • connexion réseau
    • modification/création/suppression de registres
    • création/suppression de threads
  • Le client qui sera une interface (console dans un premier temps) pour l’utilisateur afin qu’il puisse constater en temps réel les événements

Le choix de ces événements est en partie arbitraire, mais il correspond aussi aux bases de ce qu’on regarde en analyse malware : quel processus a été lancé, quelles DLL ont été chargées, avec qui le processus communique sur le réseau, etc.


Pourquoi ce projet ?
#

Il y a deux raisons principales pour lesquelles j’ai décidé de faire ce projet et pas un autre :

  1. Apprendre à développer un driver pour le noyau Windows
  2. Développer un outil utile en analyse malware que je peux réutiliser de mon côté (bien que moins bien que Sysmon)

Ce projet est issu d’une simple envie d’apprendre et de découvrir quelque chose. Je m’étais dit que pour surveiller une activité système, quoi de mieux qu’un driver noyau qui a la capacité de tout regarder ?

À noter que, lors de l’écriture de cet article, je suis déjà à la version 0.7 du projet et que donc j’ai déjà un peu de recul sur celui-ci.

Sans plus tarder, nous allons passer à l’idée de l’architecture que je me suis faite de ce projet au début.


Architecture prévue
#

À l’issue de ce projet (en v1.0), l’architecture de ce dernier ressemblera à ceci :

kdamonitor_architecture_final.svg

En résumé :

  1. Un événement se produit (processus, image, connexion réseau, etc.).
  2. Un capteur (callbacks ou callouts) va capturer cet événement.
  3. Le capteur concerné va aussi ajouter cet événement à la file.
  4. L’événement est retiré de la file et distribué à deux destinations :
    • le journaliseur (log writer), qui l’écrit dans le fichier .jsonl
    • le client, pour affichage en temps réel

Technologies utilisées
#

LangageC
IDE / BuildVisual Studio 2026
Modèle de driverWDM
Environnement de testVM Windows 11 (VirtualBox), test signing désactivé

Les choix de technologie seront expliqués tout au long de la série.


Prérequis
#

Afin de correctement suivre cette série, je conseille au lecteur d’avoir une connaissance basique du C et du fonctionnement interne du noyau Windows. J’apprends en même temps que vous :-), donc j’essaierai de rendre les articles les plus clairs possible.


Plan détaillé de développement
#

Ci-dessous, un tableau représentant un plan détaillé de chaque release du projet :

VersionFichier(s) concerné(s)Fonctionnalité
v0.1driver_entry.cSquelette du driver (chargement/déchargement)
v0.2device.c, ioctl.cDevice + IOCTL
v0.3event_queue.cFile d’événements noyau
v0.4log_writer.cJournalisation
v0.5process_callback.cSurveillance de la création/fermeture des processus
v0.6image_callback.cSurveillance du chargement des images/DLL
v0.7wfp_session.cMise en place de la session WFP
v0.8wfp_callout.cSurveillance des connexions réseau
v0.9registry_callback.cSurveillance de l’activité du registre
v0.10thread_callback.cSurveillance de la création/fermeture des threads
v0.11-Nettoyage de la structure du projet
v0.12client/Client en mode utilisateur
v1.0-Stabilisation + publication

Programme des articles à venir
#

Vous pouvez ignorer cette partie si vous souhaitez découvrir les articles au fur et à mesure que je les écris. Il est aussi possible que ce programme évolue au fil du développement.

Cet article sert d’introduction à la série; je vais maintenant détailler brièvement le contenu des prochains articles. Voici dans l’ordre les articles qui vont sortir ainsi qu’un court descriptif de ce qu’ils contiendront :

ArticleVersion(s)TitreContenu principal
02v0.1 – v0.2Fondations du driver : DriverEntry, device et communication IOCTLCréation du squelette du driver, DriverEntry/DriverUnload, DEVICE_OBJECT, lien symbolique, IOCTL et premier client usermode de test.
03v0.3La file d’événements : structure et synchronisation dans le noyauConception de la structure d’événement générique, ring buffer, spinlock, file d’attente, FIFO, identifiants uniques et premier test interne.
04v0.4Écriture des événements sur disque : journalisation JSONL, événements de réveil et premier crashImplémentation du thread de journalisation, création des fichiers JSONL, utilisation des KEVENT pour supprimer le polling, premier crash (IRQL) et sa résolution.
05v0.5Premier capteur : surveillance de la création et de la terminaison des processusUtilisation de PsSetCreateProcessNotifyRoutineEx, intégration dans le pipeline d’événements, sérialisation JSON et premiers événements réels.
06v0.6Deuxième capteur : suivi du chargement des images et des DLLAjout de PsSetLoadImageNotifyRoutine, récupération des informations sur les DLL/EXE chargés, intégration au système existant.
07v0.7Préparation de la surveillance réseau : mise en place de la session WFPPrésentation de la Windows Filtering Platform, ouverture de la session WFP, création du fournisseur/sous-couche, second crash rencontré et corrections apportées.
08v0.8Surveillance des connexions réseau avec la Windows Filtering PlatformDéveloppement du callout WFP, interception des connexions réseau sortantes, collecte des PID, adresses IP, ports et protocoles.
09v0.9Surveillance de l’activité du registreMise en œuvre des callbacks registre (CmRegisterCallbackEx), surveillance des créations, modifications et suppressions de clés/valeurs.
10v0.10Surveillance de la création et de la terminaison des threadsAjout du callback thread (PsSetCreateThreadNotifyRoutine), collecte des événements de création et de terminaison des threads.
11v0.11Refactorisation de KDAMonitor : organisation du code pour la scalabilitéRéorganisation de l’arborescence du projet, séparation des composants, amélioration de la maintenabilité et préparation à l’évolution du projet.
12v0.12Création d’un client usermode pour la surveillance des événements en temps réelDéveloppement d’un client console communiquant avec le driver via les IOCTL afin d’afficher les événements en temps réel.
13v1.0KDAMonitor v1.0 : stabilisation, validation et retour d’expérienceValidation sur des échantillons réels en VM, performances, limites du projet, documentation finale, bilan du développement et perspectives d’évolution.

Merci d’avance à toutes celles et ceux qui suivront cette série. Si vous avez des questions, des retours ou simplement envie d’échanger sur le projet, n’hésitez pas à me contacter par mail ou sur LinkedIn.

À bientôt pour le prochain article où l’on commencera vraiment à développer le driver !

KDAMonitor - Cet article fait partie d'une série.
Partie 1: Cet article