内核如何通过 const char __user *filename 得到完整路径

内核4.19以上版本如何通过 const char __user *filename 得到完整路径,hook do_mkdir 系统调用,无法得到完整路径。

【以下回答由 GPT 生成】

在C语言中,我们可以通过以下步骤来获取完整路径:

  1. 首先,我们需要通过文件描述符获取文件的真实路径。在Linux系统中,可以使用readlink系统调用来完成这个任务。readlink系统调用接受两个参数:文件描述符和一个指向存储路径的字符串指针。它会将文件的真实路径写入到指针指向的缓冲区中。
#include <unistd.h>

ssize_t readlink(const char *pathname, char *buf, size_t bufsize);

其中,pathname是文件的路径,buf是一个缓冲区,用于存储真实路径,bufsize是缓冲区的大小。

  1. 在Linux内核中,系统调用中的参数是通过寄存器传递的。对于x86架构的系统,我们可以通过x86_64_regs结构体中的disi成员来获取系统调用的参数。具体的代码如下:
#include <linux/types.h>

asmlinkage long my_do_mkdir(int __unused, const struct pt_regs *regs)
{
    const char __user *filename = (const char __user *)regs->di;

    // 获取完整路径
    char path[PATH_MAX];
    ssize_t ret = readlink(filename, path, PATH_MAX);
    if(ret == -1) {
        // 读取路径失败
    } else {
        // 处理完整路径
    }

    // 其他处理逻辑

    return 0;
}

其中,regs->di表示第一个参数(文件名)。

需要注意的是,这只是一个示例代码,你还需要做一些额外的工作来实际使用这个hook。

希望以上解决方案能对你有所帮助。如果你有任何疑问,请随时追问。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^