拦截系统调用时无法打印用户 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);
我正在尝试拦截 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);