内核4.19以上版本如何通过 const char __user *filename 得到完整路径,hook do_mkdir 系统调用,无法得到完整路径。
【以下回答由 GPT 生成】
在C语言中,我们可以通过以下步骤来获取完整路径:
readlink
系统调用来完成这个任务。readlink
系统调用接受两个参数:文件描述符和一个指向存储路径的字符串指针。它会将文件的真实路径写入到指针指向的缓冲区中。#include <unistd.h>
ssize_t readlink(const char *pathname, char *buf, size_t bufsize);
其中,pathname
是文件的路径,buf
是一个缓冲区,用于存储真实路径,bufsize
是缓冲区的大小。
x86_64_regs
结构体中的di
和si
成员来获取系统调用的参数。具体的代码如下:#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。
希望以上解决方案能对你有所帮助。如果你有任何疑问,请随时追问。