本页面包含: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)
下面的叙述基于 5.15.0-67-generic #74-Ubuntu SMP Wed Feb 22 14:14:39 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux
具体传给我们ebpf的ctx指针指向一个什么结构,可以在本机的/sys/kernel/debug/tracing/events
下看到,例如对于syscall read enter hook的ctx格式,就在/sys/kernel/debug/tracing/events/syscalls/sys_enter_read/format
里
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函数。