Présentation
L'écriture d'un débogueur depuis zéro peut sembler une tâche complexe, mais cela peut également être une excellente façon d'apprendre un nouveau langage de programmation comme Rust. Dans cet article, nous allons explorer les bases de la création d'un débogueur pour Windows en utilisant Rust.
Contexte technique
Un débogueur est un outil qui permet d'analyser un système en cours d'exécution ou une capture statique d'un processus. Les débogueurs comme GDB, LLDB, Visual Studio et WinDbg peuvent effectuer ces deux tâches. Nous allons créer un débogueur qui prend en charge le débogage en mode utilisateur sur Windows.
Les API de Windows fournissent les fonctionnalités nécessaires pour mettre en œuvre un débogueur. Les API de débogage sont décrites sur MSDN dans la page Fonctions de débogage. Nous allons utiliser les API les plus basiques fournies par le système d'exploitation pour créer notre débogueur.
Fonctionnement du débogueur
Un débogueur utilise une boucle d'événements pour gérer les événements de débogage. Le débogueur s'attache à un processus cible et reçoit des notifications pour chaque événement de débogage. Le débogueur peut alors examiner ou manipuler l'état du processus cible avant de le reprendre.
Pour attacher un processus, nous pouvons utiliser l'API DebugActiveProcess ou créer un processus avec l'API CreateProcessW en incluant le drapeau DEBUG_ONLY_THIS_PROCESS. Nous allons utiliser CreateProcessW pour lancer un processus et nous attacher à celui-ci.
let mut si: STARTUPINFOEXW = unsafe { std::mem::zeroed() };
si.StartupInfo.cb = std::mem::size_of::() as u32;
let mut pi: PROCESS_INFORMATION = unsafe { std::mem::zeroed() };
let ret = unsafe {
CreateProcessW(
null(), // lpApplicationName
// lpCommandLine
// lpProcessAttributes
// lpThreadAttributes
FALSE, // bInheritHandles
DEBUG_ONLY_THIS_PROCESS | CREATE_NEW_CONSOLE, // dwCreationFlags
// lpEnvironment
// lpCurrentDirectory
&mut si.StartupInfo, // lpStartupInfo
&mut pi, // lpProcessInformation
);
};Implications et limites
La création d'un débogueur depuis zéro nécessite une bonne compréhension des API de débogage et du fonctionnement interne d'un débogueur. Nous avons exploré les bases de la création d'un débogueur pour Windows en utilisant Rust. Cependant, il est important de noter que la mise en œuvre complète d'un débogueur nécessite de prendre en compte de nombreux détails et complexités, tels que la gestion des événements de débogage, l'examen de l'état du processus cible et la manipulation de celui-ci.