linux 用户态 隐藏进程 简介
目录
linux下查看进程的方法
PS/TOP显示进程原理
隐藏进程
某些时候程序员为了防止其他人不小心或者恶意破坏掉你运行的程序,或者我们要做些“见不得光”的事情,就有隐藏进程的需求,目的是让小白或者初级运维无法通过相关命令工具查找到你的程序,达到隐藏目的。前两天正好项目上需要用到隐藏进程的需求,所以分析了下个人觉得目前比较好的做法。
linux下查看进程的方法
ps命令
top命令
目前网上很多方法基本都是通过如下方式来达到进程隐藏:
1.根据分组权限来实现不同用户组查看不同的进程权限。
2.修改内核,将需要隐藏的进程的进程pid改为0(task->pid = 0),因为ps,top命令不会显示进程id为0的进程。
3.修改内核,hook掉系统调用,在hook函数中修改逻辑判断已达到隐藏进程。
第一种如果追中人有管理员权限就没有办法隐藏了。第二三种需要懂内核编程,有一定的技术门槛(实际上只要会点内核还是很easy的),今天我们说下第四种办法:在用户态修改系统调用,从而隐藏进程。
PS/TOP显示进程原理
strace命令是一个常用的代码调试工具,它可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间。因此对于调试程序出错是非常有用的。这里不过多展示strace的调试用法,具体可以查看详细的strace命令。
我们看下ps,top是如何显示进程信息的:
strace ps
strace top
通过strace命令可以看出 ps,top等查看进程的信息都是通过调用 readdir 方法遍历 /proc 目录来获取进程信息。每个动态创建的进程ID号下面详细的记录了关于该进程的fd,mem,io,cpuset等进程信息。
既然进程信息是proc目录下动态生成的,因此最显而易见和最彻底的方法就是不让proc下生成该进程信息。通过查找代码,定位到内核通过fs/proc/base.c中的proc_pid_lookup查找进程号,然后由proc_pid_instantiate来在proc下创建该进程号相关的进程信息。因此我们只需要在proc_pid_lookup中匹配要过滤的进程名,然后直接返回就行了,如下:
内核proc创建pid进程信息
这种办法彻底不创建该进程信息,但是要修改编译内核,实际上是不太可取的。而我们目的也只是隐藏,不必完全屏蔽进程信息。因此,有没有一种办法在用户态通过劫持系统调用而忽略掉我们的进程呢?
本来想着如何自己实现一个hook系统调用,但是本着绝不重复造轮子的工匠精神,瓶子哥尝试搜罗了下,还真有现成的,即通过劫持readdir系统调用实现ps,top无法查找到进程而达到隐藏进程。
隐藏进程
我们先实战,在看其实现原理。
1 . 实现:
1) git clone https://github.com/gianlucaborello/libprocesshider.git
2) cd libprocesshider/ && make
3) cp libprocesshider.so /usr/local/lib/
4) echo /usr/local/lib/libprocesshider.so >> /etc/ld.so.preload
这一步也可以用export LD_PRELOAD=/usr/local/lib/libprocesshider.so来代替。
执行命令上述命令前,运行mtop进程,ps可以查看到mtop的进程。
执行上述命令后,ps 查看,可以发现已经找不到该进程了,而且 top,ls /proc/下面也不能找到该进程,完美达到隐藏进程。
2. 原理:
我们查看processhider.c源码可以发现,原理上就是重写了readdir的系统调用,因为无论ps,top,ls 都会调用readdir,将process_to_filter设置为你要过滤的进程名称,就实现了进程隐藏。大家可以直接在libprocesshider.git这个基础上修改自己需要隐藏的进程名就可以了。
而思路就是利用 LD_PRELOAD 来实现系统函数的劫持,程序在执行外部库函数调用的时候,会根据动态库的优先级来加载库函数,linux下库的加载顺序为/etc/ld.so.preload( LD_PRELOAD)>/etc/ld.so.cache>/etc/ld.so.conf,当程序调用外部库的函数,如果LD_PRELOAD里面有自定义和其他系统库相同的库函数,则优先加载我们自定义的函数,这样就达到了劫持系统函数的目的。
由于ps,top,ls 等几乎所有的查看命令都基于readdir系统调用,所以能够完美的隐藏掉进程,对付一般的小白是完全够用了。如果为了避免分析人员查找 /etc/ld.so.preload而定位到进程,我们可以不创建ld.so.preload文件,而使用LD_PRELOAD宏来定义库的路径。例如将export LD_PRELOAD=/usr/local/lib/libprocesshider.so 放到linux系统启动过程中rc文件去加载,加大定位的难度。
linux 用户态 隐藏进程 简介相关推荐
- linux 用户态与内核态通信方式简介
我们平常在写代码时,一般是在用户空间,通过系统调用函数来访问内核空间,这是最常用的一种用户态和内核态通信的方式.(关于 Linux 用户态和内核态可以参考 xx) 除此之外,还有以下四种方式: pro ...
- JVM内存划分、Linux用户态、内核态简介
JVM内存划分 1.在Java运行的时候 JVM虚拟机拿到自己能支配的内存 将内存进行分割2.本地方法栈存储是C++ native方法3.程序计数器指向程序当前运行的位置4.方法区存储元数据信息在jd ...
- Linux用户态和内核态
究竟什么是用户态,什么是内核态,这两个基本概念以前一直理解得不是很清楚,根本原因个人觉得是在于因为大部分时候我们在写程序时关注的重点和着眼的角度放在了实现的功能和代码的逻辑性上,先看一个例子: 1)例 ...
- Linux 用户态与内核态的交互——netlink 篇
[size=4]Linux 用户态与内核态的交互 --netlink 篇[/size] 作者:Kendo 2006-9-3 这是一篇学习笔记,主要是对<Linux 系统内核空间与用户空间通信的实 ...
- Linux用户态与内核态通信的几种方式(待完善)
文章目录 1. 内核启动参数 2.模块参数与sysfs 3.sysctl 4.系统调用 5.netlink 6. procfs(/proc) 7.seq_file 8.debugfs 9.relayf ...
- Linux / 用户态和内核态的切换耗费时间的原因
应用程序的执行必须依托于内核提供的资源,包括 CPU 资源.存储资源.I/O 资源等.为了使上层应用能够访问到这些资源,内核必须为上层应用提供访问的接口:即系统调用.因此,如果一个程序需要从用户态进入 ...
- 修改linux内核达到隐藏进程目的(2.6.28)
修改linux内核达到隐藏进程目的(2.6.28) 要求: 高级操作系统与分布式系统作业 ps和top命令列出了unix中当前所有进程的相关信息,作业要求在linux中增加两个系统调用,功能如下: h ...
- [中英对照]User-Space Device Drivers in Linux: A First Look | 初识Linux用户态设备驱动程序...
如对Linux用户态驱动程序开发有兴趣,请阅读本文,否则请飘过. User-Space Device Drivers in Linux: A First Look | 初识Linux用户态设备驱动程序 ...
- Linux内核态之间进程通信,内核态和用户态通信(二)--实现
本文主要使用netlink套接字实现中断环境与用户态进程通信. 系统环境:基于linux 2.6.32.27 和 linux 3.16.36 Linux内核态和用户态进程通信方法的提出和实现 用户上下 ...
最新文章
- MySQL从主从到代理
- 简述在虚拟机中安装 centos 的过程_从零构建Fabric开发运行环境手册(一):安装OS虚拟机(CentOS)...
- MongoDB的地理位置索引
- 小数乘分数怎么算过程_GMAT分数到底怎么算?我该做对多少题GMAT才能达到700+?...
- 表格内容排序(js实现)
- windows 和linux查看硬件信息,Linux下如何查看硬件信息?
- 网页嵌入视频播放器代码大全
- xmind 拖拽_思维导图,原来Xmind这么强大!
- 电脑罗盘时钟html怎么设置成桌面,抖音最火的罗盘时钟桌面壁纸使用教程
- 超越竞争对手的秘密武器-技术重用
- vscode、windows快捷键
- 如何阅读看懂datasheet
- 这学期她选修了英语 计算机 驾驶三门课程,大一英语翻译答案
- 使用Pr时输出设备没有声音问题
- SSD源码解读1-数据层AnnotatedDataLayer
- 深入 Go 中各个高性能 JSON 解析库
- python图片批量处理(水印、重命名)
- cuda 单block多线程
- 微信中网页分享开发遇到的坑
- MVC 停车场管理系统java jsp 程序设计 课程设计 毕业设计-附源码02141