Linux上隐藏进程名(初级版)
缘起
上一篇博文 模仿nginx修改进程名 中提到了一种修改进程名的方法,就像 nginx 一样,给不同进程命名为 master 以及 worker 等。那么能不能把新进程名设置为空字符串呢?如果能,又会有哪些应用场景呢?
答案可能是能的,设置新进程的名字为空,通常用来隐藏进程,用于攻击或者反攻击。
prctl 函数
上一篇博文 模仿nginx修改进程名 文章末尾提到了 prctl
这个函数,它也可以用来修改进程名。
只不过如果单单使用 prctl 来修改进程名的话,使用 ps 或者 top 等工具看到的可能还是原来的名字。
源代码可以在我的 github 找到:
https://github.com/smaugx/setproctitle/blob/main/hidden_process/prctl_main.cc
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <unistd.h>
#include <sys/prctl.h>int main(int argc, char* argv[], char *envp[])
{const char *new_title = "prctl_new_name";prctl(PR_SET_NAME, new_title, NULL, NULL, NULL);while (true) {sleep(2);}return 0;
}
编译运行:
# g++ prctl_main.cc -o prctl_main -std=c++11
# ./prctl_main
然后我们查看一下进程的名字:
# ps -ef |grep prctl
root 20758 12289 0 17:39 pts/3 00:00:00 ./prctl_main
root 20791 20422 0 17:39 pts/1 00:00:00 grep --color=auto prctl
可以看到 ps 看到的进程名依然是 prctl_main
而不是 prctl_new_name
。那么 prctl
函数到底修改了哪里呢? ps 命令又是从哪里读取的进程名呢?
/proc/<pid> 虚拟文件夹
linux 上一切皆文件,启动一个进程,就会在系统的 /proc
这个虚拟文件系统下创建这个进程相关的文件夹,里面记录了这个进程的数据。
# ls /proc/20758
attr cgroup comm cwd fd io map_files mountinfo net oom_adj pagemap projid_map schedstat smaps statm task wchan
autogroup clear_refs coredump_filter environ fdinfo limits maps mounts ns oom_score patch_state root sessionid stack status timers
auxv cmdline cpuset exe gid_map loginuid mem mountstats numa_maps oom_score_adj personality sched setgroups stat syscall uid_map
关注一下这两个虚拟文件:
# cat /proc/20758/cmdline
./prctl_main
以及
# cat /proc/20758/status
Name: prctl_new_name
Umask: 0022
State: S (sleeping)
Tgid: 20758
Ngid: 0
Pid: 20758
PPid: 12289
TracerPid: 0
Uid: 0 0 0 0
Gid: 0 0 0 0...(省略)
细心的同学应该发现上面的不一致了吧, /proc/<pid>/cmdline 这个文件记录的进程名是 prctl_main
,而 /proc/<pid>/status 中 Name 值记录的进程名是 prctl_new_name
。而 ps 命令正好是读取了 cmdline 这个文件,导致即便使用 prctl 修改了进程名,但 ps 依然看到的是老的进程名。
另外要注意,prctl() 这个函数有个限制,新进程的名字长度不能超过 16 字节(包括最后的 ‘\0’),详见手册:
https://man7.org/linux/man-pages/man2/prctl.2.html
prctl 结合 argv[0]
上面的分析看到,不论是修改 argv[0] 还是使用 prctl,均有其局限性,那么通常可以结合两者来进行。
源码可以在我的 github 找到:
https://github.com/smaugx/setproctitle/blob/main/hidden_process/hidden_main.cc
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <unistd.h>
#include <sys/prctl.h>#include "../setproctitle.h"char **smaug_os_argv;int main(int argc, char* argv[], char *envp[])
{smaug_os_argv = argv;// set new process NULL to hide processconst char *new_title = "hidden_main_new";if (smaug_init_setproctitle() == SMAUG_PROCTITLE_OK) {smaug_setproctitle(new_title);}// set new process NULL to hide processprctl(PR_SET_NAME, new_title, NULL, NULL, NULL);while (true) {sleep(1);}return 0;
}
编译运行:
# ps -ef |grep hidd
root 21753 12289 0 17:55 pts/3 00:00:00 hidden_main_new
root 21760 20422 0 17:55 pts/1 00:00:00 grep --color=auto hidd# cat /proc/21753/cmdline
hidden_main_new[root@Jiao ~]## cat /proc/21753/status |grep Name
Name: hidden_main_new
可以看到,无论是通过 ps 命令还是直接查看 /proc/<pid>/ 下的文件的方式,均能看到修改后的名字: hidden_main_new
。
隐藏进程
经过上一步,已经可以完美的修改进程名了,那么再进一步,如何隐藏进程呢?
const char *new_title = "";
只需要修改上述的一行代码,重新编译即可,然后用 ps 或者 top 看一下,能不能找到这个进程:
# ps -ef |grep hidden
root 22022 20422 0 17:59 pts/1 00:00:00 grep --color=auto hidden
可以看到 ps 无法找到 hidden* 相关的进程,那么 top 呢?
top - 18:01:06 up 16 days, 4:16, 9 users, load average: 0.00, 0.01, 0.05
Tasks: 121 total, 1 running, 120 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3879952 total, 3579624 free, 95660 used, 204668 buff/cache
KiB Swap: 5242876 total, 5164352 free, 78524 used. 3272224 avail MemPID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
31038 root 20 0 115800 372 368 S 0.0 0.0 0:00.70 bash
22081 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/1:0
22078 root 20 0 162140 2252 1548 R 0.0 0.1 0:00.04 top
22013 root 20 0 11124 1068 908 S 0.0 0.0 0:00.00
21859 root 20 0 115892 244 240 S 0.0 0.0 0:00.46 bash
21725 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/1:2
20811 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0
运行 top 命令,并且以 pid 倒叙排序,注意第四行的进程,可以看到 COMMAND 为空,这个进程就是刚才的这个进程,但是看不到进程名了,达到了简单的、初级的隐藏进程的目的。
扩展一下
上述相关代码均可以在我的 github 找到:
https://github.com/smaugx/setproctitle/tree/main/hidden_process
上面的讨论可以看到,能实现初级的,简单的进程隐藏,但是使用 top 命令还是能看到这个无名进程,那么这点改怎么解决呢?
这里就不展开了,我没有这方面的经验。不过通常来说有两种办法:
- 修改进程名为常见的一些进程名,比如 bash, top, nginx 等以达到混淆的目的
- 想办法把 /proc/<pid>/ 这个虚拟文件夹隐藏或者达到隐藏类的效果(不太擅长)
Blog:
rebootcat.com
email: linuxcode2niki@gmail.com
2020-10-25 于杭州
By 史矛革
Linux上隐藏进程名(初级版)相关推荐
- Linux上安装集群版Redis
[前言] 之前自己在Windows中玩过一段时间Redis(感兴趣的朋友可以看下-Redis系列博客),这次在项目中也有幸能负责起Redis,也由于前两天服务器硬盘损坏导致开发的Redis服务器重新装 ...
- (翻译) MongoDB(10) 在 Red Hat 企业版或者 Centos Linux 上安装MongoDB社区版
概述 使用这个教程在 Red Hat 企业版 Linux 或者 CentOS6/7 Linux 使用 .rpm 软件包安装 MongoDB 社区版. 虽然一些发行版包含自己的 MongoDB 软件包, ...
- linux进程隐藏 argv[0] prctl 修改进程名
目录 前言 一.通过修改进程argv[0]修改进程名 二.通过Linux prctl修改进程名 三.两者方法相结合 前言 Linux下查看进程信息的途径通常有以下几种方式 途径 说明 top.ps等命 ...
- linux wap,在 Linux 上构建 WAP 网关(初级)
Webme09.cublog.cngoogle 在 Linux 上构建 WAP 网关(初级) | 2005-01-27 14:09 实现移动服务的最热门技术是无线应用协议(Wirele ...
- linux上修改html,linux进程名修改
如何修改 Linux 中的进程名 在编写网络服务器程序时,为了响应客户端的请CSS布局HTML小编今天和大家分享,我们经常需要新建进程来处理业务流程:而且又是为了关闭某个非法请CSS布局HTML小编今 ...
- 通过xshell在linux上安装mysql5.7(终极版)
通过xshell在linux上安装mysql5.7(终极版) 0)通过xshell连接到远程服务器 1)彻底删除原来安装的mysql 首先查看:rpm -qa|grep -i mysql 删除操作(一 ...
- Fedora和Red Hat Enterprise Linux实用指南(第6版)(套装上下册)火热上市!!!!
亚马逊热卖地址: http://www.amazon.cn/Fedora%E5%92%8CRed-Hat-Enterprise-Linux%E5%AE%9E%E7%94%A8%E6%8C%87%E5% ...
- 在 Linux 上使用在线版 Microsoft Office
对于许多用户来说,没有对 Microsoft Office 的支持是他们不切换到 Linux 的唯一原因. 是的,Microsoft Office 不能安装在 Linux 上. 对于一些用户来说,在 ...
- linux上wps能云同步吗,Linux版WPS管理云端文档
WPS for Linux的主界面的右上角,有3个非常.非常.非常小的图标,这里藏有玄机! 1 在ElementaryOS上使用WPS for Linux的时间不长,但是体验还是相当不错的.客户端本身 ...
最新文章
- gitlab解决一些问题
- 【机器学习知识体系】- 机器学习问题的一般流程
- Struts2 源码分析——拦截器的机制
- Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
- 04_Spring中使用Quartz
- 电脑qq收藏在哪里打开_外贸询盘怎么来?零成本用Linkedin批量开发客户!外贸人收藏...
- 手动配置ubuntu无线网络
- php中嵌套html代码和html代码中嵌套php方式
- maven的安装配置超详细教程【含nexus】
- 2022-2028年中国企业总部管理行业市场专项调查及投资前景分析报告
- java导出帆软pdf,java后台把fineRepo图表导出pdf格式时发生错误!
- 案例分享 | 蜂窝,是“蜂窝”,虹科HK-DAT数字衰减器助力蜂窝设备测试
- 1050Ti 安装CUDA、cuDNN
- MacOS解压rar文件
- Unity3D接入第三方插件之微信登录安卓SDK
- python输出玫瑰花
- Ubcoin市场:加密货币-商品交易平台
- 智学网登录不了java_智学网常见问题解决方法介绍
- 5G NR无线空口关键技术专题培训
- OSChina 周五乱弹 —— 学学于谦他爸爸王老爷子的一天
热门文章
- java 非模态_Qt 之 模态、非模态、半模态窗口的介绍及 实现QDialog的exec()方法
- io获取 pcl_点云数据可视化之PCL滤波学习
- Reading Paper
- PCL:PCLPlotter可视化特征直方图
- ROS系统——动态修改realsense相机参数方法
- Roundgod and Milk Tea 贪心
- 洛谷P1896 [SCOI2005]互不侵犯 状压dp+位运算
- OpenCV(项目)车牌识别1 -- 车牌提取(形态学)
- linux下比较文件并输出,Linux使用diff命令比较文件找出文件之间相同的部分
- ios xib 四等分_ios Xib的几种用法[转]