如何从const char __user *类型execv()中提取文件名

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

我为execve系统调用编写了一个钩子,并且在开始时,每次执行文件时,我都会写它以打印“ hi”日志。它工作正常,但是当我尝试打印已执行的文件名时,execute的系统调用崩溃了,当然我必须重新启动计算机。

这是我的代码:

static asmlinkage long our_execl(const char __user * filename,
            const char __user * const __user * argv,
            const char __user * const __user * envp) {
    printk("%s\n",filename);
    return original_execl(filename, argv, envp);
}

好,你问我:

static int lkm_example_init(void)
{

    printk("new new new 2");

    write_cr0(read_cr0()&(~ 0x10000));

    sys_call_table = (void*)0xdd8c4240//the syscall address from the   /proc/kallsyms ;

    execl= sys_call_table[__NR_execve];
    sys_call_table[__NR_execve]=our_execl;

    write_cr0(read_cr0() | 0X10000);
    return 0;
}
c linux linux-kernel system-calls
1个回答
1
投票

[这里最有可能发生的是SMAP(Supervisor Mode Access Prevention)阻止内核访问原始用户空间指针,从而引起恐慌。

从用户空间访问字符串的正确方法是先使用strncpy_from_user()复制其内容。另外,请小心并确保正确终止字符串。

strncpy_from_user()
© www.soinside.com 2019 - 2024. All rights reserved.