format PE GUI 5.0
include 'win32wx.inc'
.code
entry $
xor eax,eax
push eax
invoke RtlAdjustPrivilege,20,1,0,esp ; RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE,TRUE,FALSE,OldPrivilege)
;cmp eax,0xC0000061 ; STATUS_PRIVILEGE_NOT_HELD
;je @f
mov eax,esp
mov dword [eax],TRUE
invoke NtSetInformationProcess,-1,29,eax,4 ; NtSetInformationProcess(GetCurrentProcess(),ProcessBreakOnTermination,TRUE,4)
pop eax
; BSOD...
invoke NtTerminateProcess,-1,0 ; NtTerminateProcess(GetCurrentProcess(),0)
.data
data import
library ntdll,'NTDLL.DLL'
import ntdll,\
RtlAdjustPrivilege,'RtlAdjustPrivilege',\
NtSetInformationProcess,'NtSetInformationProcess',\
NtTerminateProcess,'NtTerminateProcess'
end data
Критический системный процесс
Как сделать своему приложению такой приоритет, что бы диспетчер задач не смог его завершить, как, например, процесс LSASS.EXE (Windows XP build 2600)?
Пользовательское приложение можно убить всегда. LSASS не убивается потому что это СЕРВИС(или служба). Поэтому ищи про написание сервисов, но скажу сразу, что окошки(формы) сервиса не видны, потомы что сервисы выполняются на другом Desktop-е.
А кто-нить тогда знает как спрятать процесс от димпетчера задач WinNT, маскировка типа krnl32.exe не канает, вроде это нереально:((
Поднимаю тему, так как возникла схожая задача. Необходимо сделать защищенный, т.е. не дать возможность грохнуть его из диспетчера. Подскажите куда копать?
Переименовать процесс в соответствии с одним из системных,логично же
А вообще, система не даст прибить только критический процесс, прибив который, придет гарантированный каюк системе. В этом направлении и надо работать :)
Цитата: makbeth
Ага. И запустить из под SYSTEM.
А вообще, система не даст прибить только критический процесс, прибив который, придет гарантированный каюк системе. В этом направлении и надо работать :)
А вообще, система не даст прибить только критический процесс, прибив который, придет гарантированный каюк системе. В этом направлении и надо работать :)
Есть мысли как создать такой процесс/сервис? Или где можно про это прочитать?
Цитата:
Есть мысли как создать такой процесс/сервис? Или где можно про это прочитать?
Код:
если этот процесс прибить то система вывалится в BSOD со статусом 0xF4: CRITICAL_OBJECT_TERMINATION
ах, да, дельфи
Код:
program criticalprocess;
uses
Windows, SysUtils;
const
ntdll = 'NTDLL.DLL';
type
NTSTATUS = ULONG;
HANDLE = ULONG;
PROCESS_INFORMATION_CLASS = ULONG;
const
STATUS_SUCCESS = $00000000;
STATUS_PRIVILEGE_NOT_HELD = $C0000061;
const
SE_DEBUG_PRIVILEGE = 20;
const
ProcessBreakOnTermination = 29;
function RtlAdjustPrivilege(Privilege: ULONG; Enable: BOOL;
CurrentThread: BOOL; out OldPrivilege: BOOL): NTSTATUS; stdcall; external ntdll;
function NtSetInformationProcess(ProcessHandle: HANDLE;
ProcessInformationClass: PROCESS_INFORMATION_CLASS;
ProcessInformation: Pointer; ProcessInformationLength: ULONG): NTSTATUS; stdcall; external ntdll;
var
Status: NTSTATUS;
Enabled: BOOL;
begin
Status := RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE, True, False, Enabled);
case (Status) of
STATUS_SUCCESS:
begin
Enabled := True;
NtSetInformationProcess(HANDLE(-1),
ProcessBreakOnTermination, @Enabled, SizeOf(Enabled));
end;
STATUS_PRIVILEGE_NOT_HELD:
begin
MessageBox(0, 'Debug privilege needed.', nil, MB_ICONERROR);
Exit;
end;
else
MessageBoxW(0, PWideChar(WideString(Format('NTSTATUS: 0x%.8X', [Status]))), nil, MB_ICONERROR);
Exit;
end;
MessageBoxW(0, 'Do not terminate!', 'Warning!', MB_ICONWARNING);
end.
uses
Windows, SysUtils;
const
ntdll = 'NTDLL.DLL';
type
NTSTATUS = ULONG;
HANDLE = ULONG;
PROCESS_INFORMATION_CLASS = ULONG;
const
STATUS_SUCCESS = $00000000;
STATUS_PRIVILEGE_NOT_HELD = $C0000061;
const
SE_DEBUG_PRIVILEGE = 20;
const
ProcessBreakOnTermination = 29;
function RtlAdjustPrivilege(Privilege: ULONG; Enable: BOOL;
CurrentThread: BOOL; out OldPrivilege: BOOL): NTSTATUS; stdcall; external ntdll;
function NtSetInformationProcess(ProcessHandle: HANDLE;
ProcessInformationClass: PROCESS_INFORMATION_CLASS;
ProcessInformation: Pointer; ProcessInformationLength: ULONG): NTSTATUS; stdcall; external ntdll;
var
Status: NTSTATUS;
Enabled: BOOL;
begin
Status := RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE, True, False, Enabled);
case (Status) of
STATUS_SUCCESS:
begin
Enabled := True;
NtSetInformationProcess(HANDLE(-1),
ProcessBreakOnTermination, @Enabled, SizeOf(Enabled));
end;
STATUS_PRIVILEGE_NOT_HELD:
begin
MessageBox(0, 'Debug privilege needed.', nil, MB_ICONERROR);
Exit;
end;
else
MessageBoxW(0, PWideChar(WideString(Format('NTSTATUS: 0x%.8X', [Status]))), nil, MB_ICONERROR);
Exit;
end;
MessageBoxW(0, 'Do not terminate!', 'Warning!', MB_ICONWARNING);
end.
Эй-эй... Я бы на месте пользователей такой программы, отрывал бы руки автору по самую ж... что там у него вместо головы :/