miércoles, diciembre 06, 2006

Un filtro de páginas web algo molesto

Hace unos meses me encontré con un problema bastante interesante en cierto grupo de noticias: Tras instalar y desinstalar un producto de terceros de filtrado de contenido web, aparecía una página web cada vez que se abría un navegador de Internet. La página indicaba lo siguiente:

Your subscription isn't valid. We found the following error:

The OrangeBox Web Home service isn't running in Windows on your computer. Please reboot your computer. If this message occured after a reboot of the computer, contact your administrator.


En este artículo verá cómo llegué a la causa de la aparición de la molesta página web.

En primer lugar revisé la configuración del navegador para ver si se había agregado algún tipo de proxy a la conexión a Internet. Pero no, no se había agregado ningún proxy; además, la lista de procesos observada desde Process Explorer indicaba que no había ningún proceso residente que pudiera estar interceptando las salidas HTTP de la máquina. La causa debía estar entonces en el kernel de Windows, específicamente en algún controlador de arranque (boot driver) o similar que hubiera instalado el producto y que estaría interceptando silenciosamente las conexiones web del sistema.

En aquel momento no tenía disponible otra máquina física libre para realizar una sesión remota de depuración de kernel (live kernel debugging) y tampoco tenía muchas ganas de realizarla desde una máquina virtual. :-P Así que me dispuse a volcar la memoria del sistema afectado y "escudriñar" entre todos los datos intentando buscar alguno que me diera algo de luz sobre el problema. ¿Qué dato podría utilizar como guía? Decidí anotar la palabra "webfilter", que es la que aparecía en la URL de la barra de direcciones del navegador cada vez que se intentaba abrir una página web.

Generando un volcado de memoria

Para generar manualmente un volcado de memoria en un sistema NT se puede emplear el método descrito en este artículo de la KB de Microsoft. El controlador i8042prt.sys busca el valor "CrashOnCtrlScroll" durante su carga; si este valor tiene contenido "1", el controlador se mantiene "escuchando" en su ISR (Interrupt Service Routine) esperando la combinación de teclas Ctrl derecho+Bloq. desplazamiento+Bloq. desplazamiento. Esto hace que la función I8xProcessCrashDump haga una llamada al kernel, concretamente a la función KeBugCheckEx del fichero Ntdll.dll, lo que genera finalmente el volcado de memoria y posterior reinicio del sistema (si así está configurado en el panel Inicio y recuperación de Propiedades del sistema).

Nota: Cuando se produce un volcado de memoria, Windows examina antes el tipo de volcado que quiere el usuario. Esto se puede manejar desde el panel Propiedades del sistema, pestaña Opciones avanzadas, botón Configuración (apartado Inicio y recuperación), apartado Escribir información de depuración.

En este caso la opción elegida fue Volcado de memoria completa, lo que genera un fichero de volcado del tamaño de la RAM física del equipo. Como este fichero puede resultar demasiado grande, no siempre es necesario realizar un volcado completo de RAM, y en muchas ocasiones esto no aporta información relevante sobre la causa del problema.


Analizando con Windbg

Windbg es un depurador de Microsoft que puede ser descargado de forma gratuita desde la dirección: http://www.microsoft.com/whdc/devtools/debugging/default.mspx. Antes de utilizarlo, es importante que se configuren correctamente los símbolos del sistema.

Para configurar los símbolos en Windbg, haga clic sobre File, Symbol File Path. Si dispone de conexión a Internet durante la sesión de depuración, esta línea estándar hará que Windbg descargue al directorio C:\Websymbols los símbolos apropiados para su sistema operativo según los vaya necesitando:

SRV*c:\websymbols*http://msdl.microsoft.com/download/symbols


Una vez que los símbolos estaban correctamente configurados, abrí el fichero de volcado desde Windbg pulsando sobre File, Open Crash Dump.

Con el fichero de volcado ya cargado en Windbg, podemos examinar la pila de llamadas en el momento que se generó el volcado de memoria. En este caso esto no resultó de demasiada utilidad, puesto que en el momento que generé manualmente el volcado de memoria el sistema estaba en estado inactivo y funcionando correctamente.

Para buscar cadenas dentro de la memoria del volcado empleé el comando "s", con el parámetro -a, que permite buscar cadenas ASCII, y con la cadena "webfilter" como parámetro de búsqueda. F7000000 y FAAAAAAA son las direcciones de inicio y fin donde quise realizar la búsqueda. Son las direcciones donde Windows comienza a cargar los boot drivers, lo que evita que el depurador tarde demasiado tiempo buscando en porciones de memoria no relevantes en este caso concreto.

El resultado de la búsqueda fue esclarecedor, en la dirección de memoria F9c8b463 estaba la cadena "webfilter/licerr..." ¡justamente la dirección web que aparecía al cargar cualquier página!

Cadena webfilter/licerr, parte de la URL que se mostraba en el navegador web.

Seguidamente quise saber a qué cosa pertenecía esa cadena. El comando !address permite realizar eso mismo:

Ya lo tenemos, el controlador Difdrv.sys es el que generaba esa molesta página web.

Como ve, era el controlador Difdrv.sys, instalado por el filtro de terceros, el que hacía aparecer esa página web de error cada vez que se accedía a Internet. En su código observé llamadas a Difsvc.exe, el servicio instalado por el filtro, con el objeto de comprobar que efectivamente estuviera iniciado. Si no lo estaba, aparecía otra web indicando de dicho percance.

Espero que les haya parecido interesante el artículo. La aplicación de filtrado descrita aquí (OrangeBoxWeb) no es demasiado conocida y las referencias son prácticamente nulas en cualquier buscador de Internet, así que espero que el artículo les permita solucionar el problema si lo experimentan en sus sistemas o, por qué no, les sirva para comenzar a familiarizarse con Windbg, un buen depurador de Microsoft.