这里的eBPF LSM程序是用来监控和阻断文件打开操作的,hook点为file_open。 BPF_PROG是libbpf中定义函数的宏,具体含义可见BPF_PROG,简单来说就是一个辅助定义函数的宏,如果不用这个宏,自己定义函数需要定义为func_name(unsigned long long *ctx),然后解析ctx为hook点的参数。现在只需要BPF(func_name, hook点参数)即可。 类似的还有BPF_KPROBE,如果不用这个宏,需要定义func_name(struct pt_regs *ctx),然后解析ctx为hook点的参数。是否使用这些宏主要取决于要eBPF程序类型和hook点的位置,例如前面介绍的XDP就不需要使用。
intmain(int argc, char **argv) { structlsm_file_bpf *skel; int err;
/* Set up libbpf errors and debug info callback */ libbpf_set_print(libbpf_print_fn); /* Open, load, and verify BPF application */ skel = lsm_file_bpf__open_and_load(); if (!skel) { fprintf(stderr, "Failed to open and load BPF skeleton\n"); goto cleanup; } /* Attach lsm handler */ err = lsm_file_bpf__attach(skel); if (err) { fprintf(stderr, "Failed to attach BPF skeleton\n"); goto cleanup; } printf("Successfully started! Please run `sudo cat /sys/kernel/tracing/trace_pipe` " "to see output of the BPF programs.\n");
for (;;) { /* trigger our BPF program */ fprintf(stderr, "."); sleep(1); }
$ make lsm_file BPF .output/lsm_file.bpf.o GEN-SKEL .output/lsm_file.skel.h CC .output/lsm_file.o BINARY lsm_file $ sudo ./lsm_file libbpf: map 'lsm_file.rodata': created successfully, fd=3 libbpf: map '.rodata.str1.1': created successfully, fd=4 Successfully started! Please run `sudo cat /sys/kernel/tracing/trace_pipe` to see output of the BPF programs. .........