История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...
История развития пистолетов-пулеметов: Предпосылкой для возникновения пистолетов-пулеметов послужила давняя тенденция тяготения винтовок...
Топ:
История развития методов оптимизации: теорема Куна-Таккера, метод Лагранжа, роль выпуклости в оптимизации...
Характеристика АТП и сварочно-жестяницкого участка: Транспорт в настоящее время является одной из важнейших отраслей народного хозяйства...
Когда производится ограждение поезда, остановившегося на перегоне: Во всех случаях немедленно должно быть ограждено место препятствия для движения поездов на смежном пути двухпутного...
Интересное:
Искусственное повышение поверхности территории: Варианты искусственного повышения поверхности территории необходимо выбирать на основе анализа следующих характеристик защищаемой территории...
Как мы говорим и как мы слушаем: общение можно сравнить с огромным зонтиком, под которым скрыто все...
Что нужно делать при лейкемии: Прежде всего, необходимо выяснить, не страдаете ли вы каким-либо душевным недугом...
Дисциплины:
2017-06-11 | 450 |
5.00
из
|
Заказать работу |
|
|
В качестве примера рассмотрим программу, задача которой - получение текстового значения Sid владельца файла из дескриптора защиты файла.
#define _WIN32_WINNT 0x0500
#ifndef UNICODE
#define UNICODE
#endif
#include <windows.h>
#include <stdio.h>
#include <sddl.h>
#include <Aclapi.h>
void main(void){
PSID pSid;
PSECURITY_DESCRIPTOR pSD;
PACL pDACL;
LPTSTR StringSid = NULL;
ULONG Error;
HANDLE hFile;
hFile = CreateFile(TEXT("MyFile.txt"), READ_CONTROL, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
Error = GetSecurityInfo(hFile,
SE_FILE_OBJECT, // тип объекта
OWNER_SECURITY_INFORMATION | DACL_SECURITY_INFORMATION,
&pSid, // Sid владельца
NULL, // Sid группы
&pDACL, NULL, // списки прав доступа
&pSD // дескриптор защиты);
if(Error!= ERROR_SUCCESS) printf("GetSecurityInfo Error\n");
if (!ConvertSidToStringSid(pSid, &StringSid)) /* память для строки выделяет сама функция */
printf("Convert SID to string SID failed.");
wprintf(L"StringSid %s\n", StringSid);
LocalFree(pSD);
LocalFree(StringSid);
}
Задача данной программы - открыть существующий файл MyFile.txt и применить функцию GetSecurityInfo для извлечения идентификатора безопасности владельца из дескриптора защиты файла. Затем идентификатор преобразуется в текстовую форму и выводится на экран.
Написание, компиляция и прогон программы получения списка контроля доступа к файлу из его дескриптора защиты
На основе предыдущей программы рекомендуется написать программу, которая выводит на экран список прав доступа к обозначенному файлу.
Субъекты безопасности. Процессы, потоки. Маркер доступа
Так же как и объекты, субъекты должны иметь отличительные признаки - контекст пользователя, для того, чтобы система могла контролировать их действия. Сведения о контексте пользователя хранятся в маркере (употребляются также термины "токен", "жетон") доступа. При интерактивном входе в систему пользователь обычно вводит свое имя и пароль. Система (процедура Winlogon) по имени находит соответствующую учетную запись, извлекает из нее необходимую информацию о пользователе, формирует список привилегий, ассоциированных с пользователем и его группами, и все это объединяет в структуру данных, которая называется маркером доступа. Маркер также хранит некоторые параметры сессии, например, время окончания действия маркера. Таким образом, именно маркер является той визитной карточкой, которую субъект должен предъявить, чтобы осуществить доступ к какому-либо объекту.
|
Вслед за оболочкой (Windows Explorer) все процессы (а также все потоки процесса), запускаемые пользователем, наследуют этот маркер. Когда один процесс создает другой при помощи функции CreateProcess, дочернему процессу передается дубликат маркера, который, таким образом, распространяется по системе.
Основные компоненты маркера доступа показаны на рис. 13.2.
Рис. 13.2. Основные компоненты маркера доступа
Включая в маркер информацию о защите, в частности, DACL, Windows упрощает создание объектов со стандартными атрибутами защиты. Как уже говорилось, если процесс не позаботится о том, чтобы явным образом указать атрибуты безопасности объекта, на основании списка DACL, присутствующего в маркере, будут сформированы права доступа к объекту по умолчанию. Настройку стандартной защиты можно осуществить при помощи функции SetTokenInformation. При этом, поскольку объекты в Windows отличаются большим разнообразием, в списке DACL "по умолчанию" можно указать только так называемые базовые права доступа, из которых система будет формировать стандартные права доступа в зависимости от вида создаваемого объекта. То, как это делается и как сформировать список DACL, по умолчанию присутствующий в маркере, подробно описано в [4], [5].
Задание
Осуществить просмотр данных маркера доступа с помощью утилиты WhoAmi
Если процесс обладает правом TOKEN_QUERY доступа к объекту, то большую часть содержимого маркера можно считать при помощи функции GetTokenInformation. Чтобы получить описатель маркера, необходимо воспользоваться функцией OpenProcessToken.
|
В качестве примера рассмотрим программу, задача которой - получение текстового значения Sid владельца процесса из маркера доступа данного процесса.
#define _WIN32_WINNT 0x0500
#ifndef UNICODE
#define UNICODE
#endif
#include <windows.h>
#include <stdio.h>
#include <sddl.h>
void main(void){
DWORD TokenUserBufSize=256;
LPTSTR StringSid;
TOKEN_USER *ptUser;
HANDLE hHeap;
HANDLE hToken = NULL;
hHeap = GetProcessHeap();
ptUser = (TOKEN_USER *)HeapAlloc(hHeap, HEAP_ZERO_MEMORY, TokenUserBufSize);
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
printf("OpenProcessToken Error\n");
if (!GetTokenInformation(hToken, // описатель маркера доступа
TokenUser, // нужна информация о пользователе
ptUser, // буфер для информации
TokenUserBufSize, &TokenUserBufSize))
printf("GetTokenInformation Error\n");;
if (!ConvertSidToStringSid(ptUser->User.Sid, &StringSid))
printf("Convert SID to string SID failed.");
wprintf(L"StringSid %s\n", StringSid);
CloseHandle(hToken);
LocalFree(StringSid);
HeapFree(hHeap,0,ptUser);
}
Задача данной программы - получить описатель текущего процесса при помощи функции OpenProcessToken и применить функцию GetTokenInformation для извлечения из него идентификатора безопасности владельца. После чего идентификатор преобразуется в текстовую форму и выводится на экран.
В следующей лекции будет приведен пример программы получения из маркера доступа информации о привилегиях пользователя.
|
|
Типы сооружений для обработки осадков: Септиками называются сооружения, в которых одновременно происходят осветление сточной жидкости...
Общие условия выбора системы дренажа: Система дренажа выбирается в зависимости от характера защищаемого...
Наброски и зарисовки растений, плодов, цветов: Освоить конструктивное построение структуры дерева через зарисовки отдельных деревьев, группы деревьев...
Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰)...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!