
Inspirado porartigo do DailyWTF de hoje.
O autor afirma que um arquivo C:\Program.exe
seria executado ao clicar em um atalho para, por exemplo, C:\Program Files\Doom 2\doom2.exe -nomusic
.
Supostamente, o Windows primeiro tenta invocar C:\Program
com os argumentos Files\Doom 2/doom2.exe -nomusic
.
Se não houver C:\Program.exe
, ele tenta C:\Program Files\Doom
com os argumentos 2/doom2.exe -nomusic
.
E se não houver C:\Program Files\Doom.exe\
, ele finalmente tenta C:\Program Files\Doom 2\doom2.exe -nomusic
e consegue.
Isso parece um absurdo completo para mim. Não acredito que alguma vez funcionou assim.Um comentarista coloca isso bem:
Acho difícil acreditar que qualquer versão lançada do Windows tenha feito a abordagem de tentativa e erro descrita pelo OP.
Eu acredito absolutamente que uma versão lançada do Windows tinha comportamento de morte cerebral como padrão. Eu experimentei isso em primeira mão muitas e muitas vezes.
O que não acredito é que uma versão lançada do Windows tenhaessecomportamento de morte cerebral, conforme descrito no artigo. É uma falha de segurança muito grande para ter passado despercebida até que algum envio aleatório do Daily WTF a descobriu, pelo menos uma década depois, já que deveria ser uma versão do Windows anterior ao XP.
Edite para maior clareza:Veja como eu testei isso sozinho.
- Copie notepad.exe para C:\program.exe
- Execute C:\arquivos de programas\Internet Explorer\iexplore.exe
- O bloco de notas é aberto. Isso é esperado porque encontra algo chamado C:\program
- Mova progam.exe para C:\arquivos de programas\Internet.exe
- Execute C:\arquivos de programas\Internet Explorer\iexplore.exe
Segundo o autor do artigo (e este artigo da Microsoft), o bloco de notas ainda deve abrir. Mas isso não acontece, o comando falha com esta mensagem:
C:\program is not recognized as an internal or external command, operable program or batch file.
Novamente, não estou debatendo a afirmação do artigo de que C:\program seria invocado. Estou debatendo que o Windows tenta recursivamente todos os diretórios até encontrar uma correspondência.
Então, alguma versão do Windows já funcionou dessa maneira?
Responder1
Todas as versões do Windows, desde nomes de arquivos longos adicionados, funcionam dessa maneira, desde o Windows 95 até o Windows 7.
Este é o comportamentodocumentado:
OlpApplicationNameparâmetro pode serNULO. Nesse caso, o nome do módulo deve ser o primeiro token delimitado por espaço em branco no lpCommandLinecorda. Se você estiver usando um nome de arquivo longo que contenha um espaço, use strings entre aspas para indicar onde o nome do arquivo termina e os argumentos começam; caso contrário, o nome do arquivo será ambíguo. Por exemplo, considere a string "c:\arquivos de programas\subdiretório\nome do programa". Essa string pode ser interpretada de diversas maneiras. O sistema tenta interpretar as possibilidades na seguinte ordem:
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
Quanto ao porquê de perguntar desta forma - para quenão quebra programas que não conseguem lidar corretamente com espaços em nomes de arquivos.
Editar
Parece que o comando "Executar" não se comporta assim - deve ter alguma lógica extra adicionada para lidar com esse caso exato. No entanto, tentar executar de qualquer outro lugar - incluindo usar a CreateProcess
função diretamente, que é o que a maioria dos aplicativos usaria para executar um comando.
Veja esse comportamento em ação:
- Abra um prompt de comando administrativo
- Correr:
copy c:\Windows\System32\notepad.exe c:\program.exe
- Correr:
c:\Program Files\Internet Explorer\iexplore.exe
- O bloco de notas será aberto informando que não foi possível encontrar
Files\Internet Explorer\iexplore.exe
- Digite
c:\Program Files\Internet Explorer\iexplore.exe
na opção Executar e o IE abrirá corretamente.
Editar 2No caso do seu C:\program files\internet.exe
exemplo; Acredito que este seja o interpretador de linha de comando atrapalhando. Ele tenta processar e tokenizar a linha de comando em parâmetros divididos por espaços. Portanto, ele é C:\program
o primeiro token e o interpreta como o nome do programa e o restante como parâmetros.
Para teste criei um pequeno aplicativo que chama CreateProcess
diretamente e se comporta exatamente como documentado. Seu C:\program files\internet.exe
exemplo será lançado C:\program files\internet.exe
. Portanto, parece que o comportamento depende exatamente de como o comando é executado - algo pode estar processando a linha de comando antes de passá-la para CreateProcess
.
Exemplo de programa:
#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);
}
Responder2
Eu só quero acrescentar algo às respostas anteriores.
Embora seja possível forçar esse comportamento por meio de esforço, programação incorreta (não RTFM) ou tempestade perfeita não verificável causada por esse programa antivírus específico, nada teria causado o comportamento descrito no artigo. De forma alguma um atalho criado corretamente, por exemplo, um que tenha como alvo "C:\Arquivos de Programas\Microsoft\Office\Word.exe", entre aspas, executaria C:\Program.exe. O mesmo acontece com o Firefox. Inferno, é basicamente impossível criar um atalho que não possa ser escapado corretamente, porque isso é feito de forma inteligente.
Se você criar um atalho na sua área de trabalho apontando para o Firefox, ele será escapado corretamente. Se você clicar com o botão direito -> propriedades e tentar remover as aspas, elas serão inseridas automaticamente quando você clicar em aplicar, mesmo que C:\Program.exe exista. Ao analisar isso, acho que está dando preferência à pasta ou tratando tudo antes do último '\' como parte do caminho. Somente se você inserir dois espaços entre Programa e Arquivos ele será analisado como apontando para C:\Program.exe com argumentos. Se você puder editar o atalho em um editor de texto (não é texto simples), pode funcionar.
Assim como os atalhos, a caixa de diálogo Executar também analisa corretamente a string. Somente no console de comando de nível relativamente baixo ele chamará incorretamente C:\Program.exe, mas não tentará as outras diversas possibilidades. Ou seja, ele tentará chamar incorretamente "C:\Program.exe", mas não tentará chamar "C:\Arquivos de Programas\Internet.exe" ou qualquer outra coisa, mesmo que essas possibilidades existam. Ele retornará um erro dizendo que não foi possível encontrar C:\Program.exe.
E além de tudo isso, quando houver um Program.exe na pasta C:\, ele avisará na inicialização e perguntará se deseja renomeá-lo. Isso foi verificado para XP, Vista, Windows 7 e agora posso verificar o Windows 8 (http://goo.gl/eeNCp).Talvezisso era possível no Windows 9x, mas duvido.
Resumindo, isso é óbvio e nenhum programador do Windows cometeria esse erro.