Форум: "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