Pan*_*nos 1 architecture trace kernel kernel-module linux-kernel
我希望在这些系统调用返回后立即使用LKM跟踪sys_connect和sys_accept.我发现通过定义一个post处理程序,kprobes可以在探测到的系统调用返回时访问寄存器.
我的问题是我不知道如何从我在post处理程序中的数据中获取系统调用参数(即struct pt_regs).后处理程序的定义如下:
void post_handler(struct kprobe *p, struct pt_regs *regs, unsigned long flags);
Run Code Online (Sandbox Code Playgroud)
这种结构依赖于体系结构,因此我假设您使用的是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...)
Run Code Online (Sandbox Code Playgroud)
退出时:
orig_eax = return value of the function
Run Code Online (Sandbox Code Playgroud)
你不能假设ebx,ecx,edx里面的值仍然指向退出时函数的参数(即当调用你的post_handler时),所以在这里你需要注册两个处理程序,一个在入口,你从中可以保存指向结构套接字的指针,并在退出时保存一个指针,从中实际检查结构套接字的内容,现在它已被填充.要通过两个处理器之间的数据,则可以使用申请data
中的kretprobe_instance
结构.当您注册kretprobe时,不要忘记增加data_size
归档struct kretprobe
.
这可能看起来有点复杂,但一旦你对它更加熟悉就应该没问题.
还要记住,如果您需要做的唯一事情是跟踪这些事件,您可能只需在sysfs中使用ftrace基础结构,并且只需最少的努力即可获得所需的跟踪.
归档时间: |
|
查看次数: |
1041 次 |
最近记录: |