Как написать неубиваемый процесс для Windows? - PullRequest
1 голос
/ 14 июня 2009

Я ищу способ написать приложение. Я использую Visual C ++ 6.0.

Мне нужно, чтобы пользователь не мог закрыть этот процесс через диспетчер задач.

Ответы [ 11 ]

34 голосов
/ 14 июня 2009

Вы не можете сделать это.

18 голосов
/ 14 июня 2009

Раймонд Чен, почему это плохая идея:

http://blogs.msdn.com/oldnewthing/archive/2004/02/16/73780.aspx

16 голосов
/ 14 июня 2009

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

Так что не совсем верно, что вы "не можете этого сделать", как говорят некоторые люди. Но ты бы не хотел этого.

7 голосов
/ 14 июня 2009

Все зависит от того, кто не сможет убить этот процесс. У вас обычно есть один интерактивный пользователь. Запуск процесса в этом контексте позволит пользователю убить его. Это ее процесс, поэтому она может убить его, и здесь нет ничего удивительного.

Если у вашего пользователя ограниченные привилегии, вы всегда можете запустить процесс как другой пользователь. Пользователь не может уничтожить процесс, принадлежащий другому пользователю (кроме администратора), что также не удивительно.

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

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

3 голосов
/ 02 июля 2011

Что я узнал от вредоносного ПО:

  • Создать процесс, который порождает дюжину себя
  • Каждый раз, когда вы обнаруживаете, что один из них пропал (был убит), появляется еще дюжина.
  • Каждый должен иметь уникальное имя процесса, чтобы пакетный процесс не мог легко уничтожить их всех по имени
  • Последовательно закройте и перезапустите некоторые процессы, чтобы сохранить изменения в pids, что также предотвратит пакетное уничтожение
3 голосов
/ 14 июня 2009

Зависит от разрешения пользователей. Если вы запустите программу от имени администратора, у обычного пользователя не будет достаточно прав, чтобы убить ваш процесс. Если администратор пытается убить процесс, он в большинстве случаев добьется успеха. Если вы действительно хотите, чтобы кто-то не убивал ваш процесс, вам стоит взглянуть на системные службы Windows и разработку драйверов. В любом случае, имейте в виду, что если пользователь не может завершить процесс, он застрял с ним, даже если он ведет себя ненормально из-за ошибок! Вы найдете огромное количество подобных программ / примеров на легальных! сайт rootkit.com . Пожалуйста, уважайте пользователя.

2 голосов
/ 15 июня 2009

Часто задаваемые вопросы по Win32 на протяжении десятилетий. См. Google Groups и Und. доски по общеизвестным методам. (зацепка cs и др ...)
Новички, которые отвечают «Вы не можете этого сделать», ничего не знают о программировании на Win32: вы можете сделать все с Win32 api ...

1 голос
/ 13 октября 2010
1 голос
/ 14 июня 2009

Нет 100% надежного метода, но должна быть возможность защитить процесс таким способом. К сожалению, это потребовало бы большего знания API системы безопасности Windows, чем у меня сейчас, но принцип прост: позвольте приложению работать под другой (администраторской) учетной записью и установите свойства безопасности объекта процесса на максимум. (Отказывая всем другим пользователям в праве закрыть процесс, таким образом, только специальная учетная запись администратора может закрыть его.) Настройте вторичную службу и заставьте ее работать в качестве опекуна процесса. У него должна быть линия жизни для защищенного приложения, и когда эта линия жизни обрезается (приложение закрывается), то он должен возобновить процесс снова. (Эта линия жизни будет любым видом межпроцессного взаимодействия.) Тем не менее, есть еще способы убить такой неубиваемый процесс. Но для этого нужны знания, о которых большинство пользователей на самом деле не знают, поэтому около 85% всех пользователей не будут иметь понятия, чтобы остановить ваш процесс.

Имейте в виду, что создание такого приложения может иметь юридические последствия. Например, Sony создала приложение руткита, которое автоматически устанавливалось, когда люди вставляли музыкальный компакт-диск Sony или игровой компакт-диск в свой компьютер. Это было частью их решения DRM. К сожалению, было довольно сложно убить это приложение, и оно было установлено без каких-либо предупреждений для пользователей. Хуже того, у него было несколько недостатков, которые предоставили бы хакерам дополнительные способы получить доступ к этим системам и, таким образом, заразить довольно много из них. Sony должна была возместить достаточно много людей за ущерб и должна была заплатить большой штраф. (И тогда я даже не буду упоминать, как это повлияло на их репутацию.)

Я бы посчитал такое приложение легальным только при установке его на свой компьютер. Если вы планируете продавать это приложение другим, вы должны сообщить этим покупателям, как убить процесс, если это будет необходимо. Я знаю, что Symantec делает нечто подобное со своим программным обеспечением, именно поэтому я больше не использую их программное обеспечение. Это мой компьютер, поэтому я смогу убить любой процесс, который захочу.

0 голосов
/ 21 марта 2014

Я только что наткнулся на этот пост, пытаясь найти решение моей собственной (непреднамеренной) неуничтожаемой проблемы процесса. Может быть, моя проблема будет вашим решением.

  1. Используйте jboss Web Native для установки службы, которая будет запускать пакетный файл (измените service.bat, чтобы он вызывал ваш собственный пакетный файл)
  2. В вашем собственном пакетном файле вызовите процесс Java, который выполняет любую задачу, которую вы хотите сохранить
  3. Запустите сервис. Если вы просматриваете процесс в Process Explorer, результирующее дерево будет выглядеть так:

jbosssvc.exe -> cmd.exe -> java.exe

  1. используйте taskkill из командной строки администратора, чтобы убить cmd.exe. Jbosssvc.exe прекратит работу, и java.exe будет запущенным процессом, который, насколько я могу судить, потерян. До сих пор я пробовал использовать Taskmanager, Process Explorer (работающий от имени администратора) и taskkill безрезультатно.

Отказ от ответственности: Есть очень мало случаев, когда это было бы хорошей идеей, как говорили все остальные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...