echo pth1nk_test sys_enter_splice source_fd=+44di target_fd=si len=dx flags=cx syskerneldebugtracingkprobe_events 想通过这条语句过滤出di 寄存器的f_mode 是否为文件flag si寄存器的文件结构体指针是否为 pipe flag通过偏移识别。是修改这个ftrace语句 不需要l
,仅需要修改probe事件的处理函数。
可以使用以下处理函数来过滤出%di寄存器的f_mode是否为文件flag:
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表示文件的flag,通过按位与运算可以得到文件是否为读模式。
类似地,可以使用以下处理函数来过滤出%si寄存器的文件结构体指针是否为pipe flag:
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表示文件的mode,通过按位与运算可以得到是否为pipe flag。
原文地址: https://www.cveoy.top/t/topic/bLrz 著作权归作者所有。请勿转载和采集!