Kon*_*osa 16 windows filesystems
今天突然一个名为的文件Program
出现在 的根目录下C:\
,当登录系统时,弹出窗口显示一条消息:
文件名警告
您的计算机上有一个名为“C:\Program”的文件或文件夹,它可能会导致某些应用程序无法正常运行。将其重命名为“C:\Program1”可以解决问题。你想现在重命名它吗?
虽然消息是不言自明的,但我想知道为什么这个文件会产生如此大的影响?实际上,位于 中的一些程序(也许全部,我没有检查)C:\Program Files...
根本没有启动。我可以理解如何创建这样的文件(例如,尝试写入文件夹C:\Program Files\Something...
但没有引号),但我几乎不明白它如何影响其他程序。
Jde*_*eBP 27
由于 Win32 API 中一个众所周知的弱点,它具有如此大的影响力。
程序通过CreateProcess()
系统调用在 Win32 中生成。它可以以多种方式使用。来自 Unix、Linux 或 OS/2 背景的人通常会认为它采用两个单独的参数来生成程序(图像文件)和将命令尾传递给新进程,因为文件名和参数向量/命令尾在这些操作系统的 API 中是两个独立的东西。但实际上,系统调用可以以另一种形式调用,将程序名称和参数混合在一个大字符串中。 CreateProcess()
将尝试将程序文件名与命令尾分开。
问题是它通过在每个连续的空格字符处逐渐将字符串分成两部分来实现这一点,直到左侧部分与文件或目录匹配。许多 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
实际上是可执行程序映像,那么天堂会帮助您。
这是一个普遍的弱点,它适用于任何包含空格的程序文件名以及任何使用一个大字符串生成其他程序的程序。但受此影响的最常见情况是存在于其下的所有程序C:\Program Files\
以及大量使用 One Big String 方法的 Win32 程序。
现在更改 Win32 API 为时已晚。十年前已经太晚了。并且 Microsoft 无法将其他人编写的所有传递一个大字符串而不是两个大字符串的程序更改为CreateProcess()
. 因此,Microsoft 在用户登录时让 Windows 检查是否存在C:\Program
并显示您看到的警告。
而且,正如您所看到的,Microsoft 的 Win32 doco 中有一个很大的“安全”警告,告诉开发人员不要使用 One Big String 方法编写程序,这种方法已经存在多年了。
归档时间: |
|
查看次数: |
2060 次 |
最近记录: |