Я бы порекомендовал использовать kprobes для такого рода работы, вы можете легко разбить любой адрес ядра (или символ ...) и изменить путь выполнения, все это во время выполнения, с помощью модуля ядра, если вам нужно:)
Kprobes работает, динамически заменяя инструкцию (например, первую инструкцию вашей записи системного вызова) на разрыв (например, int3 на x86).Внутри обработчика do_int3 уведомитель уведомляет kprobes, который, в свою очередь, передает выполнение вашей зарегистрированной функции, после чего вы можете делать почти все.
Очень хорошая документация приведена в Documentation / kprobes.txt так, как крошечный пример в samples / kprobes / kprobes_example.c (в этом примере они ломаются на do_fork, чтобы регистрировать каждый форк в системе).Он имеет очень простой API и в настоящее время очень переносим.
Предупреждение : если вам нужно изменить путь выполнения, убедитесь, что ваши kprobes не оптимизированы (например, инструкция jmp для вашего обработчика)заменяет инструкцию, на которую вы разбиваете, вместо int3) в противном случае вы не сможете по-настоящему легко изменить выполнение (после повторения вашей функции функция syscall будет по-прежнему выполняться как обычно).Если вас интересует только отслеживание, это нормально, и вы можете спокойно проигнорировать эту проблему.