Сегодня совершенно неожиданно в Program
корне появился файл с именем C:\
, и при входе в систему всплывающее окно показывает сообщение:
Имя файла Предупреждение
На вашем компьютере есть файл или папка с именем «C: \ Program», что может привести к некорректной работе некоторых приложений. Переименование его в «C: \ Program1» решило бы проблему. Хотите переименовать его сейчас?
Хотя сообщение самоочевидно, мне интересно, почему этот файл может иметь такое большое влияние? Действительно, некоторые программы (может быть, все, которые я не проверял), расположенные в, C:\Program Files...
не запускались вообще. Я могу понять, как можно создать такой файл (например, при попытке записи в папку, C:\Program Files\Something...
но без кавычек), но я не понимаю, как он может повлиять на другие программы.
источник
Program Files*
для обычного потребителя. Но я думаю, это потому, что плохое соответствие для поиска может найти это вместоProgram Files
.Ответы:
Это оказывает такое большое влияние из-за давно известной слабости в 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
с помощью команды tailFiles\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, который существует уже несколько лет.
дальнейшее чтение
источник
C:\Program.exe
котором будут записываться все параметры командной строки. Посмотрим, кто его использует!