由于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中有一个很大的“安全”警告,告诉开发人员不要使用“一个大字符串”方法编写程序,这种方法已经存在了几年。
进一步阅读