Linux kernel 两个内核kprobe/kretprobe之间的通信

Linux kernel 两个内核kprobe/kretprobe之间的通信,linux-kernel,kernel,kernel-module,kprobe,Linux Kernel,Kernel,Kernel Module,Kprobe,是否可以使用kretprobe捕获一个内核函数的返回值,并将其传递给另一个连接到另一个内核函数的kretprobe。如何使用eBPF和bcc执行此操作的一个示例: #/usr/bin/env python 从密件抄送导入BPF BPF(text=”“” #包括 BPF_散列(右值,u64,无符号长); int kretprobe_uu随机化_u堆栈_utop(struct pt_regs*ctx){ u64零=0; 无符号长右值=PT_REGS_RC(ctx); rvalues.lookup(&

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

如何使用eBPF和bcc执行此操作的一个示例:

#/usr/bin/env python
从密件抄送导入BPF
BPF(text=”“”
#包括
BPF_散列(右值,u64,无符号长);
int kretprobe_uu随机化_u堆栈_utop(struct pt_regs*ctx){
u64零=0;
无符号长右值=PT_REGS_RC(ctx);
rvalues.lookup(&0);
返回0;
}
int-kretprobe\uuuu load\u elf\u二进制文件(结构pt\u regs*ctx){
u64零=0;
无符号long*rvalue_ptr=rvalues.lookup(&0);
if(右值ptr){
无符号长右值=*右值ptr;
bpf_trace_printk(“随机堆栈顶部返回的值:%d”,右值);
}
返回0;
}
“”)。trace_print()
randomize\u stack\u top
返回的值用键0保存在哈希映射
rvalues
中(也可以使用BPF\u数组,因为这里的键是固定的)。该值在
load_elf_binary
中检索,只需在哈希映射上进行简单查找

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



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

如何使用eBPF和bcc执行此操作的示例:

#/usr/bin/env python
从密件抄送导入BPF
BPF(text=”“”
#包括
BPF_散列(右值,u64,无符号长);
int kretprobe_uu随机化_u堆栈_utop(struct pt_regs*ctx){
u64零=0;
无符号长右值=PT_REGS_RC(ctx);
rvalues.lookup(&0);
返回0;
}
int-kretprobe\uuuu load\u elf\u二进制文件(结构pt\u regs*ctx){
u64零=0;
无符号long*rvalue_ptr=rvalues.lookup(&0);
if(右值ptr){
无符号长右值=*右值ptr;
bpf_trace_printk(“随机堆栈顶部返回的值:%d”,右值);
}
返回0;
}
“”)。trace_print()
randomize\u stack\u top
返回的值用键0保存在哈希映射
rvalues
中(也可以使用BPF\u数组,因为这里的键是固定的)。该值在
load_elf_binary
中检索,只需在哈希映射上进行简单查找

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



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

如果两个探测的处理程序都在同一个模块中声明,它们可以像往常一样通信(通过模块的变量)。@Tsyvarev所以基本上你是说我应该在单个模块中编写两个返回探测的代码,并通过全局变量在它们的处理程序之间通信?是的,这是一个很好的方法。好的,因为我是内核编程新手,我想知道如何捕获我们正在植入返回探测的函数的返回值。我试图做的是做两个返回探测,一个钩住在fs/binfmt_elf.c文件中加载_elf_binary()函数,另一个钩住在加载_elf_binary函数中调用的随机化_stack_top()函数。现在我想在第一个探测中使用randomize_stack_top()返回的值。只需将其kretprobe处理程序中的'randomize_stack_top'返回值存储到某个模块的全局变量,然后在kretprobe处理程序中为
load_elf_binary
读取该变量。如果在同一个模块中声明了两个探测的处理程序,它们可以像往常一样通信(通过模块的变量)。@Tsyvarev所以基本上你是说我应该在一个模块内为返回探测编写代码,并通过全局变量在它们的处理程序之间通信?是的,这是一个很好的方法。好的,因为我是内核编程新手,我想知道如何捕获我们正在植入返回探测的函数的返回值。我试图做的是做两个返回探测,一个钩住在fs/binfmt_elf.c文件中加载_elf_binary()函数,另一个钩住在加载_elf_binary函数中调用的随机化_stack_top()函数。现在我想在第一个探测中使用randomize_stack_top()返回的值。只需将“randomize_stack_top”的返回值存储在其kretprobe处理程序中的某个模块的全局变量中,然后在kretprobe处理程序中为
加载elf_binary
读取该变量。