Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.09.02;
Скачать: CL | DM;

Вниз

Блокировка машины в Windows и неубиваемая программа   Найти похожие ветки 

 
SeB ©   (2002-06-20 10:59) [0]

Сначала то, что я уже знаю:

В Win9x - это легко, блокировку ввода я делал через
BlockInput (User32.dll), кстати он работает и в Win2000,
а блокировку Ctrl-Alt-Del, через
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, NULL, 0);

На сколько я понял, заблокировать Ctrl-Alt-Del в NT в принципе
невозможно, однако есть другие способы сделать программу
неубиваемой.

Возможные варианты:
1) Спрятать программу от TaskManager"a (и, возможно, от других программ
просмотра процессов).
Например, как описывается в статье "Сокрытие процессов в WIN2000/NT"
http://www1.xakep.ru/post/14033/default.asp

2) Сделать программу неубиваемой.
Тут есть еще два варианта, один описан в программе MustDie (см.
сайт "Клуб любителей С++") - запускается две копии программы,
каждая из которых следит за второй и, при уничтожении процесса,
запускает вторую копию.
Второй вариант - сделать сервис, который нельзя отключить, так,
например, сделан InterBase Server - его нельзя убить с помощью
TaskManager"a.

Ну вот, наконец, и вопрос: где можно что-нибуть почитать о последнем
варианте, как это реализуется и в какую сторону копать? - это
связано с привилегиями процессов или с чем-то еще?

И еще один вопрос - каким образом происходит в NT автозагрузка программ
из реестра - из ветвей LOCAL_MACHINE, CURRENT_USER, USERS,
в Win98 я прописывал программу в LOCAL_MACHINE (...RunServices)
и она грузилась автоматически, в Win2000 она почему-то вообще
не грузится ни при входе нового пользователя ни при
перезагрузке машины.


 
Andrew_k ©   (2002-06-20 12:05) [1]

uses
Windows,AclApi, Accctrl;

const
ACL_REVISION = 2;

procedure TForm1.FormCreate(Sender: TObject);
var
ACL : _ACL;
begin
if (InitializeAcl(ACL,SizeOf(_ACL),ACL_REVISION)) and (IsValidAcl(ACL))
then SetSecurityInfo(GetCurrentProcess,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION,nil,nil,@ACL,nil);
end;

GodMode :)))
А автозагрузка - не Services, а просто Run!


 
SeB ©   (2002-06-20 15:23) [2]

2Andrew_k
Большое спасибо, все получилось.
Для пробы я сделал тестовую программку - NTKiller,
она запускает каждые десять секунд свою копию, заодно
посмотрели как отреагирует Win2000 - ничего хорошего она
не сделала, просто зависла. Программку выложил в кладовку.


 
SeB ©   (2002-07-01 12:37) [3]

Результаты экспериментов с неубиваемым процессом:

Алгоритм с использованием SetSecurityInfo не дает завершить процесс только в Win2000.
Я нашел в WinAPI несколько примеров по установке ACL"s для процессов и один из них дает нужный эффект в NT4 (при использовании SetKernelObjectSecurity - см.ниже), при простом переименовании, как в XP - процесс все равно убивается - это, в принципе, выглядит нормально.
В XP - процесс убивается в любом случае, при переименовании
в services.exe - не убивается!!!? - получается, что XP пользуется
не привелегиями процесса и т.д., а именем exe-файла?

Код для неубиваемого процесса в Win2000 и NT4):

void __fastcall TForm1::FormCreate(TObject *Sender)
{

PSECURITY_DESCRIPTOR pSD;
PACL pACL;
DWORD cbACL = 1024;

/* Initialize a security descriptor. */

pSD = (PSECURITY_DESCRIPTOR) LocalAlloc(LPTR,
SECURITY_DESCRIPTOR_MIN_LENGTH); /* defined in WINNT.H */
if (pSD == NULL) {
ErrorHandler("LocalAlloc");
goto Cleanup;
}

if (!InitializeSecurityDescriptor(pSD,
SECURITY_DESCRIPTOR_REVISION)) { /* defined in WINNT.H */
ErrorHandler("InitializeSecurityDescriptor");
goto Cleanup;

}

/* Initialize a DACL. */

pACL = (PACL) LocalAlloc(LPTR, cbACL);
if (pACL == NULL) {
ErrorHandler("LocalAlloc");
goto Cleanup;
}

if (!InitializeAcl(pACL, cbACL, ACL_REVISION2)) {
ErrorHandler("InitializeAcl");
goto Cleanup;
}

/* Add an empty ACL to the SD to deny access. */

if (!SetSecurityDescriptorDacl(pSD,
TRUE, /* fDaclPresent flag */
pACL,
FALSE)) { /* not a default DACL */
ErrorHandler("SetSecurityDescriptorDacl");

goto Cleanup;
}

/* Use the new SD as the file"s security info. */

if (!SetKernelObjectSecurity(GetCurrentProcess(),
DACL_SECURITY_INFORMATION,
pSD)) {
ErrorHandler("SetFileSecurity");
goto Cleanup;
}

Cleanup:
if(pSD != NULL)
LocalFree((HLOCAL) pSD);
if(pACL != NULL)
LocalFree((HLOCAL) pACL);



}

P.S. - за goto не ругайте, я содрал пример из WinAPI Help



Страницы: 1 вся ветка

Текущий архив: 2002.09.02;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.02 c
7-3641
svmagnum
2002-05-26 06:02
2002.09.02
Kak mne otodvinut desktop.


3-3236
Димон1
2002-08-09 14:51
2002.09.02
Наверно пора на обед....


1-3332
user965
2002-08-21 16:45
2002.09.02
QuickRep


1-3517
T2
2002-08-21 15:32
2002.09.02
qtintf.dll - что за беда?


14-3598
nikolo
2002-08-05 18:12
2002.09.02
Freeware Advanced Application Controls 2.1