为什么名为“ C:\ Program”的程序会影响其他程序?


16

如今,突然出现了一个名为的文件,该文件Program出现在的根目录上C:\,并在登录系统时显示以下消息:

文件名警告

您的计算机上有一个名为“ C:\ Program”的文件或文件夹,这可能会导致某些应用程序无法正常运行。将其重命名为“ C:\ Program1”将解决该问题。您现在要重命名吗?

虽然消息是不言自明的,但我想知道为什么这个文件会产生如此大的影响?确实,其中的某些程序(也许我没有检查过)C:\Program Files...根本没有启动。我可以理解如何创建此类文件(例如,尝试写入文件夹C:\Program Files\Something...但不带引号),但是我几乎不了解它如何影响其他程序。


1
您确定这是Windows生成的消息吗?
Ramhound 2014年

1
是的,经过Process Exploer的双重检查,它是explorer.exe的对话框
Konrad Kokosa 2014年

2
听起来很粗略,除了Program Files* 针对普通用户的程序外,不应在其他任何地方安装任何程序(少数几个程序除外)。但是我认为这是因为搜索不匹配可以找到而不是Program Files
nerdwaller 2014年

Answers:


27

由于Win32 API的一个众所周知的弱点,它具有如此大的影响力。

通过CreateProcess()系统调用在Win32中生成程序。它可以以多种方式使用。来自Unix,Linux或OS / 2背景的人们通常会认为它是为程序(图像文件)生成两个单独的参数,并让命令尾部传递给新进程,因为文件名和参数向量/命令尾部在这些操作系统的API中,有两件事是分开的。但是实际上,可以以另一种形式调用系统调用,其中程序名称和参数混合在一个大字符串中。 CreateProcess()将尝试从命令尾部分离程序文件名。

问题在于,它是通过逐步在每个连续的空格字符处将字符串以twain方式拆分的,直到左侧部分与文件或目录匹配为止。许多Win32程序会尝试将类似字符串的内容传递C:\Program Files\Contoso\TakeOver.exe StackExchange.com给系统调用。这将运行正确的程序(C:\Program Files\Contoso\TakeOver.exe带有正确的命令尾)StackExchange.com,直到出现明显危险的人并C:\Program像您一样创建文件为止。

在这一点上,系统调用最终尝试C:\Program使用命令tail 来运行程序映像文件Files\Contoso\TakeOver.exe StackExchange.com。如果C:\Program实际上是一个可执行程序映像,Heaven会为您提供帮助。

这是一个普遍的弱点,它适用于任何包含空格的程序文件名,以及与使用“一个大字符串”生成其他程序的任何程序结合使用的文件名。但是,最常见的情况是所有生活在其中的程序C:\Program Files\以及大量使用“一个大字符串”方法的Win32程序。

更改Win32 API为时已晚。十年前为时已晚。而且Microsoft无法将其他人编写的所有程序都传递给一个大字符串而不是两个大字符串CreateProcess()。因此,Microsoft在用户登录时使Windows检查是否存在C:\Program并显示您看到的警告。

而且,如您所见,Microsoft的Win32 doco中有一个很大的“安全”警告,告诉开发人员不要使用“一个大字符串”方法编写程序,这种方法已经存在了几年。

进一步阅读


6
很好的答案!作为开发人员,我接下来要做的显然是创建一个C:\Program.exe记录其所有命令行参数的虚拟对象。我们将看到谁使用它!
Konrad Kokosa 2014年

1
因此,就是XP以来默认安全设置不允许非管理员在根目录中创建文件的原因。
kinokijuf
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.