Linux x86-64 syscall挂钩,路径名乱码

问题描述 投票:1回答:1

我已经按照在sys_call_table中找到的修补/proc/kallsyms方法表的标准过程,在x86_64 Linux系统上尝试了Linux syscall挂钩。

但是在我的蹦床中,专门用于解析诸如openat,makedir之类的文件路径的系统调用,由于printk(path),我似乎正在检索非人类可读的文件路径,其中path是传递给系统调用的确切形式参数,被拦截。

“在这里看到”

有人可以解释为什么我无法从系统调用中截取人类可读的路径名吗?例如/usr/home/file.txt

问题绕道:

asmlinkage int sys_access_trampoline(const char __user *path, int mode)
{
    char buffer[STR_MAX];
    strncpy_from_user(buffer, path, strnlen_user(path, PATH_MAX+1));
    printk(buffer);  // prints \xe1\xaa\xff\xff\ etc...
    STUB_ORIGIN();
    return sys_access(path, mode);
}
c linux linux-kernel system-calls kernel-module
1个回答
0
投票

正如Tsyvarev所指,对于较新的内核版本(> 4.17,传递syscall参数的方式已更改,并且要求截取蹦床具有以下签名:

asmlinkage __type__ sys_foobar(const struct pt_regs * regs).

然后通过相应的寄存器(即(x86_64))访问单个参数

        arg1   arg2   arg3   arg4    arg5   arg6 
regs->  (di)   (si)   (dx)   (r10)   (r8)   (r9)

因此,要获取访问系统调用的路径字符串,请使用regs->di

asmlinkage int sys_access_trampoline(const struct pt_regs * regs)
{
    char buffer[STR_MAX];
    strncpy_from_user(buffer, regs->di, strnlen_user(path, PATH_MAX+1));
    printk(buffer);  
    STUB_ORIGIN();
    return sys_access(path, mode);
}

我现在收到正确的ASCII路径名。

谢谢大家的帮助!

© www.soinside.com 2019 - 2024. All rights reserved.