是否可以使用kretprobe捕获内核函数的返回值,并将其传递给另一个连接到另一个内核函数的kretprobe。
答案 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。