使用 kprobe 事件过滤 sys_enter_splice 函数中的文件和管道标志
使用 kprobe 事件过滤 sys_enter_splice 函数中的文件和管道标志
本文介绍如何通过修改 kprobe 事件的处理函数,过滤 sys_enter_splice 函数中 %di 和 %si 寄存器所指向的文件结构体,判断其是否为文件标志或管道标志。
首先,可以使用以下语句过滤出 %di 寄存器的 f_mode 是否为文件标志:
echo 'p:th1nk_test sys_enter_splice source_fd=+44(%di) target_fd=%si len=%dx flags=%cx' >> /sys/kernel/debug/tracing/kprobe_events
可以使用以下处理函数来过滤出 %di 寄存器的 f_mode 是否为文件标志:
static int kprobe_handler(struct kprobe *p, struct pt_regs *regs)
{
struct file *f;
int flags;
f = *((struct file **)(regs->di + 44));
flags = f->f_mode & FMODE_READ;
if (flags) {
pr_info("File flag detected\n");
} else {
pr_info("File flag NOT detected\n");
}
return 0;
}
其中,regs->di 表示 %di 寄存器的值,加上偏移 44 可以得到指向文件结构体的指针。f->f_mode 表示文件的标志,通过按位与运算可以得到文件是否为读模式。
类似地,可以使用以下处理函数来过滤出 %si 寄存器的文件结构体指针是否为管道标志:
static int kprobe_handler(struct kprobe *p, struct pt_regs *regs)
{
struct file *f;
int flags;
f = *((struct file **)regs->si);
flags = f->f_inode->i_mode & S_IFIFO;
if (flags) {
pr_info("Pipe flag detected\n");
} else {
pr_info("Pipe flag NOT detected\n");
}
return 0;
}
其中,regs->si 表示 %si 寄存器的值,为指向文件结构体的指针。f->f_inode->i_mode 表示文件的模式,通过按位与运算可以得到是否为管道标志。
通过以上方法,您可以轻松过滤出 sys_enter_splice 函数中文件结构体的标志,以便更好地分析内核行为。
原文地址: https://www.cveoy.top/t/topic/ndqz 著作权归作者所有。请勿转载和采集!