kprobe内核调试unlink系统调用
前言:kprobe内核调试unlink系统调用
参考文章:https://www.kernel.org/doc/html/latest/trace/kprobes.html
参考文章:https://linux.die.net/man/2/unlinkat
参考文章:https://github.com/eunomia-bpf/bpf-developer-tutorial/blob/main/src/2-kprobe-unlink/README.zh.md
kprobes技术
通过kprobes插桩技术可以实现在不影响内核正常运行下,动态监测指定的函数有无被调用、何时被调用、执行是否正确以及函数的入参和返回值是什么。
因此 kprobes 技术具有对内核执行流程影响小和操作方便的优点。
kprobes探测技术
kprobes技术的3种探测手段分别是kprobe、jprobe 和 kretprobe。
kprobe(KernelSpace)
首先 kprobe 是最基本的探测方式,是实现后两种的基础,它可以在任意的位置放置探测点(就连函数内部的某条指令处也可以),它提供了探测点的调用前pre_handler、调用后post_handler和内存访问出错fault_handler,总共3种回调方式。
pre_handler:函数将在被探测指令被执行前回调
post_handler:会在被探测指令执行完毕后回调(注意不是被探测函数)
fault_handler:会在内存访问出错时被调用;
jprobe
jprobe基于kprobe实现,它用于获取被探测函数的入参值。
kretprobe
kretprobe从名字中就可以看出其用途了,它同样基于kprobe实现,用于获取被探测函数的返回值。
kprobe应用
实现用于监测和捕获在Linux内核中执行的unlink系统调用。
unlink 系统调用的功能是删除一个文件,这个eBPF程序通过使用kprobe(内核探针)在do_unlinkat函数的入口和退出处放置钩子,实现对该系统调用的跟踪。
注意:kprobe/do_unlinkat 并不是内核中的一个跟踪点(tracepoint),而是通过 kprobe 机制对内核函数 do_unlinkat 设置的一个动态探针。kprobe 和 tracepoint 是两种不同的内核事件监控机制,它们有各自的特点和用途。
在下面的代码中对内核函数do_unlinkat设置了入口kprobe以及出口kretprobe的动态探针,对应定义了两个函数,如下所示
#include "vmlinux.h" #include <bpf/bpf_helpers.h> #include <bpf/bpf_tracing.h> #include <bpf/bpf_core_read.h> char LICENSE[] SEC("license") = "Dual BSD/GPL"; SEC("kprobe/do_unlinkat") int BPF_KPROBE(do_unlinkat, int dfd, struct filename *name) { pid_t pid; const char *filename; pid = bpf_get_current_pid_tgid() >> 32; filename = BPF_CORE_READ(name, name); bpf_printk("KPROBE ENTRY pid = %d, filename = %s\n", pid, filename); return 0; } SEC("kretprobe/do_unlinkat") int BPF_KRETPROBE(do_unlinkat_exit, long ret) { pid_t pid; pid = bpf_get_current_pid_tgid() >> 32; bpf_printk("KPROBE EXIT: pid = %d, ret = %ld\n", pid, ret); return 0; }
观察cat /sys/kernel/debug/tracing/trace_pipe
中的输出变化,可以看到当执行了rm操作的时候会输出对应的bpf_trace_printk信息,如下图所示
touch test1 rm test1
注:关于BPF_CORE_READ使用用法
value = BPF_CORE_READ(struct_ptr, field1, field2, ..., fieldN); struct_ptr:指向你要访问的结构体的指针。 field1, field2, ..., fieldN:依次是你要访问的嵌套结构体的字段名。 value:读取到的值,类型与最后一个字段的类型一致
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY