拦截系统调用时无法打印用户 space 字符串参数

Cannot printk user space string parameter when intercepting a syscall

我正在尝试拦截 Linux 系统调用以将所有打开的文件名记录到日志文件中。但是有一个问题:它无法打印用户 space 中的文件名。以下是假系统调用函数的代码:

static inline long hacked_open(const char __user *filename, int flags, umode_t mode)
{
    char buf[256];
    buf[255] = '[=11=]';

    long res = strncpy_from_user(buf, filename, 255);
    if (res > 0)
        printk("%s\n", buf);
    else
        printk("---err len : %ld ---\n", res);

    orig_func a = (orig_func)orig_open;

    return a(filename, flags, mode);
}

加载内核模块后,dmesg 显示了很多消息:

---err len : -14---

我试过 copy_from_user 并直接打印文件名,但它们都不起作用。

这个问题我自己解决了

hacked_open参数错误

正确的 hacked_openat 应该是:

asmlinkage long hacked_openat(struct pt_regs *regs)

我们可以像这样从 user-space 获取文件名:

int nRet = strncpy_from_user(filename, (char __user *)regs->si, 1024);