!chkimg
La extensión !chkimg detecta daños en las imágenes de archivos ejecutables comparándolos con la copia en un almacén de símbolos u otro repositorio de archivos.
!chkimg [Options] [-mmw LogFile LogOptions] [Module]
Parámetros
Options Cualquier combinación de las siguientes opciones:
-p **** SearchPath
Busca de forma recursiva en SearchPath el archivo antes de acceder al servidor de símbolos.
-f
Corrige errores en la imagen. Cuando el análisis detecta diferencias entre el archivo en el almacén de símbolos y la imagen en memoria, el contenido del archivo en el almacén de símbolos se copia sobre la imagen. Si está realizando la depuración en tiempo real, puede crear un archivo de volcado de memoria antes de ejecutar la extensión !chkimg -f.
-nar
Impide que se mueva la imagen asignada del archivo en el servidor de símbolos. De forma predeterminada, cuando la copia del archivo se encuentra en el servidor de símbolos y se asigna a la memoria, !chkimg mueve la imagen del archivo en el servidor de símbolos. Sin embargo, si usa la opción -nar, la imagen del archivo del servidor no se mueve.
La imagen ejecutable que ya está en memoria (es decir, la que se está analizando) se mueve, ya que el depurador siempre reubica las imágenes que carga.
Este modificador solo es útil si el sistema operativo ya ha movido la imagen original. Si no se ha movido la imagen, !chkimg y el depurador moverán la imagen. El uso de este conmutador es poco frecuente.
-ss **** SectionName
Limita el análisis a las secciones cuyos nombres contienen la cadena SectionName. El análisis incluirá cualquier sección no descartable cuyo nombre contenga esta cadena. SectionName distingue mayúsculas de minúsculas y no puede superar los 8 caracteres.
-as
Hace que el análisis incluya todas las secciones de la imagen, excepto las secciones descartables. De forma predeterminada, (si no usa -as o -ss), el análisis omite las secciones que se pueden escribir, secciones que no son ejecutables, secciones que tienen "PAGE" en su nombre y secciones descartables.
-r **** StartAddress **** EndAddress
Limita el análisis al intervalo de memoria que comienza con StartAddress y termina con EndAddress. Dentro de este intervalo, se analizan las secciones que normalmente se analizarían. Si una sección se superpone parcialmente con este intervalo, solo se analiza esa parte de la sección que se superpone con este intervalo. El análisis se limita a este intervalo incluso si también usa el modificador -as o -ss.
-nospec
Hace que el análisis incluya las secciones reservadas de Hal.dll y Ntoskrnl.exe. De forma predeterminada, !chkimg no comprueba determinadas partes de estos archivos.
-noplock
Muestra áreas que no coinciden porque tienen un valor de byte de 0x90 (una instrucción nop) y un valor de byte de 0xF0 (una instrucción lock). De forma predeterminada, no se muestran estas discrepancias.
-np
Hace que se reconozcan las instrucciones revisadas.
-d
Muestra un resumen de todas las áreas no coincidentes mientras se realiza el análisis. Para obtener más información sobre este texto de resumen, consulte la sección Observaciones.
-db
Muestra áreas no coincidentes en un formato similar al del comando del depurador db. Por lo tanto, cada línea de visualización muestra la dirección del primer byte de la línea, seguida de hasta 16 valores de bytes hexadecimales. Los valores de bytes van seguidos inmediatamente de los valores ASCII correspondientes. Todos los caracteres no imprimibles, como retornos de carro y avances de línea, se muestran como puntos (.). Los bytes no coincidentes se marcan mediante un asterisco (*).
-lo **** lines
Limita el número de líneas de salida que muestra -d o -db al número de líneas.
-v
Muestra información de detalle.
-Mmw
Crea un archivo de registro y registra la actividad de !chkimg en este archivo. Cada línea del archivo de registro representa una única discrepancia.
LogFile
Especifica la ruta de acceso completa del archivo de registro. Si especifica una ruta relativa, la ruta es relativa a la ruta actual.
LogOptions
Especifica el contenido del archivo de registro. LogOptions es una cadena que consta de una concatenación de varias letras. Cada línea del archivo de registro contiene varias columnas separadas por comas. Estas columnas incluyen los elementos que especifican las letras de opción siguientes, en el orden en que las letras aparecen en la cadena LogOptions. Puede incluir las siguientes opciones varias veces. Debe incluir al menos una opción.
Opción de registro | Información incluida en el archivo de registro |
---|---|
v |
Dirección virtual de la discrepancia |
r |
Desplazamiento (dirección relativa) de la discrepancia dentro del módulo |
s |
Símbolo que corresponde a la dirección de la discrepancia |
S |
Nombre de la sección que contiene la discrepancia |
e |
Valor correcto que se esperaba en la ubicación de la discrepancia |
t |
Valor incorrecto que estaba en la ubicación de la discrepancia |
LogOptions también puede incluir algunas o ninguna de las siguientes opciones adicionales.
Opción de registro | Efecto |
---|---|
o |
Si ya existe un archivo con el nombre LogFile, se sobrescribe el archivo existente. De forma predeterminada, el depurador anexa información nueva al final de cualquier archivo existente. |
tString |
Agrega una columna adicional al archivo de registro. Cada entrada de esta columna contiene String. La opción tString es útil si va a anexar información nueva a un archivo de registro existente y tiene que distinguir los nuevos registros del antiguo. No se puede agregar espacio entre t y String. Si usa la opción tIString, debe ser la opción final en LogOptions, ya que String se toma para incluir todos los caracteres presentes antes del siguiente espacio. |
Por ejemplo, si LogOptions es rSewo, cada línea del archivo de registro contiene la dirección relativa y el nombre de sección de la ubicación de la discrepancia y los valores esperados y reales en esa ubicación. Esta opción también hace que se sobrescriba cualquier archivo anterior. Puede usar el modificador -mmw varias veces si desea crear varios archivos de registro que tengan diferentes opciones. Puede crear hasta 10 archivos de registro al mismo tiempo.
Módulo
Especifica el módulo que se va a comprobar. Module puede ser el nombre del módulo, la dirección inicial del módulo o cualquier dirección contenida en el módulo. Si omite Module, el depurador usa el módulo que contiene el puntero de instrucción actual.
Archivo DLL
Windows XP y versiones posteriores |
Ext.dll |
Comentarios
Cuando se usa !chkimg, compara la imagen de un archivo ejecutable en memoria con la copia del archivo que reside en un almacén de símbolos.
Se comparan todas las secciones del archivo, excepto las que se pueden descartar, las que se pueden escribir, las que no son ejecutables, las que tienen "PAGE" en su nombre o las que son de INITKDBG. Puede cambiar este comportamiento mediante los modificadores -ss, -as o -r.
!chkimg muestra cualquier discrepancia entre la imagen y el archivo como un error de imagen, con las siguientes excepciones:
No se comprueban las direcciones ocupadas por la tabla de direcciones de importación (IAT).
Algunas direcciones específicas de Hal.dll y Ntoskrnl.exe no se comprueban, ya que se producen ciertos cambios cuando se cargan estas secciones. Para comprobar estas direcciones, incluya la opción -nospec.
Si el valor de byte 0x90 está presente en el archivo y si el valor 0xF0 está presente en el byte correspondiente de la imagen (o viceversa), esta situación se considera una coincidencia. Normalmente, el servidor de símbolos contiene una versión de un binario que existe tanto en versiones de un solo procesador como de varios procesadores. En un procesador basado en x86, la instrucción lock es 0xF0 y esta instrucción corresponde a una instrucción nop (0x90) en la versión de un solo procesador. Si desea que !chkimg muestre este par como una discrepancia, establezca la opción -noplock.
Nota Si usa la opción -f para corregir discrepancias de imágenes, !chkimg corrige solo las discrepancias que considera que son errores. Por ejemplo, !chkimg no cambia un byte de 0x90 a un byte de 0xF0 a menos que incluya -noplock.
Al incluir la opción -d, !chkimg muestra un resumen de todas las áreas no coincidentes mientras se realiza el análisis. Cada discrepancia se muestra en dos líneas. La primera línea incluye el inicio del intervalo, el final del intervalo, el tamaño del intervalo, el nombre del símbolo y el desplazamiento que corresponde al inicio del intervalo y el número de bytes desde el último error (entre paréntesis). La segunda línea se incluye entre corchetes e incluye los valores de bytes hexadecimales que se esperaban, dos puntos y, a continuación, los valores de bytes hexadecimales que se encontraron realmente en la imagen. Si el intervalo tiene más de 8 bytes, solo se muestran los primeros 8 bytes antes de los dos puntos y después de los dos puntos. El siguiente ejemplo muestra esta situación.
be000015-be000016 2 bytes - win32k!VeryUsefulFunction+15 (0x8)
[ 85 dd:95 23 ]
En ocasiones, un controlador modifica parte del kernel de Microsoft Windows mediante enlaces, redirección u otros métodos. Incluso un controlador que ya no esté en la pila podría haber modificado parte del kernel. Puede usar la extensión !chkimg como una herramienta de comparación de archivos para determinar qué partes del kernel de Windows (o cualquier otra imagen) se están modificando mediante controladores y cómo se cambian las partes exactamente. Esta comparación es más eficaz en archivos de volcado de memoria completo.
Comprobación de cada módulo cargado
También puede usar !chkimg junto con la extensión !for_each_module para comprobar la imagen de cada módulo cargado. El siguiente ejemplo muestra esta situación.
!for_each_module !chkimg @#ModuleName
Ejemplo de !analyze
Supongamos que encuentra una comprobación de errores, por ejemplo, y empieza por usar !analyze.
kd> !analyze
....
BugCheck 1000008E, {c0000005, bf920e48, baf75b38, 0}
Probably caused by : memory_corruption
CHKIMG_EXTENSION: !chkimg !win32k
....
En este ejemplo, la salida !analyze sugiere que se han producido daños en la memoria e incluye una línea de CHKIMG_EXTENSION que sugiere que Win32k.sys podría ser el módulo dañado. (Incluso si esta línea no está presente, puede considerar posibles daños en el módulo en la parte superior de la pila). Empiece por usar !chkimg sin modificadores, como se muestra en el ejemplo siguiente.
kd> !chkimg win32k
Number of different bytes for win32k: 31
En el ejemplo siguiente se muestra que realmente hay daños en la memoria. Use !chkimg -d para mostrar todos los errores del módulo 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
Al intentar desensamblar la imagen dañada de la segunda sección que aparece, es posible que se produzca la siguiente salida.
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]
A continuación, use !chkimg -f para corregir los daños en la memoria.
kd> !chkimg win32k -f
Warning: Any detected errors will be fixed to what we expect!
Number of different bytes for win32k: 31 (fixed)
Ahora puede desensamblar la vista corregida y ver los cambios realizados.
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
Investigación de daños en el almacenamiento y la memoria
Los archivos aleatorios y los daños en la memoria pueden ser difíciles de investigar. Una herramienta que se debe tener en cuenta en algunas situaciones es habilitar la comprobación de memoria adicional, por ejemplo, mediante el comprobador de controladores. Para obtener información sobre el comprobador de controladores, consulte Comprobador de controladores.
Para probar la memoria física, use la herramienta Diagnóstico de memoria de Windows. Su uso y otras técnicas generales se describen en Datos de pantalla azul.
Use la utilidad de análisis de disco para identificar los errores del sistema de archivos. Seleccione y mantenga pulsada (o haga clic con el botón derecho) la unidad que desea analizar y seleccione Propiedades. Seleccione Herramientas. Seleccione el botón Comprobar ahora.