URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 1983
[ Назад ]

Исходное сообщение
"Контроль системных вызовов из драйвера Linux"

Отправлено Rex , 14-Авг-03 00:23 
Доброе время суток, All!

Не подскажете как реализовать контроль системных вызовов (open, read, write) к конкретному файлу в модуле ядра Linux.
С sys_call_table и __NR_* const немного знаком. Есть несколько вопросов:
1) При перехвате __NR_open в мой системный вызов не попадает имя контролируемого файла при использовании команды cp (cp /tmp/xxx /tmp/tmp/xxx). В ср что нет open?!
2) Как идентифицировать в системных вызовах read/write etc., что операции производятся именно с моим файлом (/tmp/xxx)?

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


Содержание

Сообщения в этом обсуждении
"Контроль системных вызовов из драйвера Linux"
Отправлено Oleg Vass , 14-Авг-03 12:22 
>Доброе время суток, All!
>
>Не подскажете как реализовать контроль системных вызовов (open, read, write) к конкретному
>файлу в модуле ядра Linux.
>С sys_call_table и __NR_* const немного знаком. Есть несколько вопросов:
>1) При перехвате __NR_open в мой системный вызов не попадает имя контролируемого
>файла при использовании команды cp (cp /tmp/xxx /tmp/tmp/xxx). В ср что
>нет open?!
>2) Как идентифицировать в системных вызовах read/write etc., что операции производятся именно
>с моим файлом (/tmp/xxx)?
>
>Заранее благодарен.

У меня возникла похожая проблема. Я делал обработчик системного вызова
sys_unlink(const char *pathname) с тем чтобы предотвратить случайное удаление некоторых файлов.Но, если для удаления файла использовалась команда "rm file"(т.е. относительный путь), мне было не определить полное имя.
Первая идея состояла в том, чтобы использовать таблицу ядра "current"(тип "current_task"). Далеее current->fs->pwd->d_name.name. Так мы получим имя родительского/рабочего каталога. Дальше нужно пройтись вверх по дереву каталогов, используя "..->pwd->d_parent" до корня. Но, если удаляемый файл находится в примонтированной ФС, корнем будет каталог монтирования.
Хотя я еще не пробовал, но думаю нужно использовать current->fs->mnt и так далее.

Также можно посмотреть, что делает ядро в своем обработчике.


"Контроль системных вызовов из драйвера Linux"
Отправлено Murr , 05-Окт-03 15:14 
>Доброе время суток, All!
>
>Не подскажете как реализовать контроль системных вызовов (open, read, write) к конкретному
>файлу в модуле ядра Linux.
>С sys_call_table и __NR_* const немного знаком. Есть несколько вопросов:
>1) При перехвате __NR_open в мой системный вызов не попадает имя контролируемого
>файла при использовании команды cp (cp /tmp/xxx /tmp/tmp/xxx). В ср что
>нет open?!

Криво ловите, видимо.

>2) Как идентифицировать в системных вызовах read/write etc., что операции производятся именно
>с моим файлом (/tmp/xxx)?

Если модуль ловит обращения к конкретному файлу, то можно его открыть из модуля, а в open проверять (проще всего сдублировать исходную реализацию open) - добавить перед fd_install проверку if (f->f_dentry == myfile->f_dentry) { current->files->fd[fd] = NULL; fput(f); return -EACCES; }

Возможно нужно проверять не dentry, а inode - сами смотрите по смыслу.


"Контроль системных вызовов из драйвера Linux"
Отправлено Bob , 07-Окт-03 12:23 
http://www.samag.ru/img/uploaded/p.pdf