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