当前位置: 首页 > article >正文

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 JingLi6607 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

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

http://www.lryc.cn/news/2414000.html

相关文章:

  • 汉字区位码查询与算法
  • removeAttribute() 方法删除指定的属性
  • 一个NB-IoT/4G模组的AT拨号联网流程
  • 纳什均衡及经典案例(2)
  • 如何解决计算机漏洞,我的电脑扫描发现存在这么多安全漏洞,怎么解决呢?
  • office运行时错误,部分系统文件可能丢失或已损坏(错误代码:0x80040154)
  • 动漫迷必备网站
  • ORACLE 10g 安装教程[图文]
  • SQL 常见的几种分页
  • 不看后悔!国内外程序员接单平台大合集!带你一次性了解各个热门接单平台!
  • 阿里 新零售领域的多模态知识图谱的建设与应用
  • 二进制0和负0的补码反码源码
  • JS压缩谁最强?对比5款JS代码压缩工具
  • 系统分析师——论文篇(三)
  • ESP8266 WebServer③-基于AsyncElegantOTA.h网页OTA升级
  • javascript高仿热血传奇游戏
  • 802.1D第一版出炉
  • Android开发-android:gravity和android:layout_Gravity属性的用法
  • 测试工具整理(3)——单元测试
  • 计算机网络的组成及通信子网和资源子网的划分
  • Java使用XDOC实现word,pdf等格式的生成及转换
  • 简单认识NHibrenate
  • OpenCV的copyTo()函数讲解及应用
  • ASP.Net学习心得
  • 用 Gmail 的 SMTP 发送邮件
  • 启动应用程序出现msflxgrd.ocx找不到问题解决
  • 鸿蒙原生应用元服务-访问控制(权限)开发工作流程相关
  • main.js_vue
  • 又一个好用的嵌入式设计框架
  • C#上下文菜单(右键菜单)ContextMenuStrip用法总结