两个内核kprobes / kretprobes之间的通信

时间:2015-07-08 06:59:09

标签: linux-kernel kernel kernel-module kprobe

是否可以使用kretprobe捕获内核函数的返回值,并将其传递给另一个连接到另一个内核函数的kretprobe。

1 个答案:

答案 0 :(得分:0)

如何使用eBPF& amp; BCC:

#!/usr/bin/env python
from bcc import BPF

BPF(text="""
#include <uapi/linux/ptrace.h>
BPF_HASH(rvalues, u64, unsigned long);
int kretprobe__randomize_stack_top(struct pt_regs *ctx) {
    u64 zero = 0;
    unsigned long rvalue = PT_REGS_RC(ctx);
    rvalues.lookup(&zero);
    return 0;
}

int kretprobe__load_elf_binary(struct pt_regs *ctx) {
    u64 zero = 0;
    unsigned long *rvalue_ptr = rvalues.lookup(&zero);
    if (rvalue_ptr) {
        unsigned long rvalue = *rvalue_ptr;
        bpf_trace_printk("value returned by randomize_stack_top: %d", rvalue);
    }
    return 0;
}
""").trace_print()

randomize_stack_top返回的值保存在哈希映射rvalues中,密钥为0(因为此处修复了密钥,因此也可以使用BPF_ARRAY)。通过在哈希映射上进行简单查找,在load_elf_binary中检索该值。

注意:如果有多个进程调用这些函数,则可以使用它们的PID作为哈希映射的键来区分不同的返回值。

bcc提供了一个更高级别的Python API,用于在内核中加载eBPF程序并与之交互。可以使用eBPF程序代替内核模块来检测kprobes。有关密送的更多信息,请参阅the tutorial on the repository