Получить параметры системного вызова с помощью обработчика сообщений kretprobes - PullRequest
1 голос
/ 09 декабря 2011

Я хочу отследить с помощью LKM sys_connect и sys_accept сразу после возврата этих системных вызовов. Я обнаружил, что kprobes может дать вам доступ к регистрам при возврате зондируемого системного вызова, определив обработчик сообщения.

Моя проблема в том, что я не знаю, как получить параметры системного вызова из данных, которые у меня есть в обработчике поста (т.е. struct pt_regs) Обработчик сообщений определяется так:

void post_handler(struct kprobe *p, struct pt_regs *regs, unsigned long flags);

1 Ответ

5 голосов
/ 09 декабря 2011

Эта структура зависит от архитектуры, поэтому я предполагаю, что вы используете x86.

На входе:

  orig_eax = syscall_nr;
  ebx = 1st argument of the function;
  ecx = 2nd arg...
  edx = 3rd arg...
  esi = 4th arg...
  edi = 5th arg... (you are lucky, on other arch this can be on the stack...)

На выходе:

  orig_eax = return value of the function

Вы не можете предполагать, что значение внутри ebx, ecx, edx ... по-прежнему указывает на аргумент функции при выходе (т.е. когда вызывается ваш post_handler), поэтому здесь вам нужно зарегистрировать two обработчики, один на входе, из которого вы можете сохранить указатель на сокет структуры, и один на выходе, из которого вы фактически будете проверять содержимое сокета структуры теперь, когда он заполнен. Для передачи данных между двумя обработчиками вы можете использовать поле data структуры kretprobe_instance. Не забудьте увеличить data_size поле struct kretprobe при регистрации вашего kretprobe.

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

Пожалуйста, помните, что если вам нужно только отслеживать эти события, вы можете просто использовать инфраструктуру ftrace в sysfs и с минимальными усилиями получить желаемую трассировку.

...