Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.09.02;
Скачать: [xml.tar.bz2];

Вниз

Блокировка машины в 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.09.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.006 c
14-3571
Grrey
2002-08-05 10:56
2002.09.02
У кого-нибудь есть таблицы перехода из Кои8 в Windows?


1-3451
kima
2002-08-20 19:10
2002.09.02
arccot()


4-3690
MSerega
2002-06-28 10:09
2002.09.02
как можно перехватить документы идущие на печать?


1-3435
Степан
2002-08-23 07:36
2002.09.02
Выделить строку в ListView


6-3536
lds
2002-06-21 13:29
2002.09.02
Как изменить размер шрифта в TWebBrouser ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский