我希望在这些系统调用返回后立即使用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);
答案 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基础架构,并且只需最少的努力即可获得所需的跟踪。