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

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

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

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


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

КОД

function LookupAccountName(

lpSystemName,

lpAccountName: PChar;

Sid: PSID;

var cbSid: DWORD;

ReferencedDomainName: PChar;

var cbReferencedDomainName: DWORD;

var peUse: SID_NAME_USE

): BOOL; stdcall;

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

lpSystemName – имя системы. Если этот параметр нулевой, то мы ищем локального пользователя, если нужен SID удаленного пользователя, то необходимо указать здесь имя этой машины;

lpAccountName – имя пользователя, идентификатор которого нам нужен;

Sid – указатель на память, куда будет записан результат;

cbSid – длина буфера, которую мы выделили для параметра Sid, то есть для хранения результирующего идентификатора;

ReferencedDomainName – имя домена;

cbReferencedDomainName – длина буфера ReferencedDomainName;

peUse – переменная типа enum, которая определяет тип учетной записи. Здесь может быть одно из следующих значений:

- SidTypeUser – пользовательский SID;

- SidTypeGroup – SID группы;

- SidTypeDomain - SID доменной учетной записи;

- SidTypeAlias – псевдоним;

- SidTypeDeletedAccount - удаленная учетная запись;

- SidTypeInvalid – некорректный тип;

- SidTypeUnknown – тип неизвестен;

- SidTypeComputer – идентификатор компьютера.

Что такое SID?

Что такое SID хорошо иллюстрирует заголовочный файл windows.pas. Запускаем поиск по трем магическим буквам (нет, не по тем буквам, которые пишутся на заборе, а по SID) и натыкаемся на табличку, которую ты можешь увидеть где-то рядом с этим текстом.

Нетрудно догадаться, что на самом деле SID - это структура, которая состоит из:

SubAuthorityCount – количество записей SubAuthority;

Revision – версия, в ней используются только четыре бита, остальные зарезервированы;

IdentifierAuthority – структура, которая хранит идентификатор SID;

SubAuthority – массив относительных идентификаторов;

Структура IdentifierAuthority имеет следующий вид:

_SID_IDENTIFIER_AUTHORITY = record

Value: array[0..5] of Byte;

end;

Банальный массив из пяти байт.

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

Определение SID

Обрати внимание, что функции LookupAccountName, которую мы только что рассмотрели, необходимо передать указатель на память для хранения идентификатора SID и указать размер. Проблема в том, что нет четко определенного размера идентификатора. Сколько же тогда памяти выделять для хранения результата?

Это легко определить. Достаточно вызвать функцию LookupAccountName, указав в качестве указателя на буфер для хранения SID и в качестве размера буфера нулевое значение. В результате функция вернет ошибку и сообщит, что недостаточно памяти в буфере. А через параметры cbSid и cbReferencedDomainName вернет нам корректные значения необходимых буферов. Теперь мы знаем все необходимое.

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