,仅需要修改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。

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

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

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