【问题标题】:Inserting a PID in the Linux Hash-Table在 Linux 哈希表中插入 PID
【发布时间】: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_hashfnpid_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


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-25
        • 2017-03-28
        • 2015-06-10
        • 1970-01-01
        • 2015-11-08
        • 2011-11-22
        • 1970-01-01
        相关资源
        最近更新 更多