目前我正在研究Linux-Kernel-Module,它可以隐藏任何正常的进程。 隐藏工作正常,但我还没有办法取消隐藏这个过程。 首先,我从内核中的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? 有没有办法获得对hash-list-array的引用,即使它被声明为static?
或许,这可能是一个不寻常的想法:哈希列表是通过
分配的pid_hash = alloc_large_system_hash("PID", sizeof(*pid_hash), 0, 18,HASH_EARLY | HASH_SMALL, &pidhash_shift, NULL,0, 4096);
所以,如果我可以得到哈希列表的内存的起始位置,我可以扫描相应的memoryspace以获取我的struct的指针,然后将周围的memoryregion转换为类型为 struct hlist <的struct /强>
感谢您的帮助。我们赞赏每一个解决方案或想法:)
答案 0 :(得分:0)
sysmap文件中有一个哈希列表。你可以检查一次。
答案 1 :(得分:0)
pid_hash可以位于/ proc / kallsyms中,也可以通过kallsyms_lookup_name以编程方式访问。