Доброе время суток, 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)?Заранее благодарен.
>Доброе время суток, 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 и так далее.Также можно посмотреть, что делает ядро в своем обработчике.
>Доброе время суток, 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 - сами смотрите по смыслу.
http://www.samag.ru/img/uploaded/p.pdf