Неубиваемый процесс
Проблема:
Описываемая проблема знакома многим, кто хотел сделать свое приложение недоступным
для снятия задачи с процесса путем нажатия комбинации клавиш Ctrl+Alt+Del (диспетчер задач) под WINDOWS NT / 2K / XP.
Я сам пытаясь решить этот вопрос излазил множество сайтов, проверил много способов начиная сервисами и заканчивая хуками на
три волшебных кнопки. Наиболее частый совет - написание службы (servise), но этот способ не совсем удобен, так как приходится
настраивать права администратора, настраивать взаимодействия и т.д.
Решение:
В конце концов, я нашел подходящий вариант. Сайт http://www.delphi.xonix.ru/ целиком
и полностью посвящен программированию под системы на основе Windows NT. Вот наиболее важная часть опубликованной там статьи.
Вариант, который я предлагаю несколько другой - использование атрибутов безопасности при запуске процесса.
Естественно установить эти атрибуты для запуска нашего процесса мы не можем (хотя мы можем поменять их в процессе выполнения, но об этом в другой раз),
поэтому мы будем запускать наш же файл, но уже с другими атрибутами.
Например, в начале программы пишем if ParamStr(1)<>"nokill" then запускаем наш файл, но с новыми атрибутами безопасности и завершаем процесс.
Итак, код запуска "неубиваемого" процесса:
const
ACL_REVISION = 2;
function CreateNewProcess:Boolean;
var
ACL : _ACL;
SD : _SECURITY_DESCRIPTOR;
SA : _SECURITY_ATTRIBUTES;
si : _STARTUPINFOA;
pi : PROCESS_INFORMATION;
begin
Result:=false;
if not InitializeAcl
(ACL,SizeOf(_ACL),ACL_REVISION)
then ShowMessage('InitializeAcl'
+#13#10+SysErrorMessage(GetLastError));
if not IsValidAcl(ACL) then exit;
if not InitializeSecurityDescriptor
(@SD,SECURITY_DESCRIPTOR_REVISION)
then ShowMessage
('InitializeSecurityDescriptor'
+#13#10+SysErrorMessage(GetLastError));
if not SetSecurityDescriptorDacl
(@SD,true,@ACl,true)
then ShowMessage
('SetSecurityDescriptorDacl'
+#13#10+SysErrorMessage(GetLastError));
if not IsValidSecurityDescriptor(@SD)
then exit;
ZeroMemory(@sa,SizeOf(sa));
sa.nLength:=SizeOf(sa);
sa.bInheritHandle:=false;
sa.lpSecurityDescriptor:=@SD;
ZeroMemory(@si,SizeOf(si));
si.cb:=SizeOf(si);
if not CreateProcess
(nil,
'notepad.exe',@sa,@sa,false,0,nil,nil,si,pi)
then ShowMessage('CreateProcess'
+#13#10+SysErrorMessage(GetLastError));
Result:=true;
end;
После запуска этой функции у нас должен запуститься неубиваемый Блокнот.
|