Неубиваемый процесс


Проблема:

Описываемая проблема знакома многим, кто хотел сделать свое приложение недоступным для снятия задачи с процесса путем нажатия комбинации клавиш 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;

После запуска этой функции у нас должен запуститься неубиваемый Блокнот.







 
Design by Zwulf 2006.
Статистика




Реклама

Официальный сайт фанатов группы -Коррозия Металла-

Хостинг от uCoz