Я некоторое время работал над проектом, и первым шагом является создание библиотеки трассировок системных вызовов для процессов. По сути, я пытаюсь создать систему, в которой каждый раз, когда процесс запрашивает службу ОС через системный вызов, соответствующая информация (вызывающий процесс, время, имя системного вызова) события записывается в файл.
Теоретически, это звучит как достаточно простая вещь, однако ее реализация со временем становится все более болезненной. Я полагаю, что основной причиной, которая вызывает у меня проблемы, является общее отсутствие знания, с чего начать реализацию.
Первоначально я думал, что все это можно решить, добавив несколько строк кода к точке входа в ядро, но немного покопавшись в entry_64.S, я пришел к выводу, что должно быть более простой способ. Следующая идея, которая у меня возникла, состояла в том, чтобы переписать все службы, на которые указывает sys_call_table, моей собственной службой, которая выполняла ведение журнала, а затем вызывала исходную службу. Но, оказывается, у этого метода есть некоторые трудности с linux kernel 5.4.18 из-за того, что sys_call_table больше не экспортируется. И даже при перекомпиляции ядра для экспорта sys_call_table таблица находится в защищенном месте памяти. Наконец, я экспериментировал с auddd. В частности, я следовал по этой ссылке , но, похоже, она не работает (когда я выполнил команду kill, был только соответствующий результат в ausearch около 50% времени на основе меток времени).
Я все время зацикливаюсь на этих тупиках, и я действительно надеюсь наконец-то запустить этот первый этап в моем проекте. У кого-нибудь есть указания относительно того, что мне следует попробовать?
Решение: BPFTrace был именно тем, что я искал.