vendredi, décembre 08, 2006

Retour sur la routine KeBugCheckEx

Suite à la réponse d'Andréas Schuster à ma question sur la possibilité d'obtenir un crash dump sans préparation, j'ai essayé de me documenter sur cette fameuse routine KeBugcheckEx. Voila les informations que j'ai pu rassemblées, n'étant pas du tout un développeur de drivers en mode noyau...

Windows divise la mémoire physique en séries de pages de taille 4KB sur les architecture x86, bien que cette taille puisse être modifiée par la constante PAGE_SIZE. Windows divise également l'espace d'adressage virtuel en pages de taille équivalente.

Une erreur de pagination survient lorsqu'un driver en mode noyau rapporte au système que ce dernier n'est pas autorisé à accéder à la page demandée ou qu'il ne peut pas traduire une page virtuelle en page physique. Ce compte rendu d'erreur du driver est réalisé au travers la routine noyau KeBugcheckEx. A priori, cette erreur est exclusivement causée par une malfonction du driver dans la pile de stockage.

Pour obtenir le fameux BSOD (Blue Screen Of Death) à l'aide de cette routine, il suffit donc de réaliser un driver en mode noyau qui réalise une opération illégale, du genre lecture d'une adresse mémoire interdite (cela doit être possible à l'aide d'un pointeur NULL...). Mais, pour générer un crash dump complet de la mémoire physique, il faut avoir préparé le système pour cela. Par défaut, seules les pages mémoires de l'objet ayant entrainé l'écran bleu seront copiées dans le fichier MEMORY.DMP.

Pour revenir au crash dump généré par la routine noyau KeBugcheckEx, il s'agit d'une simple copie du contenu de la mémoire physique poussée dans un fichier du disque dur. On a vu que cette copie est réalisée par KeBugcheckEx après une exception fatale d'un driver en mode noyau. Mais, j'ai observé que KeBugcheckEx n'écrit pas immédiatement le contenu de la mémoire dans le fichier cible. Ceci est peut-être dû au fait que le système n'est alors pas vraiment en mesure de réaliser cette copie !

Au lieu de cela, l'image est copiée dans le fichier de stockage de pagination qui fait partie du gestionnaire système de la mémoire. L'une des conséquences de ce mécanisme de copie est que pour réaliser un bon crash dump et ne pas perdre les informations concernant la moitié des processus en fonctionnement, il faut disposer d'un fichier de pagination de taille au moins double à celle de la mémoire physique. En effet, pour réaliser une copie sur le disque dur, le système va devoir utiliser de la mémoire virtuelle d'une taille équivalente.

Au final, au travers la lecture de la documentation cryptique de msdn, j'ai eu l'étrange impression que Microsoft désirait rendre extrêmement difficile la connaissance de ses noyaux. Ce qui n'a fait qu'exacerber ma curiosité !

1 commentaire:

  1. Si vous voulez seulement créer un crash vous le pouvez faire avec BANG de OSR. http://www.osronline.com/article.cfm?article=153. Mais, comme vous avez dit, pour générer un crash dump complet on doits avoir préparé le système pour cela. Pourtant, un crash dump « complet » ne contient qu’une partie de la mémoire physique.

    - rossetoecioccolato@yahoo.com

    RépondreSupprimer