使用 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 函数中文件结构体的标志,以便更好地分析内核行为。

使用 kprobe 事件过滤 sys_enter_splice 函数中的文件和管道标志

原文地址: https://www.cveoy.top/t/topic/ndqz 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录