缘起

上一篇博文 模仿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上隐藏进程名(初级版)相关推荐

  1. Linux上安装集群版Redis

    [前言] 之前自己在Windows中玩过一段时间Redis(感兴趣的朋友可以看下-Redis系列博客),这次在项目中也有幸能负责起Redis,也由于前两天服务器硬盘损坏导致开发的Redis服务器重新装 ...

  2. (翻译) MongoDB(10) 在 Red Hat 企业版或者 Centos Linux 上安装MongoDB社区版

    概述 使用这个教程在 Red Hat 企业版 Linux 或者 CentOS6/7 Linux 使用 .rpm 软件包安装 MongoDB 社区版. 虽然一些发行版包含自己的 MongoDB 软件包, ...

  3. linux进程隐藏 argv[0] prctl 修改进程名

    目录 前言 一.通过修改进程argv[0]修改进程名 二.通过Linux prctl修改进程名 三.两者方法相结合 前言 Linux下查看进程信息的途径通常有以下几种方式 途径 说明 top.ps等命 ...

  4. linux wap,在 Linux 上构建 WAP 网关(初级)

    Webme09.cublog.cngoogle 在 Linux 上构建 WAP 网关(初级) | 2005-01-27 14:09         实现移动服务的最热门技术是无线应用协议(Wirele ...

  5. linux上修改html,linux进程名修改

    如何修改 Linux 中的进程名 在编写网络服务器程序时,为了响应客户端的请CSS布局HTML小编今天和大家分享,我们经常需要新建进程来处理业务流程:而且又是为了关闭某个非法请CSS布局HTML小编今 ...

  6. 通过xshell在linux上安装mysql5.7(终极版)

    通过xshell在linux上安装mysql5.7(终极版) 0)通过xshell连接到远程服务器 1)彻底删除原来安装的mysql 首先查看:rpm -qa|grep -i mysql 删除操作(一 ...

  7. 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% ...

  8. 在 Linux 上使用在线版 Microsoft Office

    对于许多用户来说,没有对 Microsoft Office 的支持是他们不切换到 Linux 的唯一原因. 是的,Microsoft Office 不能安装在 Linux 上. 对于一些用户来说,在 ...

  9. linux上wps能云同步吗,Linux版WPS管理云端文档

    WPS for Linux的主界面的右上角,有3个非常.非常.非常小的图标,这里藏有玄机! 1 在ElementaryOS上使用WPS for Linux的时间不长,但是体验还是相当不错的.客户端本身 ...

最新文章

  1. gitlab解决一些问题
  2. 【机器学习知识体系】- 机器学习问题的一般流程
  3. Struts2 源码分析——拦截器的机制
  4. Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
  5. 04_Spring中使用Quartz
  6. 电脑qq收藏在哪里打开_外贸询盘怎么来?零成本用Linkedin批量开发客户!外贸人收藏...
  7. 手动配置ubuntu无线网络
  8. php中嵌套html代码和html代码中嵌套php方式
  9. maven的安装配置超详细教程【含nexus】
  10. 2022-2028年中国企业总部管理行业市场专项调查及投资前景分析报告
  11. java导出帆软pdf,java后台把fineRepo图表导出pdf格式时发生错误!
  12. 案例分享 | 蜂窝,是“蜂窝”,虹科HK-DAT数字衰减器助力蜂窝设备测试
  13. 1050Ti 安装CUDA、cuDNN
  14. MacOS解压rar文件
  15. Unity3D接入第三方插件之微信登录安卓SDK
  16. python输出玫瑰花
  17. Ubcoin市场:加密货币-商品交易平台
  18. 智学网登录不了java_智学网常见问题解决方法介绍
  19. 5G NR无线空口关键技术专题培训
  20. OSChina 周五乱弹 —— 学学于谦他爸爸王老爷子的一天

热门文章

  1. java 非模态_Qt 之 模态、非模态、半模态窗口的介绍及 实现QDialog的exec()方法
  2. io获取 pcl_点云数据可视化之PCL滤波学习
  3. Reading Paper
  4. PCL:PCLPlotter可视化特征直方图
  5. ROS系统——动态修改realsense相机参数方法
  6. Roundgod and Milk Tea 贪心
  7. 洛谷P1896 [SCOI2005]互不侵犯 状压dp+位运算
  8. OpenCV(项目)车牌识别1 -- 车牌提取(形态学)
  9. linux下比较文件并输出,Linux使用diff命令比较文件找出文件之间相同的部分
  10. ios xib 四等分_ios Xib的几种用法[转]