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

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

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

Хакер, номер #093, стр. 093-128-3


Загадочный ACE

С заголовком определились, но что же будет идти после заголовка в записи ACE? Опять приходиться обращаться к MSDN, где мы узнаем, что для записей разрешения и запрещения доступа после заголовка идет два значения: маска доступа типа ACCESS_MASK и число типа DWORD, которое идентификатор SID пользователя или группы, в отношении которого это разрешение действует.

Так как разрешающая и запрещающая запись ACE выглядят одинаково, то мы можем объявить одну структуру следующего вида:

ACCESS_ACE = record

Header : _ACE_HEADER;

Mask : ACCESS_MASK;

SidStart : DWORD;

end;

Просмотр списка

Итак, в переменной aclInfo у нас есть информация о записях ACL. Теперь нужно просто просмотреть его и вывести информацию на экран. Для этого цикл должен выглядеть примерно следующим образом:

for i:=0 to aclInfo.AceCount-1 do

begin

if not (GetAce(pDACL^, i, Pointer(ace))) then

continue;

// Разбор записи ACE

end;

Список ACL содержит только указатели на ACE записи. Напоминаю, что ACL – это список контроля доступа, а ACE – это отдельная запись этого списка. Чтобы получить запись из списка контроля доступа нужно использовать функцию GetAce. Ей передается три параметра:

- указатель на ACL;

- индекс интересующей нас записи;

- указатель на переменную, в которую будет записан результат.

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

ace : ^ACCESS_ACE;

То есть, это указатель на структуру ACCESS_ACE, формат которой мы так тщательно вычисляли благодаря файлу помощи и MSDN.

Разбор записи ACE

Просматривая список, мы получили ACE запись и по ней теперь должны определить, что разрешено, а что запрещено. Но одна запись может быть либо разрешающая, либо запрещающая. Нет такой записи, которая описывала и то и другое сразу. Если нужно что-то запретить, а что-то разрешить, то в списке ACL создается две записи ACE. Одна запись что-то разрешает, а другая что-то запрещает.

Чтобы определить, какая именно перед нами запись, необходимо проверить поле

AceType заголовка ACE записи:

case (ace^.Header.AceType) of

ACCESS_ALLOWED_ACE_TYPE: Это разрешение;

ACCESS_DENIED_ACE_TYPE: Это запрещение;

else Что-то другое;

end;

Константы ACCESS_ALLOWED_ACE_TYPE и ACCESS_DENIED_ACE_TYPE опять же в заголовочных файлах Delphi я не нашел, поэтому их придется описать в проекте самостоятельно следующим образом:

ACCESS_ALLOWED_ACE_TYPE = $00;

ACCESS_DENIED_ACE_TYPE = $01;

Теперь, если это разрешение или запрещение, нужно узнать, что именно разрешается. Об этом можно узнать из параметра mask. Полное описание маски можно найти в MSDN, а основные биты – первые три:

1. Чтение.

2. Запись.

3. Выполнение.

А на какого пользователя или группу влияют данные разрешения? Об этом можно узнать по полю SidStart структуры ACE. Но это всего лишь указатель на идентификатор пользователя/группы. Реальное значение можно определить следующей строкой кода:

Назад на стр. 093-128-2  Содержание  Вперед на стр. 093-128-4