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

На страже файлов

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

Хакер, номер #094, стр. 094-126-1

http://www.vr-online.ru

Права доступа программно – это просто!

В прошлый раз мы узнали, как можно определить права доступа на определенный файл в NTFS. Сегодня нам предстоит пойти дальше: мы научимся модифицировать таблицу, добавляя или удаляя определенные права доступа. Все это будет происходить из Delphi, программно — никакого колдовства, только ловкость рук и немного смекалки. Не забываем, что права доступа могут быть не только у файлов, но и у других объектов (например, процессов), охраняемых окнами.

Немного теории

Когда я впервые разбирался с дескрипторами, то большинство приходилось определять методом научного тыка. Всезнающий MSDN помогает, но очень слабо, а в интернете эта тема очень плохо освещена — только обрывки информации, да и кода нормального нет. В MSDN описаны только функции и их параметры, а как пользоваться ими, сказано только поверхностно. Как говорил великий и могучий Винни-Пух: «Мед вроде есть, но его сразу нет». Здесь — та же песня: вроде бы функции описаны, но чего-то не хватает.

Давай для начала на пальцах разберемся, как нужно устанавливать права на объект ОС, а потом познакомимся с функциями и практическим примером. Под объектом в данном случае понимаются процессы и файлы, находящиеся на NTFS. Для тех, кто подключился к нам только сегодня, напоминаю, что в FAT32 слишком скудные возможности по защите файлов, и здесь списки ACL не работают. Хотя нет, списки работают везде, но в FAT32 на определенный файл нельзя настраивать права доступа. Если ты все еще используешь FAT, то рекомендую сегодня же конвертнуть его в NTFS. Главное — ничего не бойся.

У каждого объекта есть свой дескриптор. В нем содержится указатель на список ACL, а уже в этом списке можно найти записи, которые определяют права доступа. Самый простой способ удалить определенную запись из списка – скопировать все необходимые записи в новый список и установить их дескриптору, а затем дескриптору назначить файлу. Так как списки в основном не большие и занимают мало места, такой финт ушами пролетит мгновенно.

Чтобы добавить разрешение или запрет, необходимо расширить память для ACL-списка и втиснуть туда новую запись. Можно поступить проще: выделить память для нового списка, достаточную для хранения всех старых записей. Теперь копируем в новый ACL все старые записи и добавляем новую. Остается только назначить созданный список дескриптору, а затем и файлу.

Поехали

Для написания примера нам понадобятся все знания, которые мы получили в двух предыдущих статьях этого небольшого посвящения в безопасность Windows, плюс маленькая корзина новых функций. Давай напишем пример, который будет добавлять в ACL новую разрешающую запись для всех пользователей на определенный файл. В ОС Windows для этого нужно найти SID учетной записи everyone и добавить ее с разрешением GENERIC_ALL в список ACL.

Начнем с поиска SID необходимой записи. Следующий код показывает, как можно найти идентификатор для everyone:

// определяем размер SID

LookupAccountName(nil, 'everyone', nil, sidLength,

nil, sidLengthDomain, sidType);

Содержание  Вперед на стр. 094-126-2
ttfb: 3.4961700439453 ms