1

使用 kprobes pre_handler,我试图从 struct pt_regs 访问系统调用参数并修改它们(这是主要目标),然后再调用实际的系统调用本身。

说我在试探sys_link

asmlinkage long sys_link(const char __user *oldname, const char __user *newname);

pre_handler 定义如下:(从这里

static int handler_pre(struct kprobe *p, struct pt_regs *regs)
{
     printk(KERN_INFO "eax: %08lx   ebx: %08lx   ecx: %08lx   edx: %08lx\n",
            regs->orig_ax, regs->bx, regs->cx, regs->dx);
     printk(KERN_INFO "esi: %08lx   edi: %08lx   ebp: %08lx   esp: %08lx\n",
            regs->si, regs->di, regs->bp, regs->sp);
     printk(KERN_INFO "Process %s (pid: %d, threadinfo=%p task=%p)",
             current->comm, current->pid, current_thread_info(), current);
return 0;
}

当我link file1 file2在终端上运行时,dmesg 给出以下输出:

[15105.691463] eax: ffffffffffffffff   ebx: 7fff3e2e71c8   ecx: 7fff3e2e6e50   edx: 00000003
[15105.691467] esi: 7fff3e2e9478   edi: 7fff3e2e9472   ebp: 00000003   esp: ffff880022b0ff80
[15105.691472] Process link (pid: 9448, threadinfo=ffff880022b0e000 task=ffff880018b72e00)Pid: 9448, comm: link Tainted: P         C O 3.2.0-53-generic #81-Ubuntu

前两个参数转到寄存器ediesi因此在这种情况下,edi必须包含地址,file1并且esi必须包含地址file2

在我从 pre_handler 返回之前,我想修改这些寄存器值,比如将值更改esi为指向file3(因此 char __user *newname 现在指向)。file3鉴于这样的修改,现在sys_link应该使用file1file3作为它的论点。这可能吗?如果是这样,怎么做?

4

0 回答 0