Cómo usar windbg para interrumpir mientras se carga el controlador
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+0x660nt!
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.