$banner_comment_start
CRACKL@B Оригинальный DVD-ROM крэкера: CRACKL@B DVD !
Домой | Статьи | RAR-cтатьи | Форум | Программирование | Скачать | DVD-ROM
Новичку | FAQ | Ссылки | Интервью | Архив | Новости | Связь


Русский / Russian English / Английский

Сейчас на форуме: crypto, RaMMicHaeL, Ara (+7 невидимых пользователей)
 · Начало · Статистика · Регистрация · Поиск · ПРАВИЛА ФОРУМА · Язык · RSS ·

 CRACKL@B —› Программирование —› Перехват NtOpenFile - запрет доступа к файлу...
Посл.ответ Сообщение
shadow_warrior

Ранг: 2.0 (гость)
Статус: Участник

Создано: 6 июня 2006 21:05:37 · Поправил: shadow_warrior
Личное сообщение #1

Здравствуйте!
Пытаюсь заблокировать доступ к файлу, т.е. чтобы при поптке его открыть возвращался код ошибки типа ACCESS_DENIED.
Через драйвер делаю перехват сервиса NtOpenFile, обрабатываю так:


// . . .
NTSTATUS ReNtOpenFile
(
OUT PHANDLE FileHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes,
OUT PIO_STATUS_BLOCK IoStatusBlock,
IN ULONG ShareAccess,
IN ULONG OpenOptions
)
{
DbgPrint("NtOpenFile: %ws", ObjectAttributes->ObjectName->Buffer);

// сравнение имени открываемого файла с тем что надо блокировать
if (_wcsnicmp(ObjectAttributes->ObjectName->Buffer, L"\\??\\C:\\LockMe.xxx",
ObjectAttributes->ObjectName->Length) == 0)
{ // если это тот самый файл
DbgPrint("!!! EQU !!!");

// СОМНИТЕЛЬНОЕ МЕСТО - НИЧЕГО ДРУГОГО ПРИДУМАТЬ НЕ СМОГ
*FileHandle = NULL; //
IoStatusBlock->Status = STATUS_ACCESS_DENIED;

return STATUS_ACCESS_DENIED;
}
else
{ // если это какой либо другой файл - отдаем системному сервису...
DbgPrint("!!! __NOT__ EQU !!!");

// вызов настоящего NtOpenFile
return SysOpenFile(FileHandle, DesiredAccess, ObjectAttributes, IoStatusBlock, ShareAccess, OpenOptions);
}
}

// . . .


Проблема в том, что файл C:\LockMe.xxx при всем этом _открывается_, хотя судя по отладочным сообщениям, эта ветка моего кода получает управление.
Странным мне это кажется, т.к. если в обработчике _сразу_ делать return STATUS_ACCESS_DENIED блокируется доступ ко всем файлам.

Что я делаю не так? Возможно вообще не то перехватываю (может попробывать IoCreateFile?).
Кто знает, подскажите пожалуйста.
intty


Ранг: 122.4 (ветеран)
Статус: Участник

Создано: 6 июня 2006 22:22:09
Личное сообщение #2

а что если FileHandle = 0xFFFFFFFF ?
Archer


Ранг: 761.6 (! !)
Статус: Модератор
Packers killer

Создано: 6 июня 2006 22:27:33
Личное сообщение #3

ну лично я делал так:
if(memcmp(BadFile,ObjectAttributes->ObjectName->Buffer,20)==0)
{
DebugPrint(("BAD CreateFile called!\n"));
(*IoStatusBlock).Status=FILE_DOES_NOT_EXIST;
return -1;
}
Ms-Rem


Ранг: 120.6 (ветеран)
Статус: Участник
rootkit developer

Создано: 6 июня 2006 22:37:57
Личное сообщение #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 при чтении, это уже баг на запись в память ядра, и возможно поднятие привилегий.

Вот такие вот дела...

-----
Скажем дружно - нафиг нужно.
Ms-Rem


Ранг: 120.6 (ветеран)
Статус: Участник
rootkit developer

Создано: 6 июня 2006 22:38:52
Личное сообщение #5

Archer
И еще один пишет драйвера непрямыми руками

-----
Скажем дружно - нафиг нужно.
DrGolova


Ранг: 160.0 (ветеран)
Статус: Участник
www.uinc.ru

Создано: 7 июня 2006 01:51:01 · Поправил: DrGolova
Личное сообщение #6

Просто открой его из драйвера в эксклюзивном режиме (ShareAccess == 0) и никто его по человечески больше открыть не сможет
shadow_warrior

Ранг: 2.0 (гость)
Статус: Участник

Создано: 7 июня 2006 07:35:21 · Поправил: shadow_warrior
Личное сообщение #7

To MS-Rem:
1) Согласен полностью - сей код чисто "на посмотреть на форуме" дабы кто-то ответил на основной вопрос. В реале ф-ия покрупнее будет (с проверками все ок) и всю ее выкладывать - отмимать чье то время.
2-3-4) Тоже понятно, но мне бы _сейчас_ хоть _так_ заставить это работать
5) Это да )) не заметил что то...
6) то что и к 1)
За критику спасибо, но я помощь попросил, а не...
Ваше обращение к Archer это еще и в мою сторону камень. При всем увежении в Вам MS-Rem, но вы от рождения дрова пишете, или тоже когда то начинали?
Меня интересует почему даже _так_ не работает.

Что же все также должен возвращать NtOpenFile в таких ситуациях?
infern0

Ранг: 160.2 (ветеран)
Статус: Участник

Создано: 7 июня 2006 09:49:02
Личное сообщение #8

shadow_warrior пишет:
Что же все также должен возвращать NtOpenFile в таких ситуациях?

ну открой несуществующий файл и посмотри что она возвращает...
Ms-Rem


Ранг: 120.6 (ветеран)
Статус: Участник
rootkit developer

Создано: 7 июня 2006 09:55:50
Личное сообщение #9

shadow_warrior пишет:
Меня интересует почему даже _так_ не работает.


Тебе уже обьяснили почему не работает. Из за кривого сравнения имени файла. И из за того, что файл открывается еще через ZwCreateFile. Неужели трудно взять отладчик и проверить, вместо того, чтобы задавать глупые аопросы?

-----
Скажем дружно - нафиг нужно.
doctor Ice

Ранг: 75.9 (постоянный)
Статус: Участник

Создано: 7 июня 2006 10:20:05
Личное сообщение #10

DrGolova
Просто открой его из драйвера в эксклюзивном режиме (ShareAccess == 0) и никто его по человечески больше открыть не сможет

сможет через CreateFile =) ....но не совсем по человечески
 CRACKL@B —› Программирование —› Перехват NtOpenFile - запрет доступа к файлу...
    Для печати 


Оригинальный DVD-ROM крэкера: CRACKL@B DVD !


Вы находитесь на форуме сайта CRACKLAB.RU
Проект ReactOS