当我从钩子上收集args时,我遇到了一些困难。sys_open
和 sys_execve
.
两个系统调用都使用文件名作为第一个参数,参数可以是绝对路径或相对路径。我想得到的是 绝对路径 是绝对路径还是相对路径。
例如:如果文件名是
如果文件名是 "/root/Desktop/../Downloads"
,我需要把它改成 "/root/Downloads"
.
我想操作系统的源码是有分辨率的,但我最终读到的源码为 "__link_path_walk"
.
该功能 "__link_path_walk"
是用来处理 "../" and "./"
但似乎该函数没有得到绝对路径,而是得到了最后的条目(在源代码中注明)。我的操作系统代码版本是 linux-2.6.32-754.el6。.
希望得到任何帮助。
我花了2天时间解决了这个问题,我在sys_stat中找到了解决方案,代码如下。
int get_absolute_path(const char __user *filename){
struct path path;
int dfd=AT_FDCWD;
char *ret_ptr=NULL;
int error = -EINVAL,flag=0;
unsigned int lookup_flags = 0;
char *tpath=kmalloc(1024,GFP_KERNEL);
if ((flag & ~(AT_SYMLINK_NOFOLLOW | AT_NO_AUTOMOUNT)) != 0)
goto out;
if (!(flag & AT_SYMLINK_NOFOLLOW))
lookup_flags |= LOOKUP_FOLLOW;
error = user_path_at(dfd, filename, lookup_flags, &path);
if (error)
goto out;
ret_ptr = d_path(&path, tpath, 1024);
printk("%s\n",ret_ptr);
kfree(tpath);
return 0;
out:
kfree(tpath);
return error;
}