使用kretprobes post handler获取syscall参数

时间:2011-12-08 20:20:00

标签: architecture linux-kernel kernel tracing kernel-module

我希望在这些系统调用返回后立即使用LKM跟踪sys_connect和sys_accept。 我发现通过定义一个post处理程序,kprobes可以在探测到的系统调用返回时访问寄存器。

我的问题是我不知道如何从post处理程序中的数据中获取系统调用参数(即struct pt_regs) post处理程序的定义如下:

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

1 个答案:

答案 0 :(得分:5)

此结构取决于体系结构,因此我假设您使用的是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被调用时),所以在这里你需要注册两个处理程序,一个在入口处,您可以从中保存指向结构套接字的指针,一个在退出处,您将从中实际检查结构套接字的内容,现在它已被填充。要在两个处理程序之间传递数据,您可以使用data结构的归档kretprobe_instance。注册kretprobe时,请不要忘记增加data_size struct kretprobe字段。

这可能看起来有点复杂,但是一旦你对它更熟悉就应该没问题。

还请记住,如果您需要做的唯一事情就是跟踪这些事件,您可能只需在sysfs中使用ftrace基础架构,并且只需最少的努力即可获得所需的跟踪。