如何使用 Berkeley Packet Filter (BPF) 过滤内核中的函数参数?该函数应该是任何非内联函数,而不仅仅是系统调用。此外,最好可以取消引用函数参数中的指针以进行验证。
我搜索了互联网,但找不到任何用例。大部分资料只描述了如何使用 seccomp / seccomp-BPF。
似乎集成了 eBPF 和 kprobe/jprobe 来实现挂钩。但我在网上找不到一个很好的例子。
如何使用 Berkeley Packet Filter (BPF) 过滤内核中的函数参数?该函数应该是任何非内联函数,而不仅仅是系统调用。此外,最好可以取消引用函数参数中的指针以进行验证。
我搜索了互联网,但找不到任何用例。大部分资料只描述了如何使用 seccomp / seccomp-BPF。
似乎集成了 eBPF 和 kprobe/jprobe 来实现挂钩。但我在网上找不到一个很好的例子。
eBPF可能是你想要的。如果您还没有找到它们,您应该查看bcc(BPF 编译器集合)工具提供的示例。
特别是,示例工具argdist
确实依赖于 kprobes,您可能会感兴趣:
argdist 探测您指定的函数并将参数值收集到直方图或频率计数中。这可用于了解某个参数取值的分布、过滤和打印感兴趣的参数而无需附加调试器,以及获取各种函数的一般执行统计信息。
例如,假设您想查找应用程序中常见的分配大小:
# ./argdist -p 2420 -C 'p:c:malloc(size_t size):size_t:size' [01:42:29] p:c:malloc(size_t size):size_t:size COUNT EVENT [01:42:30] p:c:malloc(size_t size):size_t:size COUNT EVENT
[…]
(从argdist 示例中提取使用)。
作为记录,到目前为止,我发现的大多数 eBPF 示例都位于以下位置之一:
linux/samples/bpf
Linux内核源代码下。bcc/tools
密件抄送的目录中。tc
,在iproute2/examples/tc
iproute2 包源中的目录下。)