!chkimg

L’extension !chkimg détecte une altération dans les images de fichiers exécutables en les comparant à la copie sur un magasin de symboles ou un autre référentiel de fichiers.

!chkimg [Options] [-mmw LogFile LogOptions] [Module]

Paramètres

Options Toute combinaison des options suivantes :

-p **** SearchPath
Recherche de manière récursive le SearchPath du fichier avant d’accéder au serveur de symboles.

-f
Corrige les erreurs dans l’image. Chaque fois que l’analyse détecte les différences entre le fichier sur le magasin de symboles et l’image en mémoire, le contenu du fichier sur le magasin de symboles est copié sur l’image. Si vous effectuez un débogage en direct, vous pouvez créer un fichier de vidage avant d’exécuter l’extension !chkimg -f.

-nar
Empêche le déplacement de l’image mappée du fichier sur le serveur de symboles. Par défaut, lorsque la copie du fichier se trouve sur le serveur de symboles et mappée en mémoire, !chkimg déplace l’image du fichier sur le serveur de symboles. Toutefois, si vous utilisez l’option -nar, l’image du fichier à partir du serveur n’est pas déplacée.

L’image exécutable déjà en mémoire (c’est-à-dire celle qui est analysée) est déplacée, car le débogueur déplace toujours les images qu’il charge.

Ce commutateur est utile uniquement si le système d’exploitation a déjà déplacé l’image d’origine. Si l’image n’a pas été déplacée, !chkimg et le débogueur déplacent l’image. L’utilisation de ce commutateur est rare.

-ss **** SectionName
Limite l’analyse à ces sections dont les noms contiennent la chaîne SectionName. L’analyse inclut toute section ne pouvant être supprimée, dont le nom contient cette chaîne. SectionName respecte la casse et ne peut pas dépasser 8 caractères.

-as
Provoque l’analyse pour inclure toutes les sections de l’image, à l’exception des sections pouvant être supprimées. Par défaut, (si vous n’utilisez pas -as ou -ss), l’analyse ignore les sections qui sont accessibles en écriture, les sections qui ne sont pas exécutables, les sections qui comportent « PAGE » dans leur nom et les sections ne pouvant être supprimées.

-r **** StartAddress **** EndAddress
Limite l’analyse à la plage de mémoire qui commence par StartAddress et se termine par EndAddress. Dans cette plage, toutes les sections qui seraient généralement analysées sont analysées. Si une section se chevauche partiellement avec cette plage, seule cette partie de la section qui chevauche cette plage est analysée. L’analyse est limitée à cette plage, même si vous utilisez également le commutateur -as ou -ss.

-nospec
Entraîne l’analyse à inclure les sections réservées de Hal.dll et de Ntoskrnl.exe. Par défaut, !chkimg ne vérifie pas certaines parties de ces fichiers.

-noplock
Affiche les zones qui ne correspondent pas en ayant une valeur d’octet de 0x90 (instruction nop) et une valeur d’octet de 0xF0 (instruction lock). Par défaut, ces incompatibilités ne sont pas affichées.

-np
Provoque la reconnaissance des instructions corrigées.

-d
Affiche un résumé de toutes les zones non concordantes durant l’analyse. Pour plus d'informations sur ce texte résumé, consultez la section Remarques.

-db
Affiche des zones non concordantes dans un format similaire à la commande de débogueur de base de données. Par conséquent, chaque ligne d’affichage affiche l’adresse du premier octet de la ligne, suivie d'un nombre maximal de 16 valeurs d’octet hexadécimales. Les valeurs d’octet sont immédiatement suivies des valeurs ASCII correspondantes. Tous les caractères non imprimables, tels que les retours chariot et les flux de ligne, sont affichés sous forme de points (.). Les octets non concordants sont marqués par un astérisque (*).

-lo **** lines
Limite le nombre de lignes de sortie qu'affichent -d ou -db sur le nombre de lignes de la ligne.

-v
Affiche les informations détaillées.

-mmw
Crée un fichier journal et enregistre l’activité de !chkimg dans ce fichier. Chaque ligne du fichier journal représente une non concordance unique.

LogFile
Spécifie le chemin complet du fichier journal. Si vous spécifiez un chemin relatif, celui-ci est relatif au chemin actuel.

LogOptions
Spécifie le contenu du fichier journal. LogOptions est une chaîne qui se compose d’une concaténation de diverses lettres. Chaque ligne du fichier journal contient plusieurs colonnes séparées par des virgules. Ces colonnes incluent les éléments spécifiés par les lettres d’option suivantes, dans l’ordre dans lequel les lettres apparaissent dans la chaîne LogOptions. Vous pouvez inclure les options suivantes plusieurs fois. Vous devez inclure au moins une option.

Option de journalisation Informations incluses dans le fichier journal

v

Adresse virtuelle de la non concordance

r

Décalage (adresse relative) de la non concordance dans le module

s

Symbole qui correspond à l’adresse de la non concordance

S

Nom de la section qui contient la non concordance

e

Valeur correcte attendue à l’emplacement de la non concordance

w

Valeur incorrecte qui se trouvait à l’emplacement de la non concordance

LogOptions peut également inclure certaines ou aucune des options supplémentaires suivantes.

Option de journalisation Effet

o

Si un fichier portant le nom LogFile existe déjà, le fichier existant est remplacé. Par défaut, le débogueur ajoute de nouvelles informations à la fin de tout fichier existant.

tString

Ajoute une colonne supplémentaire au fichier journal. Chaque entrée de cette colonne contient string. L’option tString est utile si vous ajoutez de nouvelles informations à un fichier journal existant et que vous devez distinguer les nouveaux enregistrements des anciens. Vous ne pouvez pas ajouter d’espace entre t et String. Si vous utilisez l’option tIString, il doit s’agir de l’option finale dans LogOptions, car String est utilisée pour inclure tous les caractères présents avant l’espace suivant.

Par exemple, si LogOptions est rSewo, chaque ligne du fichier journal contient l’adresse relative et le nom de section de l’emplacement présentant une non concordance, ainsi que les valeurs attendues et réelles à cet emplacement. Cette option entraîne également le remplacement d’un fichier précédent. Vous pouvez utiliser le commutateur -mmw plusieurs fois si vous souhaitez créer plusieurs fichiers journaux qui ont différentes options. Vous pouvez créer jusqu’à 10 fichiers journaux en même temps.

Module
Spécifie le module à vérifier. Le module peut être le nom du module, l’adresse de départ du module ou toute adresse contenue dans le module. Si vous omettez le module, le débogueur utilise le module qui contient le pointeur d’instruction actuel.

DLL

Windows XP et versions ultérieures

Ext.dll

Notes

Lorsque vous utilisez !chkimg, elle compare l’image d’un fichier exécutable en mémoire à la copie du fichier résidant sur un magasin de symboles.

Toutes les sections du fichier sont comparées, à l’exception des sections ne pouvant être supprimées, qui sont accessibles en écriture, qui ne sont pas exécutables, qui comportent « PAGE » dans leur nom ou qui proviennent d’INITKDBG. Vous pouvez modifier ce comportement à l’aide des commutateurs -ss, -as ou -r.

!chkimg affiche toute non concordance entre l’image et le fichier en tant qu’erreur d’image, avec les exceptions suivantes :

  • Les adresses occupées par la table d’adresses d’importation (IAT) ne sont pas vérifiées.

  • Certaines adresses spécifiques dans Hal.dll et Ntoskrnl.exe ne sont pas vérifiées, car certaines modifications se produisent lorsque ces sections sont chargées. Pour vérifier ces adresses, incluez l’option -nospec.

  • Si la valeur d’octet 0x90 est présente dans le fichier et si la valeur 0xF0 est présente dans l’octet correspondant de l’image (ou vice versa), cette situation est considérée comme une correspondance. En règle générale, le serveur de symboles contient une version d’un binaire qui existe dans les versions uniprocesseur et multiprocesseur. Sur un processeur x86, l’instruction lock est 0xF0, cette instruction correspond par ailleurs à une instruction nop (0x90) dans la version uniprocesseur. Si vous souhaitez que !chkimg affiche cette paire en tant que non correspondance, définissez l’option -noplock.

Remarque Si vous utilisez l’option -f pour corriger les non correspondances d’image, !chkimg corrige uniquement ces non correspondances qu’il considère comme des erreurs. Par exemple, !chkimg ne modifie pas un octet 0x90 en octet 0xF0, sauf si vous incluez -noplock.

Lorsque vous incluez l’option -d , !chkimg affiche un résumé de toutes les zones non concordantes durant l’analyse. Chaque non concordance s’affiche sur deux lignes. La première ligne comprend le début de la plage, la fin de la plage, la taille de la plage, le nom du symbole et le décalage correspondant au début de la plage, ainsi que le nombre d’octets depuis la dernière erreur (entre parenthèses). La deuxième ligne est placée entre crochets et inclut les valeurs d’octet hexadécimales attendues, un signe deux-points, puis les valeurs hexadécimales d’octets qui ont été réellement rencontrées dans l’image. Si la plage est supérieure à 8 octets, seules les 8 premiers octets sont affichés avant le signe deux-points et après le signe deux-points. L’exemple suivant montre cette situation.

be000015-be000016  2 bytes - win32k!VeryUsefulFunction+15 (0x8)
     [ 85 dd:95 23 ]

Parfois, un pilote modifie une partie du noyau Microsoft Windows à l’aide de crochets, de redirection ou d’autres méthodes. Même un pilote qui n’est plus sur la pile peut avoir modifié une partie du noyau. Vous pouvez utiliser l’extension !chkimg comme outil de comparaison de fichiers pour déterminer quelles parties du noyau Windows (ou toute autre image) sont modifiées par les pilotes et déterminer la façon exacte dont les parties sont modifiées. Cette comparaison est la plus efficace sur les fichiers de vidage complets.

Vérifier chaque module chargé

Vous pouvez également utiliser !chkimg avec l’extension !for_each_module pour vérifier l’image de chaque module chargé. L’exemple suivant montre cette situation.

!for_each_module !chkimg @#ModuleName 

Exemple de !analyze

Supposons que vous rencontriez une vérification de bogues, par exemple, et commenciez à utiliser !analyze.

kd> !analyze 
....
BugCheck 1000008E, {c0000005, bf920e48, baf75b38, 0}
Probably caused by : memory_corruption
CHKIMG_EXTENSION: !chkimg !win32k
....

Dans cet exemple, la sortie de !analyze suggère qu'une altération de la mémoire s’est produite et inclut une ligne CHKIMG_EXTENSION suggérant que Win32k.sys pourrait être le module endommagé. (Même si cette ligne n’est pas présente, vous pouvez envisager une altération possible dans le module au-dessus de la pile.) Commencez par utiliser !chkimg sans commutateur, comme l’illustre l’exemple suivant.

kd> !chkimg win32k
Number of different bytes for win32k: 31

L’exemple suivant montre qu’il existe effectivement des altérations de mémoire. Utilisez !chkimg -d pour afficher toutes les erreurs du module Win32k.

kd> !chkimg win32k -d
    bf920e40-bf920e46  7 bytes - win32k!HFDBASIS32::vSteadyState+1f
        [ 78 08 d3 78 0c c2 04:00 00 00 00 00 01 00 ]
    bf920e48-bf920e5f  24 bytes - win32k!HFDBASIS32::vHalveStepSize (+0x08)
        [ 8b 51 0c 8b 41 08 56 8b:00 00 00 00 00 00 00 00 ]
Number of different bytes for win32k: 31

Lorsque vous essayez de désassembler l’image endommagée de la deuxième section répertoriée, la sortie suivante peut se produire.

kd> u  win32k!HFDBASIS32::vHalveStepSize
win32k!HFDBASIS32::vHalveStepSize:
bf920e48 0000             add     [eax],al
bf920e4a 0000             add     [eax],al
bf920e4c 0000             add     [eax],al
bf920e4e 0000             add     [eax],al
bf920e50 7808            js win32k!HFDBASIS32::vHalveStepSize+0x12 (bf920e5a)
bf920e52 d3780c           sar     dword ptr [eax+0xc],cl
bf920e55 c20400           ret     0x4
bf920e58 8b510c           mov     edx,[ecx+0xc]

Ensuite, utilisez !chkimg -f pour corriger l’altération de la mémoire.

kd> !chkimg win32k -f
Warning: Any detected errors will be fixed to what we expect!
Number of different bytes for win32k: 31 (fixed)

Vous pouvez maintenant désassembler la vue corrigée et voir les modifications que vous avez apportées.

kd> u  win32k!HFDBASIS32::vHalveStepSize
win32k!HFDBASIS32::vHalveStepSize:
bf920e48 8b510c           mov     edx,[ecx+0xc]
bf920e4b 8b4108           mov     eax,[ecx+0x8]
bf920e4e 56               push    esi
bf920e4f 8b7104           mov     esi,[ecx+0x4]
bf920e52 03c2             add     eax,edx
bf920e54 c1f803           sar     eax,0x3
bf920e57 2bf0             sub     esi,eax
bf920e59 d1fe             sar     esi,1

Examiner l’altération du stockage et de la mémoire

L’altération aléatoire des fichiers et de la mémoire peut être difficile à examiner. L’un des outils à prendre en compte dans certaines situations permet d’activer des vérifications de mémoire supplémentaires, par exemple à l’aide du vérificateur de pilote. Pour plus d’informations sur le vérificateur de pilotes, consultez Vérificateur de pilote.

Pour tester la mémoire physique, utilisez l’outil Diagnostics de mémoire Windows. Son utilisation ainsi que d’autres techniques générales sont décrites dans Données des écrans bleus.

Utilisez l’utilitaire de disque d’analyse pour identifier les erreurs du système de fichiers. Sélectionnez et maintenez la touche enfoncée (ou cliquez avec le bouton droit) sur le lecteur que vous souhaitez analyser et sélectionnez Propriétés. Sélectionnez Outils. Sélectionnez le bouton Vérifier maintenant.