本页面包含:XDP、TC、ebpf实现syscall/内核函数hook等一系列使用ebpf动态加载代码到内核的技术。

开头先推荐一个rootkit项目,广泛使用了ebpf

https://github.com/h3xduck/TripleCross

基于netfilter的rootkit - 先知社区 (aliyun.com)

教程:

xdp-project/xdp-tutorial: XDP tutorial (github.com)

libbpf/libbpf-bootstrap: Scaffolding for BPF application development with libbpf and BPF CO-RE (github.com)

下面的叙述基于 5.15.0-67-generic #74-Ubuntu SMP Wed Feb 22 14:14:39 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux

ctx参数

具体传给我们ebpf的ctx指针指向一个什么结构,可以在本机的/sys/kernel/debug/tracing/events下看到,例如对于syscall read enter hook的ctx格式,就在/sys/kernel/debug/tracing/events/syscalls/sys_enter_read/format

debug

bpf_printk会把东西输出到/sys/kernel/debug/tracing/trace_pipe

内存读写

ebpf tracepoint/kprobe不能修改内核内存,但可以通过**bpf_probe_read_kernel读取,ebpf可以读取或修改用户态内存,通过bpf_probe_read_user /** bpf_probe_write_user。两种内存都可以通过**bpf_probe_read**统一读取。

**bpf_probe_write_user**有几率失败(原因未知),也不能写入原本用户进程无写权限的内存区域

读取长度未知,且以\0结尾的c风格字符串可以使用**bpf_probe_read_str**

虽然你的ebpf程序没法直接读取这些外来指针,但可以安全地传递给helper函数。