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:读取到的值,类型与最后一个字段的类型一致

浙公网安备 33010602011771号