Объекты ядра

Тема в разделе "WASM.NT.KERNEL", создана пользователем rpy3uH, 13 янв 2008.

  1. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    У меня появилась идея как можно получить доступ объектам к которым запрещён доступ каким-либо методом.

    Допустим есть файл, к которму запрещён доступ на запись. Мы открываем файл с минимальным доступом. потом находим структуру, в которой этот объект описан в ядре. Потом устанавливаем нужные нам флаги в этой структуре, в нашем случае устанавливаем флаг доступа на запись. И записать в файл то что нам требуется. Разумеется всё это делать в Ring0 (в драйвере режима ядра).

    В связи с этим вопрос: является ли поле

    Код (Text):
    1. //ZwQuerySystemInformation
    2. typedef struct _SYSTEM_HANDLE_INFORMATION { // Information Class 16
    3.   ULONG ProcessId;
    4.   UCHAR ObjectTypeNumber;
    5.   UCHAR Flags;
    6.   USHORT Handle;
    7.   PVOID Object;  //<-- -------------ВОТ ЭТО ПОЛЕ--------------------
    8.   ACCESS_MASK GrantedAccess;
    9. } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
    указателем на структуру в ядре описывающую данный объект?

    Главное: где есть описание этих структур (хотя бы для файлов и процессов) ? и вообще будет ли работать такой метод получения максимального доступа к запрещённому объекту?

    Заранее благодарен.
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    rpy3uH
    почитай статью рема, про запись в занятые файлы.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    тема боян=/
    по теме - да, является.

    понимаешь в чем дело.. если ты уже в ринг0, никакие проверки тебе не страшны. во многих функциях в винде даже стоит чтото типа if( KeGetPreviousMode() != KernelMode ) { SeSinglePrivilegeCheck(...); } и все такое.
    то есть если захочешь в вринг0 можно уже сделать че хочешь. главное чтобы было возможно в принципе.
    так что такие темы это имхо бред.
    Зачем?
    Делаем сразу референс обжект , получаем FILE_OBJECT и далее слегка подправить там поля
    339 BOOLEAN ReadAccess;
    340 BOOLEAN WriteAccess;
     
  4. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    получается что :

    указатель полученный таким образом это тоже самое что и

    Код (Text):
    1. typedef struct _SYSTEM_HANDLE_INFORMATION { // Information Class 16
    2. ....
    3.   PVOID Object;  //<-- -------------ВОТ ЭТО ПОЛЕ--------------------
    4. .....
    5. } SYSTEM_HANDLE_INFORMATION, *PSYSTEM_HANDLE_INFORMATION;
    я правильно понял?
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Да. Это указатель на объект ядра, именно этими объектами манипулируют все части ядра.
    Основные типы объектов это:
    KEVENT а так же прочие синхронизационные и др. объекты Ke-части ядра: KDPC, KTIMER, KGUARDED_MUTEX, KMUTEX, KFAST_MUTEX.
    FILE_OBJECT
    DEVICE_OBJECT
    DRIVER_OBJECT
    EPROCESS
    PCALLBACK_OBJECT
    И другие.

    Основная идея заключается в том, что этими объектами манипулируют большинство функций ядра. А те функции, которые должны общаться с пользователем, очевидно, не должны манипулировать указателями ядра из соображений безопасности. Поэтому для процесса строится таблица хендлов, в этой таблице при создании хендла вписывается указатель на объект ядра, с какими правами доступа он открыт и его флаги. Хендл - почти что индекс в этой таблице, точнее, просто индекс, сдвинутый на два бита влево, а младшие два (кажется) бита содержат тоже дополнительные флаги.
    В общих чертах: когда юзеру нужно как-то оперировать с некоторым объектом, например, открыть файл, он вызывает NtCreateFile (в общем случае, так же может быть вин32 обертка CreateFileA/W и так далее), передавая ей имя файла для открытия.
    Она создает FILE_OBJECT нового файла, посылает файловой системе в стек IRP запрос ввода-вывода типа IRP_MJ_CREATE на открытие файла, передавая так же аттрибуты доступа. Файловая система ищет файл, решает, разрешить ли открытие файла и т.д. производит еще некоторые проверки, В результате чего сообщает ответ NtCreateFile'у. Он решает соответственно - удалить ли FILE_OBJECT и вернуть статус ошибки, если что не так, или продолжать удерживать FILE_OBJECT, создать юзеру хендл через ObOpenObjectByPointer, например, и передать его пользователю, сигнализируя об успехе.

    Так вот к чему я это все... Да, указатель там один :)))
     
  6. rpy3uH

    rpy3uH New Member

    Публикаций:
    0
    Регистрация:
    14 сен 2006
    Сообщения:
    503
    понятно. т.е. права доступа хендла хранятся не в самом объекте, а в таблице хендлов. Следовательно достаточно редактировать только таблицу хендлов чтобы поставить для хендла максимальный доступ.