Это оказывает такое большое влияние из-за давно известной слабости в 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, который существует уже несколько лет.
дальнейшее чтение