0

我正在创建一个内核模块来拦截 unlink 命令并复制要取消链接的文件。现在,我拦截了 unlink 命令并尝试打印文件的路径,但它不能正常工作。

我有一个接收char *path参数的方法,我使用 printk 来显示路径,但这会打印一些罕见的字符串,如 "\xe07l\xd3\xf"

asmlinkage int hacked_sys_unlink(const char *pathname)
{
    printk("RM_CATCHED: unlink( \"%s\" )\n", pathname);
    return original_sys_unlink(pathname);
}

当我取消链接某些文件并使用 dmesg 命令时,我得到了这个:

[ 1531.847856] RM_CATCHED: unlink( "`g\xcfYMV" )
[ 1531.848071] RM_CATCHED: unlink( "\xe07l\xd3\xf" )
[ 1534.851623] RM_CATCHED: unlink( "\xe07l\xd3\xf" )
[ 1534.852091] RM_CATCHED: unlink( "" )
[ 1541.861962] RM_CATCHED: unlink( "" )

我怎样才能得到文件的真实路径/path/to/file.txt呢?

4

2 回答 2

1

打印垃圾而不是漂亮的真实文件名的核心原因是首先您需要将字符串从用户空间复制到内核空间。通常copy_from_user()使用函数。在这种情况下,您有一个以 NULL 结尾的字符串,并且strncpy_from_user()可以使用该函数的变体来代替。

为了使事情变得更容易,最好遵循原始函数的作用。它调用getname()函数,最终调用strncpy_from_user它所做的许多其他事情来可靠地获取名称。调用此函数,它将为您获取系统调用中传递的文件名。

于 2019-09-05T10:40:58.403 回答
-1

你的指针在这里:

current_pt_regs()->di;

例子:

printk("%s\n", (char *)current_pt_regs()->di);
于 2020-04-28T10:05:19.787 回答