Замените системный вызов в ядре Linux 3 - PullRequest
3 голосов
/ 26 ноября 2011

Я заинтересован в замене системного вызова на пользовательский, который я буду реализовывать в ядре Linux 3. Я читал, что таблица вызовов sys больше не отображается.

Есть идеи?

любая ссылка на этот http://www.linuxtopia.org/online_books/linux_kernel/linux_kernel_module_programming_2.6/x978.html пример, но для ядра 3 приветствуется:)

Спасибо!

Ответы [ 2 ]

6 голосов
/ 27 ноября 2011

Я бы порекомендовал использовать kprobes для такого рода работы, вы можете легко разбить любой адрес ядра (или символ ...) и изменить путь выполнения, все это во время выполнения, с помощью модуля ядра, если вам нужно:)

Kprobes работает, динамически заменяя инструкцию (например, первую инструкцию вашей записи системного вызова) на разрыв (например, int3 на x86).Внутри обработчика do_int3 уведомитель уведомляет kprobes, который, в свою очередь, передает выполнение вашей зарегистрированной функции, после чего вы можете делать почти все.

Очень хорошая документация приведена в Documentation / kprobes.txt так, как крошечный пример в samples / kprobes / kprobes_example.c (в этом примере они ломаются на do_fork, чтобы регистрировать каждый форк в системе).Он имеет очень простой API и в настоящее время очень переносим.

Предупреждение : если вам нужно изменить путь выполнения, убедитесь, что ваши kprobes не оптимизированы (например, инструкция jmp для вашего обработчика)заменяет инструкцию, на которую вы разбиваете, вместо int3) в противном случае вы не сможете по-настоящему легко изменить выполнение (после повторения вашей функции функция syscall будет по-прежнему выполняться как обычно).Если вас интересует только отслеживание, это нормально, и вы можете спокойно проигнорировать эту проблему.

1 голос
/ 27 ноября 2011

Напишите LKM, который был бы более оптимальным. Что вы подразумеваете под заменой, хотите ли вы добавить новый.

...