Чому програма під назвою "C: \ Program" може впливати на інші програми?


16

Сьогодні з-під синього кольору в корі Programз'явився файл, який називається C:\, і при вході в систему спливаюче вікно показує повідомлення:

Ім'я файлу Попередження

На вашому комп’ютері є файл або папка під назвою "C: \ Program", яка може призвести до неправильного функціонування деяких програм. Перейменування його на "C: \ Program1" вирішило б проблему. Ви хочете перейменувати його зараз?

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


1
Ви впевнені, що це повідомлення, створене Windows?
Рамхаунд

1
Yeap, двічі перевірено у Process Explorer, це був діалог від explorer.exe
Конрад Кокоса,

2
Звучить схематично, жодні програми (за винятком декількох) не повинні встановлюватися ніде, окрім як Program Files* для типового споживача. Але я думаю, що це тому, що погана відповідність пошуку може знайти це замість Program Files.
бовдур

Відповіді:


27

Він має такий великий вплив через давно відому слабкість API Win32.

Програми породжуються у 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з хвостиком команди Files\Contoso\TakeOver.exe StackExchange.com. Небеса допоможе вам, якщо C:\Programнасправді є зображення програми, що виконується.

Це загальна слабкість, і вона стосується будь-якого імені файлу програми, що містить пробіли в поєднанні з будь-якою програмою, яка використовує One Big String для нерестування інших програм. Але найпоширеніший випадок, який стосується цього, - це всі програми, які перебувають під програмою, C:\Program Files\і велика кількість програм Win32, які використовують підхід «Одна велика струна».

Занадто пізно змінювати API Win32. Це було пізно десятиліття тому. І Microsoft не може змінити всі програми, написані іншими людьми, які передають один великий рядок замість двох CreateProcess(). Таким чином, Microsoft змушує Windows перевіряти на час входу користувача наявність C:\Programта відображати попередження, яке ви бачите.

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

Подальше читання


6
Відмінна відповідь! Як я розробник, наступне, що я зроблю, - це, очевидно, створення манекена, C:\Program.exeякий записує всі його параметри командного рядка. Ми побачимо, хто ним користується!
Конрад Кокоса

1
Так це чому настройки безпеки по замовчуванням починаючи з XP не дозволяють створювати файли в корені , які не є адміністраторами.
kinokijuf
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.