在Linux哈希表中插入PID

时间:2015-01-09 13:55:13

标签: linux hash process kernel pid

目前我正在研究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 /强>

感谢您的帮助。我们赞赏每一个解决方案或想法:)

2 个答案:

答案 0 :(得分:0)

sysmap文件中有一个哈希列表。你可以检查一次。

答案 1 :(得分:0)

pid_hash可以位于/ proc / kallsyms中,也可以通过kallsyms_lookup_name以编程方式访问。