LINUX.ORG.RU

Перехват системных вызовов

 ,


0

1

Здравствуйте. Мне нужно написать программу которая перехватывает системные вызовы open,read,write,close. Смысл в том чтобы перехватывать эти системные вызовы и писать в файл логов например фразу: «Системный вызов open для файла test выполнен программой mc 28.04.19 в 21:00»(Фраза взята к примеру) Разумеется в начале нужно следить за всеми файлами в операционной системе, но в дальнейшем будет список файлов за которыми нужно будет следить(писать в лог если есть данный файл в списке). Ядро 4.15.3. Само ядро пересобирать нельзя. Вот собственно в сторону чего копать?

не знаю как насчет всех файлов, но для списка возможно подойдет auditd

anonymous ()
Ответ на: комментарий от monk

еще кстати не понятно можно ли как то получить имя приложения которое инициировало системный вызов. Допустим файл был создан в mc

kold2015 ()

Systemtap, ну или kprobe.

mv ★★★★★ ()
Ответ на: комментарий от i-rinat

В принципе inotify подходит. Но правда узнать приложение которое инициировало системный вызов не получиться через него.

kold2015 ()
Ответ на: комментарий от kold2015

Ты всё равно работаешь от рута, раз перехватывать собрался.

anonymous ()

Systemtap, уже сказали?

Ну или хуки для системных вызовов свои писать.

Moisha_Liberman ★★ ()
Ответ на: комментарий от anonymous

Есть модуль тестовый который перехватывает системные вызовы подменяя таблицу. В hooke open я получаю данные которые мне нужны имя файла, имя программы (current->comm), и pid пользователя(get_current->user()->uid). Вопрос в следующем: как мне передать все эти данные в пользовательское пространство. Следует это делать через файл или еще чего?

kold2015 ()
Ответ на: комментарий от kold2015

Можно двояко.

Вариант номер один — писать в своё какое-то место (чисто для своих задач определённое) в файловую систему /proc из kernel space и читать из /proc/где-то/там в user space.

Вариант номер два — дополнить систему хуков своим сисколлом или сисколлами, если их много. И с ним работать. Т.е., в приложении в user space, при необходимости вызывать что-то типа своей ф-ии gimme_data() и получать в возвращаемом значении некие данные (или заполненную структуру данных) из этого сисколла. Т.е., надо дополнять тогда Ваш хук для open().

Ну вот как-то вот так.

Moisha_Liberman ★★ ()
Последнее исправление: Moisha_Liberman (всего исправлений: 1)
Ответ на: комментарий от kold2015

Хммм...

Тогда лучше первый вариант.

Но тогда, чтобы получать изменения практически сразу, в приложении user space выставить наблюдение за файлами или каталогами в proc (куда писать будете) через механизм inotify (если ядро до 2.4, то dnotify).

Так-то, оно конечно можно и в «просто файлы» писать, на диске, но это будет скорее всего чуть медленнее, т.к. proc это псевдофайловая система, расположенная в RAM.

Moisha_Liberman ★★ ()
Ответ на: Хммм... от Moisha_Liberman

В принципе можно как вариант в настройках rsyslog.conf указать чтобы он перенаправлял логи ядра .kern в пайп. Предварительно создав пайп командой mkfifo. А при перехвате системных вызовов просто делать printk. Bсе сообщения для ядра попадут в пайп. Пайп открыть в пользовательской программе и уже там парсить Правда в этом случаем /var/log/syslog и /var/log/kernel.log будут жиреть на глазах(при перехвате open,read,write,close). и как вариант их по таймеру обнулять раз в 10 секунда

kold2015 ()
Ответ на: комментарий от kold2015

Эта функция не используется. Возможно, она очень нужна была в процессе отладки.

Я просто решил сообщить @ilammy об уже существующей функции, чтобы в следующий раз он сэкономил немного времени.

i-rinat ★★★★★ ()
Ответ на: комментарий от i-rinat

В ядре есть

Штабле апи нонсенс.тхт

anonymous ()
Ответ на: Да. от Moisha_Liberman

Появилась такая проблемка. Перехватывая системные вызовы read и write я знаю только файловый дескриптор(1 параметр). Так вот а как-нибудь можно из под ядра по файловому дескриптору получить полное имя файла?

kold2015 ()

Смысл в том чтобы перехватывать эти системные вызовы и писать в файл логов например фразу: «Системный вызов open для файла test выполнен программой mc 28.04.19 в 21:00»(Фраза взята к примеру) Разумеется в начале нужно следить за всеми файлами в операционной системе, но в дальнейшем будет список файлов за которыми нужно будет следить(писать в лог если есть данный файл в списке). Ядро 4.15.3. Само ядро пересобирать нельзя. Вот собственно в сторону чего копать?

Если задача не в том, чтобы написать это с нуля, а в том, чтобы получить рабочее решение, то это уже реализовано в auditd.

Если разрабатывать, то кроме inotify есть ещё разнообразные механизмы инструментации ядра и юзерспейса: гуглить в сторону systemtap, dtrace и так далее.

Deleted ()
Ответ на: комментарий от kold2015

Можно через proc опять же.

Посмотрите /proc/$PID/fd/, там можно получить соответствие fd, открытому в процессе полному пути открытого файла. Например, для Qt Creator для Sailfish OS, с PID == 1462,

ls -la  /proc/1462/fd
, выдаст ряд файлов типа 84 -> /home/username/SailfishOS/documentation/nemo-qml-plugin-dbus190226.qch, т.е., у процесса с PID == 1462, в fd == 84, будет файл документации. И т.д. и т.п., там все файловые дескрипторы, открытые данным процессом.

На всякий случай допишу что в /proc/$PID/fdinfo есть данные о текущем положении в файле и т.д. и т.п. Посмотрите man на proc.

В принципе, так-то, можно было бы и не писать хуки, а просто взять под наблюдение данную псевдо ФС и, как только появлялся бы новый каталог с новым pid, начинать отслеживать подкаталог fd... Но тут уже я не знаю как лучше.

Moisha_Liberman ★★ ()
Последнее исправление: Moisha_Liberman (всего исправлений: 1)

Если ты не пишешь часть операционки с уровнем доступа к этим операциям, ты просто не сможешь получить к этому доступ.

Для какой операционки ты это делаешь? Тебе дали разрешение для написания программ такого уровня доступа? Троян пишешь?

HIS ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.