用户态是通过系统调用来加载BPF程序到内核的,在加载程序时,需要传递的参数中有一个字段叫prog_type,这个就是BPF的程序类型,跟踪相关的是:BPF_PROG_TYPE_KPROBE和BPF_PROG_TYPE_TRACEPOINT,网络相关是:BPF_PROG_TYPE_SK_SKB、BPF_PROG_TYPE_SOCK_OPS等。下面是描述BPF程序类型的枚举结构:enum bpf_prog_...
BPF_PROG_TYPE_SOCKET_FILTER: BPF_FUNC_skb_load_bytes() BPF_FUNC_skb_load_bytes_relative() BPF_FUNC_get_socket_cookie() BPF_FUNC_get_socket_uid() BPF_FUNC_perf_event_output() Base functions 2. kprobe程序 kprobe是动态附加到内核调用点的函数。bpf虚拟机总是确kprobe能够安全的运行,但是内核kpro...
用户态是通过系统调用来加载BPF程序到内核的,在加载程序时,需要传递的参数中有一个字段叫prog_type,这个就是BPF的程序类型,跟踪相关的是:BPF_PROG_TYPE_KPROBE和BPF_PROG_TYPE_TRACEPOINT,网络相关是:BPF_PROG_TYPE_SK_SKB、BPF_PROG_TYPE_SOCK_OPS等。下面是描述BPF程序类型的枚举结构: enum bpf_prog_type {...
用户态是通过系统调用来加载BPF程序到内核的,在加载程序时,需要传递的参数中有一个字段叫prog_type,这个就是BPF的程序类型,跟踪相关的是:BPF_PROG_TYPE_KPROBE和BPF_PROG_TYPE_TRACEPOINT,网络相关是:BPF_PROG_TYPE_SK_SKB、BPF_PROG_TYPE_SOCK_OPS等。下面是描述BPF程序类型的枚举结构: enum bpf_prog_type {...
BPF_PROG_TYPE_SOCKET_FILTER, BPF_PROG_TYPE_KPROBE, BPF_PROG_TYPE_SCHED_CLS, BPF_PROG_TYPE_SCHED_ACT, BPF_PROG_TYPE_TRACEPOINT, BPF_PROG_TYPE_XDP, BPF_PROG_TYPE_PERF_EVENT, BPF_PROG_TYPE_CGROUP_SKB, BPF_PROG_TYPE_CGROUP_SOCK, BPF_PROG_TYPE_LWT_IN, BPF_PROG_TYPE_LWT_OUT, BPF_PRO...
type:当前bpf程序的类型(kprobe/tracepoint/perf_event/sk_filter/sched_cls/sched_act/xdp/cg_skb); aux:主要用来辅助verifier校验和转换的数据; bpf_func:运行时BPF程序的入口。如果JIT转换成功,这里指向的就是BPF程序JIT转换后的映像;否则这里指向内核解析器(interpreter)的通用入口__bpf_prog_run; ...
BPF_PROG_TYPE_SOCKET_FILTER类型用于访问所有套接字处理的数据包,只能用于观测,不能修改数据包的内容或者更改目的地。 2. kprobe程序 kprobe是动态附加到内核调用点的函数。bpf虚拟机总是确kprobe能够安全的运行,但是内核kprobe被认为是不稳定的入口点,需要确定程序是否与内核相兼容。
4.1 BPF_PROG_TYPE_KPROBE What do I do with it? instrument code in any kernel function (bar a few exceptions) via kprobe, or instrument entry/return via kretprobe. k[ret]probe_perf_func() executes a BPF program attached to the probe point. Note that this program type can also be used...
neverallow { domain -bpfloader } *:bpf { map_create prog_load }; 而bpfloader只在手机启动时执行一次,保证了其它模块无法额外加载系统之外的bpf程序,防止对内核的安全性造成危害。 在system/bpf/bpfloader/BpfLoader.cpp中,bpfloader会使用loadAllElfObjects遍历/system/etc/bpf下btf格式的”.o”文件。接着使...
遍历bpf程序(函数如kprobe_vfs_read)指令集合prog->insnsi[],调用build_insn进行指令的jit编译 5、还原堆栈build_epilogue 1) 当前指针减去stack_size,将是BPF fp register的地方(前面build_prologue我们报错寄存器的尾部) 2) 依次弹出刚才我们保存的寄存器,tcc、r9/r8/r7/r6、FP/LR ...