martes, febrero 20, 2007

Una curiosidad sobre la caja Ejecutar

En uno de los foros en los que participo, un usuario tenía la siguiente inquietud: ¿Por qué si en una ventana de comandos se escribe "msconfig" no se reconoce el comando y, en cambio, desde Inicio, Ejecutar, sí se ejecuta correctamente dicha herramienta?

El secreto está en que la caja Ejecutar del menú Inicio invoca a una función muy específica (y útil): ShellExecuteEx. Es ella la que realiza todo el trabajo "sucio" de encontrar lo que se ha escrito en la caja Ejecutar. Simplificando detalles que no son relevantes en el tema de este artículo, en primer lugar ShellExecuteEx va a mirar en la clave de Registro HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths. Las aplicaciones pueden incluir las rutas de sus ejecutables en esta clave sin necesidad de manipular la variable de entorno Path. En el caso de que no haya encontrado el ejecutable en la clave anterior, la función ShellExecuteEx se dispondrá a examinar la variable de entorno Path del sistema operativo. Esto lo hace llamando a la función PathFindOnPath, públicamente documentada. Esta función hace uso a su vez de FindFirstFileEx, FindNextFile y FindClose para encontrar el archivo en cada ruta que encuentre en la variable antes mencionada. Estas funciones residen en Kernel32.dll, por lo que realizan la búsqueda utilizando para ello ciertas funciones del núcleo de Windows que no están públicamente documentadas. Desde símbolo de sistema sólo se examina el contenido de la variable de entorno Path para buscar un comando no interno. Como la ruta de Msconfig.exe no está por defecto en el contenido de la variable Path, aparece un mensaje de error indicando que el comando no ha sido reconocido.

Como siempre, muchos virus se aprovechan de esto y redireccionan el contenido de la clave HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths para que apunte a su código malicioso. Así, el usuario, que inocentemente trata de ejecutar Regedit o Msconfig para reparar su sistema, acaba ejecutando un troyano o el ejecutable de un gusano, por ejemplo.

Por cierto, las funciones FindFirstFileEx, FindNextFile y FindClose antes mencionadas las utiliza Windows en muchísimos contextos. Como curiosidad, en el artículo donde comentaba cómo Agregar o quitar programas obtenía la información sobre el tamaño de los programas instalados, el módulo Appwiz.cpl llama a estas funciones si no hay información en la caché o ésta se ha corrompido.

2 comentarios:

Anónimo dijo...

Hola Daniel quiero saber si me puedes ayudar, creo que por haber usado mal el ccleaner he borrado la ruta para poder desfragmentar mi computador, quixas sea por otra razón que no puedo llegar al desfragmentador. Espero que me puedas ayudar.
Saludos
Reygadas
http://reygadas.blogspot.com

Anónimo dijo...

disculpa necesito que me ayudes en algo relacionado en como hacer para listar el software que tengo instalado en mi computador por medio de codigo fuente(este codigo no importa en que se haya realizado,lo que pasa es que necesito una idea de como hacerlo )por tu atencion muchas gracias ojala me puedas colaborar.

Atte John carlos Burbano
johncar55@yahoo.es