如何使用 BPF 过滤核函数参数?

How to use BPF to filter kernel function arguments?

如何使用Berkeley Packet Filter (BPF)过滤内核中的函数参数?该函数应该是任何非内联函数,而不仅仅是系统调用。另外,最好可以取消引用函数参数中的指针以进行验证。

我在 Internet 上进行了搜索,但找不到任何用例。大多数资料只描述了如何使用 seccomp / seccomp-BPF。

好像是eBPF和kprobe/jprobe结合起来实现hook的。但是我在网上找不到很好的例子。

eBPF 可能就是您想要的。如果您还没有找到它们,您应该看看 the bcc (BPF Compiler Collection) tools.

提供的示例

特别是,the example tool argdist 确实依赖于 kprobes,您可能会感兴趣:

argdist probes functions you specify and collects parameter values into a histogram or a frequency count. This can be used to understand the distribution of values a certain parameter takes, filter and print interesting parameters without attaching a debugger, and obtain general execution statistics on various functions.

For example, suppose you want to find what allocation sizes are common in your application:

# ./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 example uses)。

郑重声明,到目前为止,我发现的大多数 eBPF 示例都位于以下位置之一:

  • 在 Linux 内核源代码中的 linux/samples/bpf 下。
  • 密件抄送的bcc/tools目录下
  • (对于涉及 tc 的网络示例,在 iproute2 包源的 iproute2/examples/tc 目录下。)