Red de conocimiento informático - Material del sitio web - Cómo usar windbg para interrumpir mientras se carga el controlador

Cómo usar windbg para interrumpir mientras se carga el controlador

Primero, hablemos de la depuración de la capa de aplicación. Al depurar un programa ejecutable de Windows, podemos encontrar la dirección de la primera instrucción agregando ImageBase y AddressOfEntryPoint al encabezado del archivo PE. Después de desconectarse en esta dirección, el programa de destino se desconectará en el punto de entrada. Sin embargo, este método no es útil para la depuración de controladores. Esto se debe a que el programa ejecutable se carga primero en su propio espacio de direcciones privado, por lo que no pueden ocurrir conflictos de direcciones. El controlador se ejecuta en el kernel y todos los controladores comparten el mismo espacio de direcciones. Por lo tanto, es necesario restablecer la dirección base.

1. Utilice el comando bu para retrasar los puntos de interrupción.

Como se mencionó anteriormente, bu se puede utilizar para establecer puntos de interrupción en símbolos. El objetivo de usar bu es que windbg nos permite establecer puntos de interrupción en símbolos incluso si el controlador de destino aún no está cargado. Cuando se carga un nuevo controlador, windbg comprueba si el controlador contiene funciones que establezcan puntos de interrupción diferidos. Si lo encuentra, reemplaza el punto de interrupción con una dirección y establece el punto de interrupción nuevamente. El controlador de pruebas es TestDriver.sys.

[plain] ver Plaincopyprint?

0: kd> .sympath

La ruta de búsqueda de símbolos es: E:\Symbol\windbg Symbols;E:\ Código \Vc_code\Ring3Ring0\Driver\objchk_wxp_x86\i386

La ruta de búsqueda de símbolos extendida es: E:\Symbol\windbg símbolos;E:\code\vc_code\ Ring3ring0\driver\objchk_wxp_x86\i386

0: kd> .srcpath

La ruta de búsqueda de origen es: E:\Code\Vc_code\Ring3Ring0\Driver

En el cliente VMware, instale el controlador y haga clic en net start Después de TestDevice, el sistema se desconectará.

[plain]¿Ver Plaincopyprint?

Punto de interrupción 0 hit

TestDriver!DriverEntry:

f8c4ee10 8bff mov edi,edi

Si el controlador que estamos depurando no tiene DriverEntry, entonces no es DriverEntry. DriverEntry no es una función de entrada, por lo que no es necesario descifrar los símbolos. Sin embargo, podemos utilizar el método "módulo en compensación". Suponiendo que el desplazamiento de la función de entrada de TestDriver es 0xFB4, entonces bu TestDriver+0xFB4 es suficiente.

2. Interrumpir antes de que el sistema llame a DriverEntry.

Ahora veamos el programa que interrumpe en DriverEntry. ¿Podemos interrumpir antes de ingresar a DriverEntry?

Primero, vemos la pila actual a través de dv y esp

[plain] ver Plaincopyprint?

1: kd> dv

pDriverObject = 0x81f346e8

pRegistryPath = 0x81865000 " \REGISTRY\MACHINE\SYSTEM\ControlSet001\Services\TestDevice"

estado = 0n8

1:kd> r esp

esp =f8af9c88

1: kd>.dd f8af9c88 L8

f8af9c88 80582377 81f346e8 81865000 00000000

f8af9c98 b2926cf4 00000000 000000001 8 00000000

dd solo comando Para mostrar parámetros, es mejor usar esp.

El siguiente paso es el comando ln

[plain] view Plaincopyprint?

1: kd> ln 80582377

(80581d0a) nt!IopLoadDriver+ 0x66d (80581d0a | ) nt !IopLoadDriver+ 0x66d | (80581d0a) nt!IopLoadDriver+ 0x66d | 0x66d | (80582442) nt!IopLoadUnloadDriver

La dirección del remitente está en nt!IopLoadDriver+0x66d, así que desmóntelo directamente para ver dónde se llama DriverEntry

[plain] ver Plaincopyprint ?

0: kd> bu TestDriver!DriverEntry

0: kd> bl

0 eu 0001 (0001) (TestDriver!DriverEntry)

1: kd> u nt!IopLoadDriver+0x660 

nt!

8058236a 8b7d80 mov edi,dword ptr [ ebp- 80h]

8058236d ffb570ffffff push dword ptr [ebp-90h]

80582373 57 push edi

80582374 ff572c call dword ptr [edi+2Ch]

80582377 3bc3 cmp eax,

80582379 8b8d68ffffff mov ecx,dword ptr [ebp-98h]

8058237f 8945ac mov dword ptr [ebp-54h],eax

80582382 8901 mov dword ptr [ecx],eax</pre>

 

 

 

 

 

 

0x80582377 no es! IopLoadDriver+0x66d. La última instrucción de llamada ocupa 3 bytes. Por lo tanto, interrumpimos en nt!IopLoadDriver+0x66a para hacerlo antes de ingresar DriverEntry.

3. Uso de excepciones de eventos

Echemos un vistazo a qué excepciones de eventos se proporcionan en el sistema.

¿Ver Plaincopyprint directamente en sx

[plain]?

1:kd>sx

ct - crear hilo - ignorar

et - salir del hilo - ignorar

cpr - crear proceso - ignorar

epr - salir del proceso - ignorar

ld - cargar módulo - salida

ud - descargar módulo - ignorar

Ser - Sistema - Ignorar

ser - Sistema - Salida

ud - Sistema - Descargar módulo - ignorar

ser - Sistema error - ignorar

ibp - Punto de interrupción inicial - romper

iml - Carga inicial del módulo - ignorar

out - Salida depurada - salida

Aquí, configuraremos el evento de carga del módulo para que se interrumpa, sxe -set enable sxd -set enable sxi -set ignore sxn -set output

[plain] view Plaincopyprint?

1: kd > sxe ld

1: kd>sx

ct - crear hilo --ignorar

et - salir del hilo --ignorar

cpr - crear proceso - ignorar

epr-salir del proceso - ignorar

módulo de carga ld - interrumpir

módulo de descarga ud - ignorar

ser - cargar módulo--interrupción

ld - descargar módulo--interrupción

ud - descargar módulo--interrupción ignorada

ser - error del sistema - ignorar

ibp - punto de interrupción inicial - interrupción

estoy interrumpido

iml - carga inicial del módulo - ignorar

out - salida de depuración - salida

Cargando nuestro controlador,

El sistema se interrumpirá al cargar el módulo

Luego, encontraremos la biblioteca del módulo y la interrumpiremos. en el punto de entrada.

Luego buscamos la dirección base del módulo y nos detenemos en el punto de entrada.

[plain] ver Plaincopyprint?

1: kd> lm n

nombre del módulo inicio fin

[...]

f8b9c000 f8b9d100 WMILIB WMILIB.SYS

f8b9e000 f8b9f580 intelide intelide.

f8ba0000 f8ba1700 dmload dmload.sys

f8ba4000 f8ba5280 vmmouse .sys

f8bb0000 f8bb1100 swenum swenum.sys

f8bb6000 f8bb7280 USBD USBD.SYS

f8bba000 f8bbbf00 Fs_Rec Fs_Rec.

f8bbe000 f8bbf080 Beep Beep.

F8BC2000 F8BC3080 MNMDD 9A80 parvdm ParVdm.SYS

f8bfc000 f8bfde00 vmmemctl vmmemctl.SYS

f8bfc000 f8bfde00 vmmemctl.

f8c4e000 f8c4f300 TestDriver TestDriver.sys

[...]

Analizar el archivo pe

[plain] ver Plaincopyprint?

1: kd> !dh -a f8c4e000

Tipo de archivo:

VALOR DEL ENCABEZADO DE ARCHIVO

Máquina 14C (i386)

6 número de secciones

5077C38E marca de fecha y hora viernes 12 de octubre 15:15:26 2012

0 puntero de archivo apuntando a la tabla de símbolos

0 número de símbolos

E0 tamaño de archivo de encabezado opcional

p>

102 características

Ejecutables

Máquina de palabras de 32 bits

Valores de encabezado opcionales

10B magic #

Versión del vinculador 9.00

Tamaño de código C00

Tamaño de datos inicializados 280

Tamaño de datos no inicializados 0

>< strong> Dirección de punto de entrada FB4

base de código 480

----- nuevo -----

[.. .]

Entonces bp TestDriver+0xFB4 hace que el sistema se rompa en el punto de entrada de nuestro controlador.