鍍金池/ 問答/Linux  HTML/ 在linux內(nèi)核模塊中得到fd指向的路徑

在linux內(nèi)核模塊中得到fd指向的路徑

最近正在完成一份簡單的內(nèi)核模塊編碼作業(yè),功能是模擬 rootkit 隱藏進程。根據(jù) strace ps 的觀察,ps 程序通過 open /proc 打開 fd,通過 getdents <fd> 遍歷目錄。

sys_getdents 的函數(shù)原型如下:

// linux/syscalls.h
asmlinkage long (*sys_getdents) (unsigned int fd, struct linux_dirent __user *dirent, unsigned int count);

struct linux_dirent 的結(jié)構(gòu)如下:

// linux/fs/readdir.c
struct linux_dirent {
    unsigned long   d_ino;
    unsigned long   d_off;
    unsigned short  d_reclen;
    char            d_name[1];
};

因為不想污染對其他目錄的訪問,所以希望在給 sys_getdents 加鉤子時能判斷 fd 指向的路徑。

在用戶態(tài)編程時,我們可以使用 readlink /proc/self/fd/<fd> 獲取它,但在內(nèi)核態(tài)下有什么好辦法嗎?望不吝賜教,謝謝!

回答
編輯回答
默念

思路:通過 fd -> struct file -> struct path -> 路徑 獲取路徑

  1. fget(fd) 得到 struct file
  2. d_path(file.path) 得到路徑

==== 以上是答主原文,以下是題主補充 ====

沒有使用 fget,而是使用了 current->files,具體代碼如下:

struct files_struct *files;
struct file *file;

int buflen = 256;
char buf[buflen];
char *path;

files = current->files;
spin_lock(&files->file_lock);
file = fcheck_files(files, fd);
path = d_path(&file->f_path, buf, buflen);
spin_unlock(&files->file_lock);
2018年5月20日 02:23