使用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
前两个参数转到注册edi
和esi
,因此在这种情况下,edi
必须包含file1
的地址,而esi
必须包含地址file2
。
我想修改这些寄存器值,比如在我返回之前将esi
中的值更改为指向file3
(因此char __user * newname现在指向file3
)来自pre_handler。鉴于此类修改,现在sys_link
应该以{{1}}和file1
作为参数。
这可能吗?如果是这样,怎么样?