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

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

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

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


Итак, чтобы получить DACL мы должны написать следующую строку кода:

GetNamedSecurityInfo(PChar(Edit1.Text), SE_FILE_OBJECT,

DACL_SECURITY_INFORMATION, nil, nil, PACL(@pDACL), nil, pSD)

При этом переменные pSD и pDACL должны быть объявлены следующим образом:

pSD : PSECURITY_DESCRIPTOR;

pDACL : PACL;

Получение информации

Структуру типа ACL мы получили, но это еще не сама информация. Сам список доступа можно получить с помощью функции GetAclInformation, которая описана следующим образом:

function GetAclInformation(

const pAcl: TACL;

pAclInformation: Pointer;

nAclInformationLength: DWORD;

dwAclInformationClass: TaclInformationClass

): BOOL; stdcall;

Посмотрим на параметры этой функции:

pAcl – указатель на структуру типа TACL, которую мы получили при вызове функции GetNamedSecurityInfo;

pAclInformation – указатель, по которому мы получим результирующую информацию;

nAclInformationLength – размер параметра, указанного в pAclInformation;

dwAclInformationClass – класс необходимой информации. Нас интересует класс AclSizeInformation.

Самое интересное – это второй параметр, через который мы получаем необходимые данные. В функции этот параметр объявлен как простой указатель, но он должен указывать на структуру типа ACL_SIZE_INFORMATION. Я не нашел ее описания в заголовочных файлах Delphi, поэтому благодаря файлу помощи пришел к выводу, что она должна выглядеть следующим образом:

ACL_SIZE_INFORMATION = record

AceCount :DWORD;

AclBytesInUse :DWORD;

AclBytesFree : DWORD;

end;

Итак, получить информацию можно, выполнив следующую строку:

GetAclInformation(pDACL^, @aclInfo, sizeOf(aclInfo), AclSizeInformation)

Первую переменную мы уже объявили, а aclInfo нужно объявить как:

aclInfo : ACL_SIZE_INFORMATION;

Просматриваем список DACL

У нас есть список, и теперь осталось только его просмотреть и определить права доступа. И тут у дельфинистов начинаются проблемы. Список DACL состоит из набора структур ACE и идентификаторов SID. Проблема в том, что структура ACE в Delphi нигде не описана. Если обратиться к файлу помощи по Windows API, то тут описания этой структуры нет. Зато написано, что ACE - это запись в списке контроля доступа.

Существует несколько типов этих записей и в файле помощи перечислено всего четыре. Забегая вперед скажу, что реально их намнооооого больше. Другое дело, что не все они поддерживаются, да и нужны нам только два типа – разрешение и запрещение (ACCESS_ALLOWED_ACE и ACCESS_DENIED_ACE). Но как они выглядят?

Читаем файл помощи дальше и видим, что в начале структуры ACE идет структура ACE_HEADER, а после этого количество и типы параметров зависят от типа ACE. Структуры ACE_HEADER в заголовочных файлах я так же не нашел, но благодаря Help файлу можно определить, что в Delphi она должна выглядеть примерно так:

_ACE_HEADER = record

AceType : BYTE;

AceFlags : BYTE;

AceSize : WORD;

end;

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

Первый параметр структуры – это тип записи. Типов бывает великое множество и их описание можно найти в MSDN, но большинство из них не поддерживается, а нас будет интересовать только ACCESS_ALLOWED_ACE и ACCESS_DENIED_ACE_TYPE.

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