Часть процессов операционной системы считаются «критичными» — если завершить один из них, Windows выпадет в синий экран смерти и перезагрузится. Этим активно пользуются вирусописатели: если сделать свой процесс критичным, то его нельзя будет завершить просто так. В этой статье я покажу, как создавать такие процессы и как прибивать их без падения системы.

Дело в том, что хорошо организовать защиту процесса от завершения, когда пользователь работает под учетной записью администратора, практически невозможно. Есть разные полумеры, но на полноценную защиту они не тянут. Например, можно использовать драйверы режима ядра, но в 64-битных операционных системах не так просто преодолеть механизм Kernel Patch Protection. Остается прибегать к трюкам вроде того, который мы разберем.

Давай посмотрим, как создать критичный процесс в Windows, как проверить, что процесс является критичным, и как его завершить без падения системы в BSOD. Строго говоря, создавать мы будем не процесс, а критичный поток. Ведь процесс в Windows — это что-то вроде контейнера для потоков, в которых и выполняется код.

Зачем используется флаг critical?

  • Чтобы отметить системные процессы и предотвратить потерю данных при их завершении
  • Для выбора приоритета исполнения процессов и указания невыгружаемой части ядра
  • Для написания стойких зловредов, которых не выгрузишь просто так
Загрузка ... Загрузка ...

Есть несколько методов, которые помогут нам создать критичный процесс. Все они основаны на манипуляции вызовами NTAPI (Native Windows API), самыми «низкоуровневыми», которые можно выполнить в режиме пользователя. Эти функции экспортируются ntoskrnl.exe. Через обертку ntdll.dll мы сможем получить их адреса и вызвать их.

 

RtlSetProcessIsCritical

Первая функция Native API, которая поможет нам пометить процесс как критичный, — это RtlSetProcessIsCritical. Ее прототип выглядит так:

NTSYSAPINTSTATUSSTDAPIVCALLTYPERtlSetProcessIsCritical(    IN  BOOLEAN  NewValue,    OUT PBOOLEAN OldValue OPTIONAL,    IN  BOOLEAN  CheckFlag);

Чтобы эта функция сработала, перед ее вызовом нужно будет получить привилегию SeDebugPrivilege. Это можно сделать через «обычные» функции WinAPI.

BOOL setPrivileges(LPCTSTR szPrivName){    TOKEN_PRIVILEGES tp = { 0 };    HANDLE hToken = 0;    tp.PrivilegeCount = 1;    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))        std::cout << "OpenProcessToken failed\n";    if (!LookupPrivilegeValue(NULL, szPrivName, &tp.Privileges[0].Luid))        std::cout << "LookupPrivilegeValue failed\n";    if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL))    {        std::cout << "AdjustTokenPrivileges failed\n";        CloseHandle(hToken);        return TRUE;    }    return FALSE;}

Вызов функции для получения SE_DEBUG_NAME будет таким:


Скачать:









Важно:


Все статьи и материал на сайте размещаются из свободных источников. Приносим свои глубочайшие извинения, если Ваша статья или материал была опубликована без Вашего на то согласия.
Напишите нам, и мы в срочном порядке примем меры.





Заходи на mc.foxygame.ru:25565

Советуем прочитать