martes, enero 23, 2007

Ese "extraño" mensaje: La memoria no se puede "read"

Uno de los problemas que más recibo y que pienso que más despista a la gente es un error del tipo "La instrucción en "0xnúmero_hexadecimal" hace referencia a la memoria en "0xnúmero_hexadecimal". La memoria no se puede "written"/"read". Observe la siguiente imagen que ilustra el error:

Mensaje de error de aplicación

Mucha gente asocia este mensaje de error con un problema con la memoria RAM, pensando que pudiera estar dañada o que quede poca disponible. Probablemente el problema no se deba a un módulo defectuoso de RAM.

Ese mensaje de error es la manera "fea" que tiene Windows XP de decir que ha ocurrido una excepción en modo usuario porque alguna aplicación o componente ha intentado acceder a una posición de memoria que no debería (por ejemplo, mediante un puntero erróneo). Esto se denomina infracción de acceso y se identifica mediante el código de error c0000005.

Veamos un poco qué ocurre por dentro de Windows cuando sucede un error de este tipo

Windows debe tener un mecanismo interno que le permita actuar de algún modo cuando ocurra una excepción no controlada en modo usuario. Para simplificar las cosas, supongamos que se trata de un bloque try convencional que puede lanzar la excepción mediante la función UnhandledExceptionFilter. En este momento, Windows examina el Registro para saber qué hacer una vez ha ocurrido un error de aplicación. La clave HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug contiene un valor Auto que le indica al sistema si debe iniciar automáticamente el depurador por defecto del sistema, definido éste en el valor Debugger. El depurador por defecto de Windows XP es Dr Watson.


Nota: Si instala alguna aplicación relacionada con el desarrollo, es probable que ésta instale su propio depurador. Quizá también lo establezca automáticamente como depurador por defecto del sistema.


En este momento se carga la dll Faultrep.dll que examina el Registro para saber cómo desea el usuario que se le informe de los errores de aplicación. La clave de Registro HKLM\SOFTWARE\Microsoft\PCHealth\ErrorReporting contiene la información accesible desde la interfaz gráfica de Windows en el panel Informe de errores, situado en la pestaña Opciones avanzadas de Propiedades de sistema. Observe la siguiente imagen:

Panel Informe de errores de Windows XP

Si se desea que se muestre una intuitiva interfaz gráfica (valor ShowUI distinto de cero), Windows cargará el proceso \WINDOWS\system32\Dwwin.exe en memoria, que es el que muestra la típica pantalla de error de aplicación de Windows XP, mostrada en la siguiente imagen:

Típica ventana de error de aplicación de Windows XP

Si el valor ShowUI es igual a cero, siempre obtendrá la pantalla mostrada al principio del artículo, que no ofrece la posibilidad de ver el módulo afectado por el error ni de enviar la información a Microsoft. Dependiendo de la aplicación que haya generado el error, es posible que se le muestre esta pantalla pese a que utilice la configuración por defecto. No debe preocuparse, se trata del mismo problema: una excepción no controlada en modo usuario.

¿Cómo solucionar el problema?

En primer lugar debe asegurarse de que el sistema esté libre de virus y ficheros espía. Un sistema infectado puede producir excepciones de este tipo. En segundo lugar, revise la esquina superior izquierda del título de la ventana de error, es posible que se haga referencia a un fichero de terceros conocido, en cuyo caso habría que contactar con el fabricante para informarse de si es un problema conocido o de si existe alguna solución al respecto.

Si el proceso referenciado fuese demasiado inespecífico (como por ejemplo Explorer.exe), no queda más remedio que hacer pruebas iniciando el sistema en Modo seguro o realizar sucesivos inicios limpios hasta dar con el posible culpable.

También es posible examinar la información registrada por el depurador de programa.

Nota: Si el proceso referenciado fuese Iexplore.exe, es posible que algún añadido (plug-in) sea el que ha generado la excepción. Si usa Internet Explorer 7, ejecute el navegador sin complementos y observe si se reproduce el problema. Para ejecutar el navegador sin complementos abra Inicio, Ejecutar, escriba "%ProgramFiles%\Internet Explorer\iexplore.exe" -extoff y pulse Aceptar.


En este caso deberá pulsar sobre Cancelar en la ventana de error para depurarlo. Abra Inicio, Ejecutar, escriba "%AllUsers%\Datos de programa\Microsoft\Dr Watson" (con comillas) y pulse Aceptar. Observará dos ficheros: Drwtsn32.log contiene un reporte con todos los errores de aplicación que han sido administrados por Dr Watson. Los últimos errores recibidos se sitúan al final de la lista. User.dmp suele ser un pequeño volcado de la memoria en el momento del error. Este fichero se sobreescribe cada vez que ocurre un error de aplicación. Puede cargar este fichero en cualquier depurador como Windbg (http://www.microsoft.com/whdc/devtools/debugging/default.mspx) para examinarlo.

Espero que este artículo haya aclarado algunas dudas acerca de esa "extraña" ventana que nos indica que la memoria no se puede "read" (o "written") y que nos podemos encontrar cuando nos topamos con software mal diseñado en nuestro sistema.

miércoles, enero 17, 2007

El caso de la instalación fallida de antivirus

En cierto foro me encontré con un problema bastante interesante. Cualquier software antivirus que el usuario afectado intentaba instalar en su sistema, Windows Installer devolvía el número de error 1304, que quiere decir, literalmente, "Error al escribir el archivo, verifique que tenga acceso a ese directorio". En un principio este mensaje puede hacer pensar que se trata de un problema de permisos, pero, como descubrirá más adelante, el causante era bien distinto.

En primer lugar examiné el fichero de reporte de instalación que genera AVG al ser instalado, el fichero Avg7inst.log. En él busqué la línea que detalla el problema concreto de instalación, representada en la siguiente imagen:

¿No puede encontrar el archivo o el directorio? Extraño mensaje de error, sin duda.

Como ve, el mensaje de error es bastante despistante. El programa de instalación no pudo crear lo que presumiblemente es uno de los ficheros ejecutables esenciales para el funcionamiento del antivirus porque no encontró el fichero o el directorio. ¿? Pero el directorio se ha creado correctamente, como así referencia el reporte. ¿Qué ocurre entonces? El problema no parecía estar relacionado con los permisos.

¿Cómo averiguar cuál era el causante?

Ante este mensaje de error durante la instalación, no me quedó otra opción que examinar detalladamente la instalación del antivirus hasta llegar al punto en el que se trata de instalar el fichero Avgamsvr.exe. Para ello, pedí al usuario un fichero PML generado por Process Monitor. Process Monitor (http://www.microsoft.com/technet/sysinternals/processesandthreads/processmonitor.mspx), es una excelente herramienta que monitoriza los accesos al registro y a archivos del disco que realizan los procesos del sistema. Combina lo mejor de Regmon, Filemon y Process Explorer en una sola herramienta.

Al abrir el fichero PML y filtrar adecuadamente, me encontré con un código de error algo más esclarecedor:

El error que devolvió el controlador de Process Monitor sin duda era más explicativo.

El código Sharing Violation (infracción al compartir) es un código de error muy común en Windows. Ocurre cuando algún proceso intenta modificar de alguna manera algún fichero que está siendo utilizado por otro proceso. Pero, ¿cuál podría ser el proceso que estaba manejándolo?

Es bastante extraño que un fichero que acaba de ser creado esté siendo accesado por el sistema operativo. Quise echar un vistazo a la pila de llamadas del hilo del proceso Avgsetup.exe que estaba funcionando en el momento de recibir el mensaje de error. Me encontré con esto:

Este era el causante de la instalación fallida.

Si lee la información de la pila, verá que el hilo de la instalación en el punto concreto de la creación del fichero estaba funcionando en modo kernel (todas las funciones tienen una K rosa a la izquierda). En concreto, la función ZwSetSystemInformation del fichero Ntoskrnl.exe llama a un extraño fichero M_hook.sys, residente en el directorio %AppData%\hidires. La función ZwSetSystemInformation no está públicamente documentada, pero su prefijo (Zw) me indica que es una función relacionada con los servicios del sistema que acceden en modo kernel (y por tanto no hay validación de parámetros, al contrario de las que tienen prefijo Nt).

Ya se encontró al culpable

El fichero M_hook.sys tiene toda la pinta de tratarse de un rootkit instalado por algún troyano. Su objetivo debe de ser esconderse de los mecanismos internos del sistema operativo y bloquear la creación en el disco de ficheros relacionados con software antivirus conocido. Ante un sistema comprometido de esta manera, la única solución que garantice que no resta código malicioso en el disco es reinstalar el sistema operativo de cero.

Espero que les haya parecido interesante el artículo. Para evitar este tipo de problemas, recomiendo mantener el sistema al día, trabajar con un usuario con los menores privilegios posibles, activar un antivirus actualizado así como un cortafuegos y tener mucho cuidado con el software que se descarga de Internet, especialmente si proviene de sitios no oficiales o de redes P2P.

domingo, enero 07, 2007

¿Sabía que...? [IV]

En Windows Vista existe la posibilidad de mostrar un menú contextual más amplio con algunas funciones añadidas muy interesantes. Si al hacer clic con el botón derecho del mouse sobre cualquier elemento mantiene pulsada la tecla Shift (Mayúsculas), en el menú contextual aparecerán -entre otras- las opciones Agregar a Inicio rápido, Copiar como ruta de acceso y, si se tratara de una carpeta, Abrir ventana de comandos aquí. Las opciones que sólo aparecen al pulsar simultáneamente Shift se definen en el propio Registro de Windows en la subclave Shell del elemento en cuestión. En cada una de estas subclaves existirá un valor alfanumérico de nombre Extended, sin contenido alguno.

lunes, enero 01, 2007

MVP por un año más

Microsoft me ha concedido el galardón MVP por un año más. Para mí es un gran orgullo pertenecer a ese grupo de personas que tan gran labor realizan en las comunidades técnicas. Esto no hace sino motivarme a aprender cada día un poco más y seguir aportando mis conocimientos con el objetivo de ayudar a los demás. ;-) Por cierto, ¡deseo un feliz año nuevo a todos los lectores de este blog! :-)