1

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

4

1 回答 1

0

如何使用 eBPF 和 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()

返回的值与键 0 一起randomize_stack_top保存在哈希映射rvalues中(也可以使用 BPF_ARRAY,因为这里的键是固定的)。load_elf_binary通过对哈希映射的简单查找来检索该值。

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


bcc 提供了一个更高级别的 Python API 来在内核中加载 eBPF 程序并与之交互。可以使用 eBPF 程序代替内核模块来检测 kprobe。有关密件抄送的更多信息,请参阅存储库上的教程

于 2017-10-31T18:03:37.943 回答