Как сделать свой процесс критически важным для системы
Мне всегда было интересно каким образом система уходит в BSOD когда убиваешь ей csrss.exe или другой “важный процесс”, но все руки не доходили посмотреть как это работает.
А работает это так:
if (LastThread &&
(Process->Flags & PS_PROCESS_FLAGS_BREAK_ON_TERMINATION)) {
if (KD_DEBUGGER_ENABLED) {
PspCatchCriticalBreak ("Critical process 0x%p (%s) exited\n",
Process,
Process->ImageFileName);
} else {
KeBugCheckEx (CRITICAL_PROCESS_DIED,
(ULONG_PTR)Process,
0,
0,
0);
}
}
Вот такой код в PspExitThread(). Если у процесса стоит флаг PS_PROCESS_FLAGS_BREAK_ON_TERMINATION, то система героически уйдет в BSOD.
Какой из этого следует вывод: любой процесс можно сделать критическим для системы. То есть запросто можно какой-то notepad.exe сделать критическим. Более того, не нужно лезть для этого в EPROCESS. Есть NtSetInformationProcess() с типом ProcessBreakOnTermination, и похоже что это можно даже сделать из ring-3!
Так что убивая процесс, стоит проверить, а не поставил ли он себе такой флаг
Рубрики:Программирование, Цiкавi дослiди
windows