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

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

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

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


http://www.vr-online.ru

Ковыряем права доступа к объектам

Продолжаем знакомиться с функциями определения прав доступа к объектам и сегодня нам предстоит научиться определять, кому и какие права доступны в отношении определенного объекта. Тема будет интересна не только программистам, потому что, прочитав статью, ты лучше поймешь, как Windows хранит списки доступа к объектам и как они организованы. Тут программистам на Delphi не очень повезло, потому что в заголовочных файлах описано не все, и кое-что нам придется описывать самостоятельно. Но обо всем по порядку.

Получение указателя на DACL

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

Пока не будем заострять внимание на том, что представляет из себя этот список, если ты не знаешь, то скоро все встанет на свои места. Давай пока научимся получать сам DACL. Для этого используется функция GetNamedSecurityInfo. В общем виде она выглядит следующим образом:

function GetNamedSecurityInfo(

pObjectName: PAnsiChar;

ObjectType: SE_OBJECT_TYPE;

SecurityInfo: SECURITY_INFORMATION;

ppsidOwner,

ppsidGroup: PPSID;

ppDacl,

ppSacl: PACL;

var ppSecurityDescriptor: PSECURITY_DESCRIPTOR

): DWORD;

Рассмотрим параметры этой функции, тут есть над чем пораскинуть мозгами:

PObjectName – имя объекта, список которого мы хотим получить. Если это файл, то необходимо указать корректный путь, чтобы программа смогла найти его. Если это имя сервиса или принтера, то имя должно выглядеть так: \\имя_компьютера\имя_объекта, где имя_объекта – это имя сервиса или принтера.

ObjectType – определяет тип объекта. Здесь можно указать одну из следующих констант:

- SE_FILE_OBJECT – файл или директория;

- SE_SERVICE – сервис;

- SE_PRINTER – принтер;

- SE_REGISTRY_KEY– ключ реестра;

- SE_LMSHARE – расшаренный ресурс;

- SE_KERNEL_OBJECT – объект ядра (процесс, поток, семафор, событие ...);

- SE_WINDOW_OBJECT – окно или объект рабочего стола.

Глядя на эти константы, становится ясно, что именно может защищать Windows с помощью списков доступа. Главное, чтобы он делал это хорошо.

SecurityInfo – это комбинация флагов, по которой определяется, что именно мы хотим узнать. Здесь можно указать комбинацию из флагов:

- OWNER_SECURITY_INFORMATION – идентификатор владельца. Если указан этот флаг, то результат будет получен через переменную ppsidOwner;

- GROUP_SECURITY_INFORMATION – идентификатор группы. Если указан этот флаг, то результат будет получен через переменную ppsidGroup;

- DACL_SECURITY_INFORMATION – список DACL. Если указан этот флаг, то результат будет получен через переменную ppDacl;

- SACL_SECURITY_INFORMATION – список SACL. Если указан этот флаг, то результат будет получен через переменную ppSacl;

ppSecurityDescriptor – Через этот параметр нам будет возвращен дескриптор безопасности.

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