
Inspirado porartículo de DailyWTF de hoy.
El autor afirma que un archivo C:\Program.exe
se ejecutaría al hacer clic en un acceso directo a, por ejemplo, C:\Program Files\Doom 2\doom2.exe -nomusic
.
Supuestamente, Windows primero intenta invocar C:\Program
con los argumentos Files\Doom 2/doom2.exe -nomusic
.
Si no C:\Program.exe
, lo intenta C:\Program Files\Doom
con los argumentos 2/doom2.exe -nomusic
.
Y si no lo hay C:\Program Files\Doom.exe\
, finalmente lo intenta C:\Program Files\Doom 2\doom2.exe -nomusic
y lo consigue.
Esto me parece una completa tontería. No puedo creer que alguna vez haya funcionado de esta manera.Un comentarista lo dice bien.:
Me resulta difícil creer que alguna versión lanzada de Windows alguna vez haya adoptado el enfoque de prueba y error descrito por OP.
Creo absolutamente que una versión lanzada de Windows tenía un comportamiento de muerte cerebral por defecto. Lo he experimentado de primera mano muchas, muchas veces.
Lo que no creo es que una versión lanzada de Windows tuvieraestecomportamiento de muerte cerebral, como se describe en el artículo. Es una falla de seguridad demasiado grande como para haber pasado desapercibida hasta que una publicación aleatoria de Daily WTF la descubrió, al menos una década después, ya que habría tenido que ser una versión de Windows anterior a XP.
Edite para mayor claridad:Así es como lo probé yo mismo.
- Copie notepad.exe a C:\program.exe
- Ejecute C:\archivos de programa\Internet explorer\iexplore.exe
- Se abre el Bloc de notas. Esto es esperado porque encuentra algo llamado C:\programa
- Mueva progam.exe a C:\archivos de programa\Internet.exe
- Ejecute C:\archivos de programa\Internet explorer\iexplore.exe
Según el autor del artículo (y este artículo de Microsoft), el bloc de notas aún debería abrirse. Pero no es así, el comando falla con este mensaje:
C:\program is not recognized as an internal or external command, operable program or batch file.
Nuevamente, no estoy debatiendo la afirmación del artículo de que se invocaría C:\program. Estoy debatiendo que Windows prueba recursivamente cada directorio hasta que encuentra una coincidencia.
Entonces, ¿alguna versión de Windows funcionó de esta manera?
Respuesta1
Todas las versiones de Windows, desde que se agregaron nombres de archivos largos, funcionan de esta manera desde Windows 95 en adelante, incluido Windows 7.
Este es el comportamientodocumentado:
EllpNombreAplicaciónEl parámetro puede serNULO. En ese caso, el nombre del módulo debe ser el primer token delimitado por espacios en blanco en el lpCommandLinecadena. Si está utilizando un nombre de archivo largo que contiene un espacio, utilice cadenas entre comillas para indicar dónde termina el nombre del archivo y comienzan los argumentos; de lo contrario, el nombre del archivo es ambiguo. Por ejemplo, considere la cadena "c:\program files\sub dir\program name". Esta cadena se puede interpretar de varias maneras. El sistema intenta interpretar las posibilidades en el siguiente orden:
c:\program.exe files\sub dir\program name c:\program files\sub.exe dir\program name c:\program files\sub dir\program.exe name c:\program files\sub dir\program name.exe
En cuanto a por qué pregunta de esta manera, para queno rompe programas que no pueden manejar espacios en nombres de archivos correctamente.
Editar
Parece que el comando "Ejecutar" no se comporta así; debe tener alguna lógica adicional agregada para manejar este caso exacto. Sin embargo, intente ejecutar desde cualquier otro lugar, incluido el uso CreateProcess
directo de la función, que es lo que usarían la mayoría de las aplicaciones para ejecutar un comando.
Vean este comportamiento en acción:
- Abrir un símbolo del sistema administrativo
- Correr:
copy c:\Windows\System32\notepad.exe c:\program.exe
- Correr:
c:\Program Files\Internet Explorer\iexplore.exe
- El Bloc de notas se abrirá y le indicará que no puede encontrarlo.
Files\Internet Explorer\iexplore.exe
- Escriba
c:\Program Files\Internet Explorer\iexplore.exe
la opción Ejecutar e IE se abrirá correctamente.
Editar 2En el caso de su C:\program files\internet.exe
ejemplo; Creo que este es el intérprete de línea de comando que se interpone en el camino. Intenta procesar y tokenizar la línea de comando en parámetros divididos por espacios. Entonces toma C:\program
como primer token y lo interpreta como el nombre del programa y el resto como parámetros.
Para una prueba, creé una pequeña aplicación que llama CreateProcess
directamente y se comporta exactamente como está documentado. Su C:\program files\internet.exe
ejemplo se iniciará C:\program files\internet.exe
. Por lo tanto, parece que el comportamiento depende exactamente de cómo se ejecuta el comando; es posible que algo esté procesando la línea de comando antes de pasarla a CreateProcess
.
Programa de ejemplo:
#include <Windows.h>
void main()
{
STARTUPINFO si = {0};
si.cb= sizeof(si);
PROCESS_INFORMATION pi = {0};
CreateProcess(NULL, "c:\\program files\\internet explorer\\iexplore.exe",
NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
}
Respuesta2
Sólo quiero agregar algo a las respuestas anteriores.
Si bien es posible forzar este comportamiento mediante esfuerzo, mala programación (no RTFM) o la tormenta perfecta no verificable causada por este programa antivirus en particular, nada habría causado el comportamiento descrito en el artículo. De ninguna manera un acceso directo creado correctamente, por ejemplo uno dirigido a "C:\Program Files\Microsoft\Office\Word.exe", entre comillas, ejecutaría C:\Program.exe. Lo mismo con Firefox. Demonios, es básicamente imposible crear un atajo del que no se pueda escapar correctamente, porque se hace de forma inteligente.
Si crea un acceso directo en su escritorio que apunte a Firefox, se escapará correctamente. Si hace clic derecho -> propiedades e intenta eliminar las comillas, las insertará automáticamente cuando presione Aplicar, incluso si C:\Program.exe existe. Cuando analiza eso, supongo que está dando preferencia a la carpeta o tratando todo antes del último '\' como parte de la ruta. Solo si inserta dos espacios entre Programa y Archivos se analizará como si apuntara a C:\Program.exe con argumentos. Si puedes editar el acceso directo en un editor de texto (no es texto sin formato), podría funcionar.
Al igual que los atajos, el cuadro de diálogo Ejecutar también analiza correctamente la cadena. Sólo en la consola de comandos de nivel relativamente bajo llamará incorrectamente a C:\Program.exe, pero no probará las otras posibilidades. Es decir, intentará llamar incorrectamente a "C:\Program.exe", pero no intentará llamar a "C:\Program Files\Internet.exe" ni a ninguna otra cosa, incluso si esas posibilidades existen. Devolverá un error que indica que no puede encontrar C:\Program.exe.
Y además de todo esto, cuando hay un Program.exe en la carpeta C:\, le avisará al iniciar y le preguntará si desea cambiarle el nombre. Esto se ha verificado para XP, Vista, Windows 7 y ahora puedo verificar Windows 8 (http://goo.gl/eeNCp).Tal vezEsto era posible en Windows 9x, pero lo dudo.
En pocas palabras, esto es obvio y ningún programador de Windows cometería este error.