【问题标题】:How to get the real file name in kernel module如何在内核模块中获取真实文件名
【发布时间】:2019-07-03 08:04:10
【问题描述】:

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

【问题讨论】:

标签: c filenames kernel-module printk


【解决方案1】:

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

为了方便起见,最好遵循原始函数的功能。它调用getname() 函数,该函数最终调用strncpy_from_user 以及它为可靠地获取名称所做的许多其他事情。调用这个函数,它会得到系统调用中传入的文件名。

【讨论】:

    【解决方案2】:

    你的指针在这里:

    current_pt_regs()->di;
    

    例子:

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

    【讨论】:

    • “这甚至没有错”,c.f.阿列克谢的回答。
    猜你喜欢
    • 2012-01-05
    • 1970-01-01
    • 2013-09-04
    • 2021-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-31
    • 2016-10-26
    相关资源
    最近更新 更多