Невозможно отучить людей изучать самые ненужные предметы.
Введение в CSS
Преимущества стилей
Добавления стилей
Типы носителей
Базовый синтаксис
Значения стилевых свойств
Селекторы тегов
Классы
CSS3
Надо знать обо всем понемножку, но все о немногом.
Идентификаторы
Контекстные селекторы
Соседние селекторы
Дочерние селекторы
Селекторы атрибутов
Универсальный селектор
Псевдоклассы
Псевдоэлементы
Кто умеет, тот делает. Кто не умеет, тот учит. Кто не умеет учить - становится деканом. (Т. Мартин)
Группирование
Наследование
Каскадирование
Валидация
Идентификаторы и классы
Написание эффективного кода
Вёрстка
Изображения
Текст
Цвет
Линии и рамки
Углы
Списки
Ссылки
Дизайны сайтов
Формы
Таблицы
CSS3
HTML5
Блог для вебмастеров
Новости мира Интернет
Сайтостроение
Ремонт и советы
Все новости
Справочник от А до Я
HTML, CSS, JavaScript
Афоризмы о учёбе
Статьи об афоризмах
Все Афоризмы
Помогли мы вам |
Дело в том, что хорошо организовать защиту процесса от завершения, когда пользователь работает под учетной записью администратора, практически невозможно. Есть разные полумеры, но на полноценную защиту они?не тянут. Например, можно использовать драйверы режима ядра, но в 64-битных операционных системах не так просто преодолеть механизм Kernel Patch Protection. Остается прибегать к трюкам вроде того, который мы разберем.
Давай посмотрим, как создать критичный процесс в Windows, как проверить, что процесс является критичным, и как его?завершить без падения системы в BSOD. Строго говоря, создавать мы будем не процесс, а критичный поток. Ведь процесс в Windows — это что-то вроде контейнера для потоков, в которых и выполняется код.
Весь код, который я привожу в статье, настоятельно рекомендую исполнять только в?виртуальной машине, потому что завершение критического процесса вызовет общесистемный сбой и падение системы в BSOD с кодом CRITICAL_PROCESS_DIED
и возможной потерей данных. Все тесты я проводил в VirtualBox на Windows 10 LTSB x64 в качестве хоста.
Зачем используется флаг critical?
Есть несколько методов, которые помогут нам создать критичный?процесс. Все они основаны на манипуляции вызовами NTAPI (Native Windows API), самыми «низкоуровневыми», которые можно выполнить в режиме пользователя. Эти функции экспортируются ntoskrnl.exe
. Через обертку ntdll.dll
мы сможем получить их адреса и вызвать их.
Первая функция Native API, которая поможет нам пометить процесс как критичный, — это RtlSetProcessIsCritical
. Ее прототип?выглядит так:
NTSYSAPI
NTSTATUS
STDAPIVCALLTYPE
RtlSetProcessIsCritical(
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 failedn";
if (!LookupPrivilegeValue(NULL, szPrivName, &tp.Privileges[0].Luid))
std::cout "LookupPrivilegeValue failedn";
if (!AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL))
{
std::cout "AdjustTokenPrivileges failedn";
CloseHandle(hToken);
return TRUE;
}
return FALSE;
}
Вызов функции для получения SE_DEBUG_NAME
будет таким:
|
|