Por que um programa chamado "C: \ Program" influencia outros programas?

15

Hoje, do nada, um arquivo chamado Programapareceu na raiz C:\e, ao fazer login no sistema, um pop-up mostra uma mensagem:

Aviso de nome de arquivo

Há um arquivo ou pasta no seu computador chamado "C: \ Program" que pode fazer com que certos aplicativos não funcionem corretamente. Mudar o nome para "C: \ Program1" resolveria o problema. Deseja renomeá-lo agora?

Embora a mensagem seja auto-explicativa, pergunto-me por que esse arquivo pode ter uma influência tão grande? De fato, alguns dos programas (talvez todos, não verifiquei) localizados em C:\Program Files...não estavam iniciando. Eu posso entender como esse arquivo pode ser criado (por exemplo, tentando gravar na pasta, C:\Program Files\Something...mas sem aspas), mas eu mal entendo como isso pode afetar outros programas.

Konrad Kokosa
fonte
1
Tem certeza de que esta foi uma mensagem gerada pelo Windows?
Ramhound
1
Pois é, o dobro verificado a partir de Processo Exploer, foi um diálogo de explorer.exe
Konrad Kokosa
2
Parece incompleto, nenhum programa (fora de alguns selecionados) deve ser instalado em outro lugar que não seja Program Files* para o consumidor comum. Mas eu acho que é porque a correspondência incorreta de uma pesquisa pode encontrar isso em vez de Program Files.
Nerdwaller

Respostas:

26

Ele tem uma influência tão grande devido a uma fraqueza conhecida na API do Win32.

Os programas são gerados no Win32 por meio da CreateProcess()chamada do sistema. Pode ser usado de várias maneiras. Pessoas provenientes de planos de fundo Unix, Linux ou OS / 2 geralmente pensam nisso como tendo dois argumentos separados para o programa (arquivo de imagem) gerar e a cauda do comando passar para o novo processo, porque nomes de arquivos e argumentos vetores / comandos caem Existem duas coisas distintas nas APIs desses sistemas operacionais. Mas, na verdade, a chamada do sistema pode ser invocada de uma forma alternativa, com o nome e os argumentos do programa reunidos em uma grande cadeia. CreateProcess()tentará separar o nome do arquivo do programa da cauda do comando.

O problema é que ele faz isso dividindo progressivamente a cadeia em dois em cada caractere de espaço sucessivo, até que a parte esquerda corresponda a um arquivo ou diretório. Muitos programas Win32 tentam passar seqüências de caracteres como C:\Program Files\Contoso\TakeOver.exe StackExchange.coma chamada do sistema. Isso executará o programa certo - C:\Program Files\Contoso\TakeOver.exe- com o comando certo - StackExchange.com- até o ponto em que uma pessoa obviamente perigosa aparecer e criar um C:\Programarquivo como você.

Nesse ponto, a chamada do sistema acaba tentando executar o arquivo de imagem do programa C:\Programcom a cauda do comando Files\Contoso\TakeOver.exe StackExchange.com. Deus o ajude se C:\Programé de fato uma imagem executável do programa.

Essa é uma fraqueza geral e se aplica a qualquer nome de arquivo de programa que contenha espaços em combinação com qualquer programa que use o One Big String para gerar outros programas. Mas o caso mais comum atingido por isso é todos os programas que vivem abaixo C:\Program Files\e um grande número de programas Win32 que usam a abordagem One Big String.

É tarde demais para alterar a API do Win32. Era tarde demais uma década atrás. E a Microsoft não pode alterar todos os programas escritos por outras pessoas que passam uma grande sequência em vez de duas para CreateProcess(). Portanto, a Microsoft faz com que o Windows verifique, no logon do usuário, a existência C:\Programe exiba o aviso que você vê.

E, como você pode ver, há um grande aviso de "Segurança" no documento Win32 da Microsoft, que diz aos desenvolvedores para não escreverem programas usando a abordagem One Big String, que existe há alguns anos.

Leitura adicional

JdeBP
fonte
6
Excelente resposta! Como desenvolvedor, a próxima coisa a fazer é obviamente criar um manequim C:\Program.exeque registre todos os seus parâmetros de linha de comando. Vamos ver quem o usa!
precisa saber é o seguinte
1
Então, este é por isso que as configurações de segurança padrão desde XP não permitem a criação de arquivos na raiz por não-administradores.
precisa saber é o seguinte