Кормораздатчик мобильный электрифицированный: схема и процесс работы устройства...

Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...

Прогон программы получения списка привилегий из маркера доступа процесса

2017-06-11 526
Прогон программы получения списка привилегий из маркера доступа процесса 0.00 из 5.00 0 оценок
Заказать работу

Вверх
Содержание
Поиск

В качестве примера рассмотрим программу, задача которой - получение перечня привилегий пользователя и его групп из маркера доступа данного процесса.

#include <windows.h>

#include <stdio.h>

#pragma hdrstop

 

void main()

{

HANDLE hToken;

LUID setcbnameValue;

TOKEN_PRIVILEGES tkp;

DWORD errcod;

LPVOID lpMsgBuf;

LPCTSTR msgptr;

 

UCHAR InfoBuffer[1000];

PTOKEN_PRIVILEGES ptgPrivileges = (PTOKEN_PRIVILEGES) InfoBuffer;

DWORD dwInfoBufferSize;

DWORD dwPrivilegeNameSize;

DWORD dwDisplayNameSize;

UCHAR ucPrivilegeName[500];

UCHAR ucDisplayName[500];

DWORD dwLangId;

UINT i;

 

if (! OpenProcessToken(GetCurrentProcess(),

TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))

{

puts("OpenProcessToken");

return;

}

 

GetTokenInformation(hToken, TokenPrivileges, InfoBuffer,

sizeof InfoBuffer, &dwInfoBufferSize);

 

printf("Account privileges: \n\n");

for(i = 0; i < ptgPrivileges->PrivilegeCount; i ++)

{

dwPrivilegeNameSize = sizeof ucPrivilegeName;

dwDisplayNameSize = sizeof ucDisplayName;

LookupPrivilegeName(NULL, &ptgPrivileges->Privileges[i].Luid,

(char *)ucPrivilegeName, &dwPrivilegeNameSize);

LookupPrivilegeDisplayName(NULL, (char *)ucPrivilegeName,

(char *)ucDisplayName, &dwDisplayNameSize, &dwLangId);

printf("%s (%s)\n", ucPrivilegeName, ucDisplayName);

}

 

}

Задача приведенной программы - получить описатель текущего процесса при помощи функции OpenProcessToken и применить функцию GetTokenInformation для извлечения из него списка привилегий. Функция LookupPrivilegeName позволяет получить программное имя привилегии по ее локальному идентификатору (Luid), а функция LookupPrivilegeDisplayName преобразует программное имя привилегии в дружественное имя.

Включение и отключение привилегий в маркере

Большую часть информации в маркере менять нельзя. Например, нельзя ни добавить, ни удалить привилегию. Согласно [4], [5], возможность добавления привилегий в маркер представляла бы собой "глубокий подкоп под систему защиты Windows". Последнее означает, что изменение привилегий субъекта - прерогатива подсистемы локальной авторизации (LSA) и должно осуществляться централизовано только при помощи функций семейства LSA (см. лекцию 14).

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

Перевоплощение

В ОС Windows имеются интересные возможности выполнения кода с маркером, отличным от маркера данного процесса. Это, например, существенно для серверов, которые должны выступать от имени и с привилегиями клиентов. Одна из таких возможностей - запуск нового процесса с указанным маркером при помощи функции CreateProcessAsUser. Эта функция является аналогом функции CreateProcess за исключением параметра hToken, который указывает на маркер, определяющий контекст пользователя нового процесса.

Другой способ выполнить код с заимствованным маркером - осуществить перевоплощение (impersonation). Перевоплощение означает, что один из потоков процесса функционирует с маркером, отличным от маркера текущего процесса. В частности, клиентский поток может передать свой маркер доступа серверному потоку, чтобы сервер мог получить доступ к защищенным файлам и другим объектам от имени клиента. Впоследствии поток может вернуться в нормальное состояние, то есть использовать маркер процесса.

Windows не позволяет серверам выступать в роли клиентов без их ведома. Чтобы избежать этого, клиентский процесс может ограничить уровень имперсонации. Поэтому для участия в перевоплощении маркер должен иметь соответствующий уровень перевоплощения. Этот уровень определяется параметром маркера TokenImpersonationLevel и может быть запрошен функцией GetTokenInformation. Для процесса перевоплощения важно, чтобы этот параметр имел значение не ниже SecurityImpersonation, что означает возможность имперсонации на локальной машине. Значение SecurityDelegation позволяет серверному процессу выступать от имени клиента, как на локальном, так и на удаленном компьютере. Последнее значение имеет отношение к делегированию, которое является естественным развитием перевоплощения, но работает только при наличии домена и функционировании активного каталога. По умолчанию устанавливается уровень SecurityImpersonation.

Маркер перевоплощения обычно создают путем дублирования существующего маркера и придания ему нужных прав доступа и уровня имперсонации. Это можно сделать при помощи функции DuplicateTokenEx. Собственно перевоплощение осуществляется при помощи функции ImpersonateLoggedOnUser. Чтобы вернуться в исходное состояние, поток должен вызвать функцию RevertToSelf.

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


Поделиться с друзьями:

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...

История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.011 с.