【发布时间】:2015-03-07 20:48:01
【问题描述】:
目前我正在开发一个可以隐藏任何正常进程的 Linux 内核模块。 隐藏效果很好,但我还没有找到取消隐藏过程的方法。 首先,我从内核中的 task_structs 大列表中删除 struct task_struct:
struct task_struct *p;
//Finding the correct task_struct
for_each_process(p)
if(p->pid == pid){
// Removing the task_struct
struct list_head *next = task->tasks.next;
struct list_head *prev = task->tasks.prev;
next->prev=prev;
prev->next=next;
}
但 task_struct 仍然是可追踪的,因为它位于包含每个进程的 task_struct 的 hash_table 中。事实上,大部分 PID-Lookup 都是由这个哈希表执行的。从那里删除任务结构有点棘手:
struct pid *pid; //struct pid of the task_struct
//Deleting for every pid_namespace the pid_chain from the hash_list
for (i = 0; i <= pid->level; i++) {
struct upid *upid = pid->numbers + i;
hlist_del_rcu(&upid->pid_chain);
}
问题是要恢复两个结构:将 task_struct 重新插入 task_structs 列表很容易,但我还没有找到恢复哈希表中链接的方法。这很困难,因为内核没有公开所需的结构。
在内核内部,它在这一行内完成:
hlist_add_head_rcu(&upid->pid_chain,&pid_hash[pid_hashfn(upid->nr, upid->ns)]);
pid_hashfn和pid_hash定义如下:
#define pid_hashfn(nr, ns) hash_long((unsigned long)nr + (unsigned long)ns, pidhash_shift)
static struct hlist_head *pid_hash;
我需要插入的结构是 pid_chain:
struct hlist_node pid_chain;
所以我的问题是,如何将 pid_chain 插入正确的哈希列表中? 有没有办法获得对哈希列表数组的引用,即使它被声明为静态?
或者,也许是一个不常见的想法:哈希列表是通过
pid_hash = alloc_large_system_hash("PID", sizeof(*pid_hash), 0, 18,HASH_EARLY | HASH_SMALL, &pidhash_shift, NULL,0, 4096);
所以,如果我能得到哈希列表内存的起始位置,我是否可以扫描相应的内存空间以查找我的结构的指针,然后将周围的内存区域转换为类型为 struct hlist?
感谢您的帮助。每个解决方案或想法都值得赞赏:)
【问题讨论】:
标签: linux hash process kernel pid