Сейчас на форуме: asfa, bartolomeo, hgdagon (+6 невидимых) |
eXeL@B —› Программирование —› Перехват NtOpenFile - запрет доступа к файлу... |
Посл.ответ | Сообщение |
|
Создано: 06 июня 2006 21:05 · Поправил: shadow_warrior · Личное сообщение · #1 Здравствуйте! Пытаюсь заблокировать доступ к файлу, т.е. чтобы при поптке его открыть возвращался код ошибки типа ACCESS_DENIED. Через драйвер делаю перехват сервиса NtOpenFile, обрабатываю так:
Проблема в том, что файл C:\LockMe.xxx при всем этом _открывается_, хотя судя по отладочным сообщениям, эта ветка моего кода получает управление. Странным мне это кажется, т.к. если в обработчике _сразу_ делать return STATUS_ACCESS_DENIED блокируется доступ ко всем файлам. Что я делаю не так? Возможно вообще не то перехватываю (может попробывать IoCreateFile?). Кто знает, подскажите пожалуйста. |
|
Создано: 06 июня 2006 22:22 · Личное сообщение · #2 |
|
Создано: 06 июня 2006 22:27 · Личное сообщение · #3 |
|
Создано: 06 июня 2006 22:37 · Личное сообщение · #4 Мда, в таком простом коде оказывается можно наделать много ошибок. Вот краткий список всего, что следует учесть: 1) ObjectAttributes->ObjectName->Buffer подобные вещи страшно небезопасны. Если из юзермода будет передан нулевой указатель - то это сразу бсод. К сожалению, это ошибка очень распостраненная. Никогда не принимай указатели из юзермода без должной проверки! 2) Сравнение с "\\??\\C:\\LockMe.xxx" просто блещет своей наивностью. Во-первых, стоит запомнить, что один и тотже файл может быть представлен несколькими разными native именами. Это может быть как \??\C:\LockMe.xxx, так и \device\harddiskvolume1\LockMe.xxx, или даже \??\fignia\hren.txt. Все зависит от того, через какие символические ссылки будет открыт файл. (к слову, некоторые проактивные защиты на этих тонкостях горят). 3) В дополнеии к 2 могу сказать, что файл может быть открыт путем нескольких последовательных вызовов NtOpenFile, с передачей путей к файлу по частям. Смотри назначение поля RootDirectory в OBJECT_ATTRIBUTES. 4) Помимо NtOpenFile файл может быть открыт через NtCreatFile либо скомунизжен у другого процесса путем копирования хэндлов. 5) может быть не FileHandle = NULL, а *FileHandle = NULL ? 6) IoStatusBlock->Status = STATUS_ACCESS_DENIED; А где же опять проверка указателей? Это уже посерьезнее AV при чтении, это уже баг на запись в память ядра, и возможно поднятие привилегий. Вот такие вот дела... ----- Скажем дружно - нафиг нужно. |
|
Создано: 06 июня 2006 22:38 · Личное сообщение · #5 |
|
Создано: 07 июня 2006 01:51 · Поправил: DrGolova · Личное сообщение · #6 |
|
Создано: 07 июня 2006 07:35 · Поправил: shadow_warrior · Личное сообщение · #7 To MS-Rem: 1) Согласен полностью - сей код чисто "на посмотреть на форуме" дабы кто-то ответил на основной вопрос. В реале ф-ия покрупнее будет (с проверками все ок) и всю ее выкладывать - отмимать чье то время. 2-3-4) Тоже понятно, но мне бы _сейчас_ хоть _так_ заставить это работать 5) Это да )) не заметил что то... 6) то что и к 1) За критику спасибо, но я помощь попросил, а не... Ваше обращение к Archer это еще и в мою сторону камень. При всем увежении в Вам MS-Rem, но вы от рождения дрова пишете, или тоже когда то начинали? Меня интересует почему даже _так_ не работает. Что же все также должен возвращать NtOpenFile в таких ситуациях? |
|
Создано: 07 июня 2006 09:49 · Личное сообщение · #8 |
|
Создано: 07 июня 2006 09:55 · Личное сообщение · #9 shadow_warrior пишет: Меня интересует почему даже _так_ не работает. Тебе уже обьяснили почему не работает. Из за кривого сравнения имени файла. И из за того, что файл открывается еще через ZwCreateFile. Неужели трудно взять отладчик и проверить, вместо того, чтобы задавать глупые аопросы? ----- Скажем дружно - нафиг нужно. |
|
Создано: 07 июня 2006 10:20 · Личное сообщение · #10 |
eXeL@B —› Программирование —› Перехват NtOpenFile - запрет доступа к файлу... |