当前位置: 首页 > 编程日记 > 正文

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 史矛革

相关文章:

神操作!一行Python代码搞定一款游戏?给力!

来源&#xff1a;pypl编程榜一直以来Python长期霸占编程语言排行榜前三位&#xff0c;其简洁&#xff0c;功能强大的特性使越来越多的小伙伴开始学习Python 。甚至K12的同学都开始学习Python 编程。新手入门的时候趣味性其实最重要的。那么一行Python 代码到底能玩出什么花样&a…

jquery对所有input type=text的控件赋值

function resetData() { $("input[typetext]").each( function() { $(this).attr("value",""); } ); }

free not return memory

个人博客&#xff1a;https://rebootcat.com/2020/11/05/free_mem/ 内存泄露&#xff1f; 观察到一台机器上的内存使用量在程序启动之后&#xff0c;持续增长&#xff0c;中间没有出现内存恢复。怀疑是不是出现了内存泄露的问题&#xff1f; 然后使用相关的内存分析工具进行了…

成大事必备9种能力

挑战生存的能力&#xff1a;善于在现实中寻找答案 1、摆正心态&#xff0c;敢于面对现实 对于那些不停地抱怨现实恶劣的人来说&#xff0c;不能称心如意的现实&#xff0c;就如同生活的牢笼&a…

懂语言者得天下:NLP凭什么被称为人工智能的掌上明珠?

受访者 | 简仁贤&#xff0c;竹间智能创始人&CEO记者 | 邓晓娟出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;随着技术的发展&#xff0c;大数据、云计算、人工智能、区块链都慢慢地为人熟知。2016 年 Google 推出 AlphaGo&#xff0c;让人工智能走进了大众的视…

[转]SIFT特征提取分析

SIFT&#xff08;Scale-invariant feature transform&#xff09;是一种检测局部特征的算法&#xff0c;该算法通过求一幅图中的特征点&#xff08;interest points,or corner points&#xff09;及其有关scale 和 orientation 的描述子得到特征并进行图像特征点匹配&#xff0…

博客大事记之迁移博客到香港主机

个人博客&#xff1a;https://rebootcat.com/2020/11/10/move_blog_hk/ 前言 之前其实已经写过一篇博文&#xff1a; 迁移博客到香港虚拟空间&#xff0c;那为什么又要写这篇博客呢&#xff1f; 上次其实是把我的博客迁移到一个香港的虚拟空间里&#xff0c;但是不到半年的时…

限时福利:腾讯高级专家手把手教你打造 OCR 神器!

OCR&#xff0c;英文全称即 optical characters recognition&#xff08;光学字符识别&#xff09;&#xff0c;通过服务器把图片上的文字识别出来&#xff0c;以供大家编辑使用&#xff0c;比如进出火车站的时候&#xff0c;已经可以自动识别的身份证&#xff1b;在道路行驶中…

C++与.net的编译方式

C和.Net程序采用了两种不同的编译方式。 通常一个C编写的程序&#xff0c;都是一次编译成二进制的代码&#xff0c;在相应的操作系统平台上直接执行即可。 而.Net程序采用两次编译的方式&#xff0c;用C#&#xff0c;VB.Net等语言写成的程序被编译成IL代码&#xff0c;通过CLR在…

awk (一)

示例文件&#xff1a;[rootorclsrv ~]# catsample Heigh-ho! sing,heigh-ho! unto the green holly: Most friendship isfeigning, most loving mere folly: Then, heigh-ho, theholly!使用感叹号(!) 作为字段分隔符(FS)打印示例数据的第1 个字段&#xff1a;[rootorclsrv~]# …

TCP全连接和半连接的问题探讨

个人博客&#xff1a; https://rebootcat.com/2020/11/14/tcp_accept/ 从何说起 说起 tcp 的连接过程&#xff0c;想必 “3次握手4次挥手”是大家广为熟知的知识&#xff0c;那么关于更细节更底层的连接过程也许就很少人能讲清楚了。 所以本文会先简单回顾一下 tcp 的 3次握手…

[转] ASP.NET MVC3 路由和多数据集的返回

1.ASP.NET MVC3 中的路由 同前边一样本篇并不会过多的介绍理论知识&#xff0c;我们在Global.asax.cs文件中可以看到如下代码&#xff1a; routes.MapRoute("Default", // Route name"{controller}/{action}/{id}", // URL with parametersnew { controlle…

给Python代码加上酷炫进度条的几种姿势

作者 | 刘早起来源 | 早起Python&#xff08;ID: zaoqi-python&#xff09;大家好&#xff0c;在下载某些文件的时候你一定会不时盯着进度条&#xff0c;在写代码的时候使用进度条可以便捷的观察任务处理情况&#xff0c;除了使用print来打印之外&#xff0c;今天本文就介绍几种…

(转)mongodb分片

本文转载自&#xff1a;http://www.cnblogs.com/huangxincheng/archive/2012/03/07/2383284.html 在mongodb里面存在另一种集群&#xff0c;就是分片技术&#xff0c;跟sql server的表分区类似&#xff0c;我们知道当数据量达到T级别的时候&#xff0c;我们的磁盘&#xff0c;内…

深入浅出paxos

原文 https://rebootcat.com/2020/12/05/paxos/

Uber 前无人驾驶工程师告诉你,国内无人驾驶之路还要走多久?

受访者 | Graviti 创始人&CEO 崔运凯记者 | Aholiab&#xff0c;编辑 | Carol出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;经过数年的发展&#xff0c;现在的人们谈到“AI”已经不再像过去一般感到遥不可及。但 AI 在国内发挥的作用仍然只是冰山一角&#xff…

oracle服务

OracleOraDb11g_home1ClrAgent服务&#xff0c;在网上查找到了资料 http://download.oracle.com/docs/cd/B19306_01/win.102/b14306/install.htm Configuring Extproc Agent Using Windows Service As part of Oracle Database Extensions for .NET installation, a Windows se…

B00009 C语言分割字符串库函数strtok

切割字符串是常用的处理。 这里给出一个使用函数strtok切割字符串的例子。 使用C语言的库函数strtok来切割字符串的好处在于&#xff0c;可以指定任意字符作为分隔符来切割单词。使用该函数&#xff0c;切割字符串的分隔符可以同时指定多个&#xff0c;放在一个字符串数组中。 …

WEB打印大全

1、控制"纵打"、 横打”和“页面的边距。 &#xff08;1&#xff09;<script defer> function SetPrintSettings() { // -- advanced features factory.printing.SetMarginMeasure(2) // measure margins in inches factory.SetPageRange(false, 1, 3) // ne…

漫画 | 程序媛小姐姐带你一次了解什么是排序算法

来源 | 小齐本齐封图 | CSDN 付费下载自视觉中国插入排序借用《算法导论》里的例子&#xff0c;就是我们打牌的时候&#xff0c;每新拿一张牌都会把它按顺序插入&#xff0c;这&#xff0c;其实就是插入排序。齐姐声明&#xff1a;虽然我们用打牌的例子&#xff0c;但是可不能学…

POJ 1207 The 3n + 1 problem

题目链接&#xff1a;http://poj.org/problem?id1207 题目大意&#xff1a;给你一个数x&#xff0c;规定一个函数F(x)&#xff0c;如果x为1则F(x)1&#xff0c;否则如果x是偶数&#xff0c;F(x)F(x/2)&#xff0c;x为奇数F(x)F(3*x1)计算给定x到变换到1的步数。 注意点&#x…

PopupWindow响应返回键的问题

假设情景是这样的&#xff1a;在一个Activity中弹出一个PopupWindow&#xff0c;要求在按返回键时关闭该PopupWindow。 如果该PopupWindow是无焦点的&#xff08;默认情况&#xff09;&#xff0c;那么可以在Activity中响应返回键&#xff08;onBackPressed&#xff09;&#x…

Unix / Linux世界里的4-2-1

Unix / Linux世界里的4-2-1 在Unix / Linux世界里&#xff0c;4代表可读( r )&#xff0c;2代表可写入 ( w )&#xff0c;1代表可执行 ( x ) 如果拥有7 421 的权限&#xff0c;即代表这个人可以对档案完全控制。 以0777为例&#xff1a; 去掉0&#xff0c;第一个7代表着拥有者…

深度学习概述:NLP vs CNN

作者 | Manish Kuwar译者 | 苏本如&#xff0c;责编 | 郭芮头图 | CSDN 下载自视觉中国出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;以下为译文&#xff1a;当今&#xff0c;人工智能已经不仅仅是一个技术术语了。这项技术在过去十年的时间内几乎将其影响扩展到…

oracle 求A中不存在于B的记录

oracle 求A中不存在于B的记录 select * from a minus select * from b 是求A中不存在于B的记录select * from a union select * from b 是求A和B的DISTINCT的并集select * from a union all select * from b 是求A和B的冗余并集那么A和B的交集是什么函数来的?交集是 INTERSE…

正则表达式grep、egrep--already

第一式 grep是什么 #man grepgrep&#xff08;global search regular expression&#xff08;RE&#xff09;是一种强大的文本搜索工具&#xff0c;它能使用正则表达式搜索文本&#xff0c;并把匹配的行打印出来。UNIX的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令…

万字长文综述目标检测领域,你要的都在这里

来源 | AI专栏&#xff08;ID: pursue-Y-future&#xff09;目标检测是计算机视觉中的一个重要问题&#xff0c;近年来传统检测方法已难以满足人们对目标检测效果的要求&#xff0c;随着深度学习在图像分类任务上取得巨大进展&#xff0c;基于深度学习的目标检测算法逐渐成为主…

ASP.net随机数应用实例

家可能都用过Chinaren的校友录&#xff0c;不久前它的留言簿上加了一个防止灌水的方法&#xff0c;就是系统每次产生一个由随机的数字和字母组成的图片&#xff0c;每次留言必须正确地输入这些随机产生的字符&#xff0c;否则不能添加留言。这是一个很好的防止恶意攻击的方法&a…

PreferenceActivity是什么?

我们看到Android系统本身就大量用到了PreferenceActivity来对系统进行信息配置和管理&#xff0c;那么它是怎么保存数据的呢&#xff0c;如何创建PrefenceActivity的呢?创建Android项目&#xff0c;并添加一个pref.xml文件(先建一个xml名的Folder)。注意&#xff0c;这次选择的…

坑系列 --- 时间和空间的平衡

这是坑系列的最后一弹了&#xff0c;这篇文章非常长&#xff0c;希望你能看完&#xff0c;要是看完有很酣畅的感觉就最好了。这一篇的坑主要来说说架构中时间和空间的平衡吧&#xff0c;这里的时间指代比较广&#xff0c;可能是开发时间&#xff0c;但大部分指的是执行时间&…