среда, 7 января 2009 г.

"Гонка вооружений" между пользователями и программами

Это перевод The arms race between programs and users. Автор: Реймонд Чен.

Между теми, кто пишет программы, и теми, кто их использует, идёт постоянная борьба. Например, часто можно услышать вопрос типа такого: "что нужно сделать в своей программе, чтобы пользователь не мог закрыть её?".

Представим, что было бы, если бы существовал способ это сделать. Спросите себя: "На что был бы похож мир, окажись это возможным?".

Ну, тогда была бы программа, скажем, xyz.exe, которую нельзя было бы убить (unkillable). А тперь представьте себя на месте пользователя. Программа xyz.exe заглючила, поэтому вы хотите её перезапустить. Но она не даёт вам выйти. Поэтому вы пытаетесь убить её, но вы не можете её и убить.

Это только одна из гонок вооружений, которые можно представить:
"Я хочу, чтобы никто не смог убить мой процесс" vs "Как я могу убить этот сумасшедший процесс?".
"Я хочу всенепременно ткнуть мой диалог в лицо пользователю" vs "Как мне запретить этой программе тырить у меня фокус?".
"Я хочу, чтобы вот этот файл нельзя было удалить" vs "Как мне удалить неудаляемый файл?".
"Как мне скрыть свою программу из Диспетчера Задач?" vs "Как я могу просмотреть список всех программ, которые сейчас работают на моём компьютере?".

В конечном итоге вы должны решить, на чьей вы стороне, и Windows решила оставить пользователям контроль над своими программами и данными, а администраторам - над их машинами. Поэтому пользователь может убить любой процесс, какой он захочет (если у него хватает на это прав), он может остановить любую программу, которая тырит фокус, и он может удалить любой файл, какой только захочет (опять-таки, если у него есть на это права).

Программы могут пытаться сделать своё закрытие более сложным (запретить доступ PROCESS_TERMINATE, запретить PROCESS_CREATE_THREAD, так что люди не смогут сделать CreateRemoteThread(EndProcess), запретить PROCESS_VM_WRITE, так что люди не смогут испортить ваш стек, чтобы заставить вас вылететь, запретить PROCESS_SUSPEND_RESUME, так что они не смогут остановить вас), но в конечном итоге вы не сможете остановить их, от, скажем, получения Debug привилегии, подключения отладчиком к вашему процессу и перевода EIP на "ExitProcess".

Заметьте, что вы даже можете убить CSRSS.EXE или WINLOGON.EXE, если захотите. Ваш компьютер очень на вас рассердится, но вы можете это сделать (только сначала сохраните свою работу!).

Другой полезный вопрос, который надо себе задать, если бы это было возможным: "А что мешает вирусу сделать то же самое?". Если бы был способ делать такие вещи, то вредоносное ПО могло бы использовать его и сделать себя невидимым в Диспетчере Задач, неудаляемым и неубиваемым заодно. Уж наверное вы не хотите этого, не так ли?

Читать далее: почему я не могу перехватить TerminateProcess?

Комментариев нет:

Отправить комментарий

Можно использовать некоторые HTML-теги, например:

<b>Жирный</b>
<i>Курсив</i>
<a href="http://www.example.com/">Ссылка</a>

Вам необязательно регистрироваться для комментирования - для этого просто выберите из списка "Анонимный" (для анонимного комментария) или "Имя/URL" (для указания вашего имени и ссылки на сайт). Все прочие варианты потребуют от вас входа в вашу учётку (поддерживается OpenID).

Пожалуйста, по возможности используйте "Имя/URL" вместо "Анонимный". URL можно просто не указывать.

Ваше сообщение может быть помечено как спам спам-фильтром - не волнуйтесь, оно появится после проверки администратором.