如何使用 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
目录下。)
如何使用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
目录下。)