Как я могу заставить диспетчер задач убивать мою программу?

Есть ли способ защитить приложение Delphi от того, что он был убит диспетчером задач Windows (или другими, такими как Process Explorer)?

Я думаю, что сообщения Windows могут сделать это (совершая перехват и перехватывая сообщение TerminateProcess).

Я хочу пример этой защиты. Комплекты Антивируса Касперского похожи на это; мы не можем завершить их процесс в диспетчере задач.

Ответ 1

Программы AV, такие как Kaspersky, вероятно, используют драйвер и используют hook для предотвращения завершения. В вашей ситуации я бы посоветовал установить ACL для процесса, это предотвратит завершение работы с помощью диспетчера задач или средств cmdline (если у пользователя нет привилегии Debug). Конечно, пользователь всегда может использовать такой инструмент, как Process Explorer, взять на себя управление процессом, установить новый ACL и Terminate.

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

Настройка ACL процесса очень проста с Jedi Windows Security Library, поскольку это пример.

Ответ 2

Как говорит Корнель, есть защита процессов, изолированных пользователями от OS-уровня. Но, вообще говоря, нет способа остановить ваш процесс от его прекращения пользователем с разрешением на это. И у пользователя есть разрешение на прекращение процессов, выполняемых в качестве этого пользователя.

Даже если вы хотите запустить его как SYSTEM, вы не сможете использовать этот процесс для взаимодействия с зарегистрированным пользователем. Вам нужно будет запустить его как службу, и у него не будет GUI. Вы могли бы попробовать другие подходы, такие как получение DLL, загружаемой в процесс, такой как Explorer.exe, который пользователи не будут прервать, потому что они этого не хотят, но это просто оскорбительно.

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

Ответ 3

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

Ответ 4

Я думаю, что вы задаете неправильный вопрос.

Вы пытаетесь решить проблему ", если соединение будет завершено в середине чата с сервером". Ответ не на "отказ в завершении процесса", но "предвидеть проблемы подключения и написать код ошибки"

Почему? Причина, очевидно, прерывание соединения может быть связано с сетевыми проблемами (вы не можете запретить своим пользователям отключать компьютер от сети), а не с завершением работы клиента!

Почему вы не можете уловить TerminateProcess?

И если вы беспокоитесь о сбое приложения - просто используйте Application Restart and Recovery API.

Ответ 5

Самый простой способ: вы можете просто запустить 2 процесса и позволить им "смотреть" друг на друга.
Если один из них был закрыт, пусть другая процедура перезапустит его. Это предотвратит появление новичков (как вы сказали) от убийства этого процесса.

Извините, но я думаю, что ваше "сервер/клиентское приложение" имеет возможности trojan/backdoor. " Клиентское приложение отправляет некоторые полезные данные", " unkillable process" (в ваших комментариях) кажется мне подозрительным.

Ответ 6

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