Hijack Syscall:从struct pt_regs访问系统调用参数(64bit-x86)

时间:2013-10-02 12:37:05

标签: c linux-kernel hook system-calls kprobe

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

说我正在探究sys_link

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

pre_handler的定义如下:(来自here

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

我想修改这些寄存器值,比如在我返回之前将esi中的值更改为指向file3(因此char __user * newname现在指向file3)来自pre_handler。鉴于此类修改,现在sys_link应该以{{1​​}}和file1作为参数。 这可能吗?如果是这样,怎么样?

0 个答案:

没有答案