Издательский дом ООО "Гейм Лэнд"ЖУРНАЛ ХАКЕР #92, АВГУСТ 2006 г.

Железобетонные объекты

Фленов Михаил aka Horrific

Хакер, номер #092, стр. 092-113-2


Sbz1 – этот параметр не используется и должен быть равен нулю (предназначен только для выравнивания).

Control – это поле имеет тип данных Word и содержит флаги.

Owner – идентификатор безопасности SID владельца.

Group – идентификатор безопасности SID группы.

SAcl – указатель на SACL;

DAcl – указатель на DACL;

Работа с дескриптором

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

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

Для инициализации дескриптора безопасности используем WinAPI-функцию

initializeSecurityDescriptor, которая выглядит следующим образом:

КОД

function InitializeSecurityDescriptor(

pSecurityDescriptor: PSecurityDescriptor;

dwRevision: DWORD

): BOOL; stdcall;

Тут у нас два параметра: указатель на дескриптор безопасности, который нужно инициализировать и номер ревизии. Как мы уже выяснили, ревизия должна быть равна константе SECURITY_DESCRIPTOR_REVISION.

Чтобы установить владельца, используется функция SetSecurityDescriptorOwner, которая выглядит следующим образом:

КОД

function SetSecurityDescriptorOwner(

pSecurityDescriptor: PSecurityDescriptor;

pOwner: PSID;

bOwnerDefaulted: BOOL

): BOOL; stdcall;

Тут три параметра:

- дескриптор, владельца объекта которого нужно изменить;

- указатель на SID пользователя, которого мы хотим установить в качестве владельца;

- нужно ли использовать владельца по умолчанию. Если этот параметр равен true, то владельца назначит ОС в соответствии со своими правилами. А правило простое: создатель становится и владельцем.

Для установки группы используем функцию SetSecurityDescriptorGroup, которая выглядит так:

КОД

function SetSecurityDescriptorGroup(

pSecurityDescriptor: PSecurityDescriptor;

pGroup: PSID;

bGroupDefaulted: BOOL

): BOOL; stdcall;

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

- дескриптор, группу объекта которого нужно изменить;

- указатель на SID группы, которую мы хотим установить в качестве владельца;

- нужно ли использовать группу по умолчанию, то есть понадеяться на ОС.

SID

Списки доступа SACL и DACL пока опустим и не будем с ними заморачиваться, так как это тема отдельной статьи. Сейчас нас интересуют владелец и группа, но, чтобы их установить, необходимо знать соответствующий SID. Да, мы всегда можем использовать значение по умолчанию, которое предоставляет ОС, но определить SID не так уж и сложно. Для этого нужна всего одна функция – LookupAccountName, которая по имени пользователя возвращает идентификатор безопасности SID.

Назад на стр. 092-113-1  Содержание  Вперед на стр. 092-113-3