-
Как запустить процесс от пользователя System и с привилегиями Системы (как некоторые антивирусы)
-
1. Процесс всегда можно увидеть 2. Процесс всегда можно убить 3. Систему безопасности в Windows разрабатывали умные люди.
-
> SCL © (14.12.08 10:16)
> Как запустить процесс от пользователя System
Ну, например, через Schedule, если оно от лица System, то и все им пущеннные будут таковыми.
-- Regards, LVT.
-
Это называется системная служба или сервис. Но права там далеко не системные.
-
> Как запустить процесс с привилегиями System
вызвать CreateProcess из приложения с правами и привилегиями System.
-
Гдето на работе валялся асемблерный исходник который такое делат. доберусь до работы и если вспомню напишу. Вспоминается что там используется функция GetKernelObjectSecurity которая получает SecurityDescriptor. потом следует танец с бубном и CreateProcess
-
Fighter, ждем тебя! Мне тоже интересно...
-
-
Запустить файл как сервис
-
Удалено модератором
-
-
> [10] Игорь © (12.04.09 10:33) > Вот держи убогую хрень написанную мной
Ну не совсем уж и убогая :)
Смотрела бегло, но сразу обратила внимание, на то что ты меняешь секюрити у winlogon. Конечно это никуда не годится, надо искать другой путь. (Вариант временно изменить и потом вернуть обратно тож плох). Так что, если конечно интерес не пропал, дерзайте дальше :) P.S. Есть там еще ошибки, но они меркнут в сравнении с описанной выше :)
-
Вот доделанный вариант, PACL winlogon'у назад возвращаеться function _RunAsSystem_1(ApplicationName: string; CommandLine: string): Boolean;
var
SI: STARTUPINFO;
PI: PROCESS_INFORMATION;
PSD: PPSecurity_Descriptor;
ppDacl: PACL;
hProcess, hToken: Cardinal;
begin
Result:= False;
hProcess:= OpenProcess(PROCESS_QUERY_INFORMATION, False, GetWinlogonPID);
if hProcess <> 0 then
begin
try
OpenProcessToken(hProcess, MAXIMUM_ALLOWED, hToken);
if hToken <> 0 then
begin
if GetSecurityInfo(hToken, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, nil, nil, @ppDacl, nil, PSD) = ERROR_SUCCESS then
begin
if SetSecurityInfo(hToken, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, nil, nil, nil, nil) = ERROR_SUCCESS then
begin
CloseHandle(hToken);
hToken:= 0;
OpenProcessToken(hProcess, MAXIMUM_ALLOWED, hToken);
if hToken <> 0 then
begin
try
if ImpersonateLoggedOnUser(hToken) then
begin
ZeroMemory(@SI, SizeOf(SI));
SI.cb:= SizeOf(SI);
if CreateProcessAsUser(hToken, PChar(ApplicationName), PChar(CommandLine), nil, nil, False, CREATE_DEFAULT_ERROR_MODE, nil, nil, SI, PI) then
Result:= True;
RevertToSelf;
end;
SetSecurityInfo(hToken, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, nil, nil, ppDacl, nil);
finally
CloseHandle(hToken);
end;
end;
end;
LocalFree(DWORD(ppDacl));
LocalFree(DWORD(PSD));
end;
end;
finally
CloseHandle(hProcess);
end;
end;
end;
-
Запустить как сервис. =)
-
Удалено модератором
|