Эта структура зависит от архитектуры, поэтому я предполагаю, что вы используете 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 и с минимальными усилиями получить желаемую трассировку.