En varias oportunidades he recibido consultas acerca de cómo instalar y empezar a utilizar WinDbg. Por ello, hoy voy a mostrarte cómo configurar un entorno con WinDbg y máquinas virtuales para realizar debugging de drivers o código corriendo en el espacio de kernel de Windows.
En este caso voy a utilizar mi máquina host con Windows 10 para realizar debugging sobre máquinas virtuales corriendo bajo VMWare. Cabe la posibilidad, también, de usar una máquina virtual como debugger y una segunda como target, pero no vamos a cubrir ese caso hoy.
El primer paso, entonces, consiste en la descarga e instalación de WinDbg, que puede realizarse desde aquí. Vamos a seleccionar la instalación de las herramientas de depuración, para no descargar otros componentes que no necesitamos:
Luego de la descarga, ejecutamos el setup. Dependiendo de qué tan actualizado esté el host, puede que sea necesario descargar algunos paquetes de .NET Framework o actualizaciones de Windows. En la instalación, elegimos solamente “Debugging Tools”:
Una vez instalado, ahora vamos a centrarnos en la configuración de las máquinas virtuales que van a ser debuggeadas. El primer paso consiste en generar una entrada en la tabla de booteo con opciones de debugging activadas. Para ello, vamos a tomar una máquina guest con Windows 7, que cuenta con el comando bcdedit para realizar estas tareas.
La ejecución del comando sin argumentos nos muestra la configuración del boot manager y cada una de las entradas en la tabla de booteo (inicialmente existe solo una entrada). Luego, lo más sencillo para generar una nueva entrada con debugging habilitado consiste en copiar la primera entrada y modificarla:
Después de la copia, a la cual se le ha dado el nombre de “Debug Activado”, se habilita el modo debug. Si consultamos ahora las entradas de la tabla, vemos que aparece una nueva. Por último, puede usarse también el comando bcdedit para configurar la comunicación entre el host con WinDbg y la máquina virtual. Voy a mostrarte, sin embargo, otra forma de hacerlo: si presionas en tu virtual la combinación de teclas “Win+R” y escribes “msconfig” en el cuadro de diálogo, vas a acceder a ciertas configuraciones de arranque de Windows. En la solapa de “Arranque” podrás editar las opciones avanzadas, como se ve en la imagen:
Nuestro host y la máquina virtual van a comunicarse por el puerto serie COM2 (o el que elijamos) sincronizados a una velocidad de 115200. Recomiendo que no se cambie la velocidad, pero que uses el puerto COM2 en lugar de COM1. Dado que es muy probable que la virtual no tenga puerto serie, debemos agregar uno. Para VMWare puede hacerse desde la configuración:
Debemos elegir las opciones tal como aparecen en la imagen, y es importante que le demos el nombre que allí aparece: “\\.\pipe\com_2”. Ya ha quedado todo configurado y el siguiente paso consiste en reiniciar la VM y bootear en modo debug:
Una vez seleccionada la opción, no notaremos ninguna diferencia en el arranque del sistema. Cuando ya estemos en el escritorio, podremos salvar un snapshot de la VM o preparar el entorno que queremos debuggear. Cuando estamos listos, vamos al host y abrimos WinDbg para iniciar la sesión de debugging. Del menú “Archivo” seleccionamos “Kernel Debugging” y en la pestaña COM completamos como se ve en la imagen:
Cuando le damos a “OK”, WinDbg se conectará, pero no podremos interactuar con la virtual hasta que detengamos su ejecución en alguna instrucción. Para ello, presionamos “Ctrl+Pausa” (o menú “Debug>Break”). Si vamos a la virtual ahora veremos que está congelada, no podemos mover el mouse ni obtenemos respuesta al teclado: esto es normal, ya que la VM está detenida en alguna instrucción. Del lado del host veremos algo similar a esto:
De la última línea se observa que la ejecución se ha detenido mediante el uso de una int 3, que se ha detenido en memoria del kernel y que el direccionamiento es de 64 bits. Debajo está la consola con la cual se puede empezar a enviar comandos a WinDbg.
Windows XP
En el caso de que necesitáramos debuggear una virtual con WinXP, todos los pasos son iguales, a excepción de la configuración del booteo. En lugar de bcdedit (que no está disponible en Windows XP) editaremos manualmente el archivo “C:\boot.ini”. Ese archivo está oculto, por lo que deberíamos modificar las opciones de carpeta para que nos muestre los archivos ocultos y para que no se oculten los archivos protegidos del sistema.
Entonces, copiamos la primera entrada (que aparece luego de “[operating systems]”), le cambiamos el nombre para no confundirla con la otra, y agregamos las opciones de debug. Basta con guardar el archivo y reiniciar el sistema para ver las nuevas opciones de booteo:
Siguiendo estos pasos podrás utilizar sin problemas las herramientas de depuración en el espacio de kernel de Windows. ¿Qué esperas para probar este proceso?