Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Защита объектов ядра






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

typedef struct _SECURITY_ATTRIBUTES {

DWORD nLength;

LPVOID lpSecurityDescriptor;

BOOL bInheritHandle;

} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES;

Параметр nLength должен быть равен размеру структуры (sizeof(SECURITY_ATTRIBUTES)). Это сделано на случай изменения формата структуры в следующих версиях Windows.

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

Параметр bInheritHandle определяет, будет ли этот объект унаследован дочерними процессами при их создании.

Во многих случаях не требуется задавать какие-то специфические права доступа к объекту. В таком случае мы можем передать вместо указателя на эту структуру значение NULL. Значение NULL может быть также использовано в поле lpSecurityDescriptor если требуется обеспечить наследование объекта без задания прав доступа. В этих случаях объект ядра получит дескриптор доступа по умолчанию, который разрешает доступ к нему для всех пользователей в системе.

Необходимо отметить, что защита объектов ядра в полной мере имеется в операционных системах Windows NT, 2000 и XP. Операционные системы Windows 95, 98 и Me игнорируют параметр lpSecurityDescriptor структуры SECURITY_ATTRIBUTES (но используют bInheritHandle!). Поэтому программы, неаккуратно работающие с дескрипторами защиты (а также с другими правами доступа в системе, например к файлам или registry), могут нормально работать со старыми 32-х битными ОС, и не работать с новыми.

Основное правило, которое позволит избежать подобных проблем – не запрашивайте больше прав доступа, чем это действительно необходимо. Например, не используйте «полный доступ» если на самом деле требуется только «чтение», а также внимательно следите за правами доступа к объектам, которые вы создаете сами.

Дескрипторы. Таблица дескрипторов объектов ядра.

Как уже говорилось, объекты ядра защищены от прямого доступа к ним со стороны пользовательских программ. Более того, пользовательской программе не доступны напрямую даже адреса этих структур. Для того, чтобы процесс мог ссылаться на объект ядра операционная система сообщает ему специальное значение – дескриптор (handle), который процесс должен использовать при всех вызовах функций, работающих с этим объектом.

Для того чтобы защитить объекты созданные разными процессами от доступа к ним посторонних процессов, значения дескрипторов зависят от процесса и каждый процесс может использовать только те объекты, дескрипторы которых созданы внутри этого процесса.

Реализовано это с помощью таблиц дескрипторов. При создании каждого процесса в его адресном пространстве выделяется место для хранения таблицы, предназначенной для хранения информации об открытых объектах ядра. Формат этой таблицы не документирован (и может меняться) но известно, что в ней хранится указатель на блок памяти объекта ядра, а также некоторая дополнительная информация об объекте (например, флаг наследования bInheritHandle). Значение дескриптора, используемое при работе с объектом, на самом деле ссылается на запись в этой таблице.

Таким образом, один и тот же объект может иметь разные дескрипторы в разных процессах, или наоборот одинаковым дескрипторам могут соответствовать разные объекты ядра. К счастью таблица дескрипторов используется совместно всеми потоками в рамках одного процесса. Соответственно мы можем спокойно использовать дескрипторы в разных потоках одного процесса.

Рис. Объекты ядра и таблицы дескрипторов.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.