Главная > Программирование, Цiкавi дослiди > Как сделать свой процесс критически важным для системы

Как сделать свой процесс критически важным для системы

Мне всегда было интересно каким образом система уходит в 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!

Так что убивая процесс, стоит проверить, а не поставил ли он себе такой флаг :)

Добавить комментарий

Fill in your details below or click an icon to log in:

Логотип WordPress.com

You are commenting using your WordPress.com account. Log Out / Изменить )

Фотография Twitter

You are commenting using your Twitter account. Log Out / Изменить )

Фотография Facebook

You are commenting using your Facebook account. Log Out / Изменить )

Connecting to %s

Follow

Get every new post delivered to your Inbox.