14

Сегодня совершенно неожиданно в корне Program появился файл C:\ , и при входе в систему всплывающее окно показывает сообщение:

Имя файла Предупреждение

На вашем компьютере есть файл или папка с именем «C:\Program», что может привести к некорректной работе некоторых приложений. Переименование его в «C:\Program1» решило бы проблему. Хотите переименовать его сейчас?

Хотя сообщение самоочевидно, мне интересно, почему этот файл может иметь такое большое влияние? Действительно, некоторые программы (может быть, все, которые я не проверял), расположенные в C:\Program Files... не запускались вообще. Я могу понять, как можно создать такой файл (например, при попытке записи в папку C:\Program Files\Something... но без кавычек), но я не понимаю, как это может повлиять на другие программы.

1 ответ1

25

Это оказывает такое большое влияние из-за давно известной слабости в Win32 API.

Программы порождаются в Win32 через системный вызов CreateProcess() . Это может быть использовано несколькими способами. Люди, пришедшие из фонов 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 на самом деле является образом исполняемой программы.

Это общий недостаток, и он применяется к любому имени файла программы, содержащему пробелы в сочетании с любой программой, которая использует One Big String для порождения других программ. Но наиболее распространенным случаем, который поражает это, являются все программы, которые живут в C:\Program Files\ и большое количество программ Win32, которые используют подход One Big String.

Слишком поздно менять Win32 API. Это было слишком поздно десять лет назад. И Microsoft не может изменить все программы, написанные другими людьми, которые передают одну большую строку вместо двух в CreateProcess() . Таким образом, Microsoft при входе в систему проверяет Windows на наличие C:\Program и отображает предупреждение, которое вы видите.

И, как вы можете видеть, в документе Microsoft Win32 есть серьезное предупреждение "Безопасность", в котором говорится, что разработчики не должны писать программы с использованием подхода One Big String, который существует уже несколько лет.

дальнейшее чтение

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .