如何在内核模块中获取真实文件名

时间:2019-07-03 08:04:10

标签: c filenames kernel-module printk

我正在创建一个内核模块,该模块拦截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之类的文件的真实路径?

2 个答案:

答案 0 :(得分:1)

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

为使事情变得简单,最好遵循原始函数的作用。它调用getname()函数,该函数最终会调用strncpy_from_user来可靠地获得名称。调用此函数,它将为您获取在系统调用中传递的文件名。

答案 1 :(得分:-1)

您的指针在这里:

current_pt_regs()->di;

示例:

printk("%s\n", (char *)current_pt_regs()->di);