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代码搞定一款游戏?给力!
来源:pypl编程榜一直以来Python长期霸占编程语言排行榜前三位,其简洁,功能强大的特性使越来越多的小伙伴开始学习Python 。甚至K12的同学都开始学习Python 编程。新手入门的时候趣味性其实最重要的。那么一行Python 代码到底能玩出什么花样&a…

jquery对所有input type=text的控件赋值
function resetData() { $("input[typetext]").each( function() { $(this).attr("value",""); } ); }

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

成大事必备9种能力
挑战生存的能力:善于在现实中寻找答案 1、摆正心态,敢于面对现实 对于那些不停地抱怨现实恶劣的人来说,不能称心如意的现实,就如同生活的牢笼&a…
懂语言者得天下:NLP凭什么被称为人工智能的掌上明珠?
受访者 | 简仁贤,竹间智能创始人&CEO记者 | 邓晓娟出品 | AI科技大本营(ID:rgznai100)随着技术的发展,大数据、云计算、人工智能、区块链都慢慢地为人熟知。2016 年 Google 推出 AlphaGo,让人工智能走进了大众的视…

[转]SIFT特征提取分析
SIFT(Scale-invariant feature transform)是一种检测局部特征的算法,该算法通过求一幅图中的特征点(interest points,or corner points)及其有关scale 和 orientation 的描述子得到特征并进行图像特征点匹配࿰…

博客大事记之迁移博客到香港主机
个人博客:https://rebootcat.com/2020/11/10/move_blog_hk/ 前言 之前其实已经写过一篇博文: 迁移博客到香港虚拟空间,那为什么又要写这篇博客呢? 上次其实是把我的博客迁移到一个香港的虚拟空间里,但是不到半年的时…
限时福利:腾讯高级专家手把手教你打造 OCR 神器!
OCR,英文全称即 optical characters recognition(光学字符识别),通过服务器把图片上的文字识别出来,以供大家编辑使用,比如进出火车站的时候,已经可以自动识别的身份证;在道路行驶中…

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

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

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

[转] ASP.NET MVC3 路由和多数据集的返回
1.ASP.NET MVC3 中的路由 同前边一样本篇并不会过多的介绍理论知识,我们在Global.asax.cs文件中可以看到如下代码: routes.MapRoute("Default", // Route name"{controller}/{action}/{id}", // URL with parametersnew { controlle…
给Python代码加上酷炫进度条的几种姿势
作者 | 刘早起来源 | 早起Python(ID: zaoqi-python)大家好,在下载某些文件的时候你一定会不时盯着进度条,在写代码的时候使用进度条可以便捷的观察任务处理情况,除了使用print来打印之外,今天本文就介绍几种…

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

深入浅出paxos
原文 https://rebootcat.com/2020/12/05/paxos/
Uber 前无人驾驶工程师告诉你,国内无人驾驶之路还要走多久?
受访者 | Graviti 创始人&CEO 崔运凯记者 | Aholiab,编辑 | Carol出品 | AI科技大本营(ID:rgznai100)经过数年的发展,现在的人们谈到“AI”已经不再像过去一般感到遥不可及。但 AI 在国内发挥的作用仍然只是冰山一角ÿ…

oracle服务
OracleOraDb11g_home1ClrAgent服务,在网上查找到了资料 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来切割字符串的好处在于,可以指定任意字符作为分隔符来切割单词。使用该函数,切割字符串的分隔符可以同时指定多个,放在一个字符串数组中。 …

WEB打印大全
1、控制"纵打"、 横打”和“页面的边距。 (1)<script defer> function SetPrintSettings() { // -- advanced features factory.printing.SetMarginMeasure(2) // measure margins in inches factory.SetPageRange(false, 1, 3) // ne…
漫画 | 程序媛小姐姐带你一次了解什么是排序算法
来源 | 小齐本齐封图 | CSDN 付费下载自视觉中国插入排序借用《算法导论》里的例子,就是我们打牌的时候,每新拿一张牌都会把它按顺序插入,这,其实就是插入排序。齐姐声明:虽然我们用打牌的例子,但是可不能学…

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

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

Unix / Linux世界里的4-2-1
Unix / Linux世界里的4-2-1 在Unix / Linux世界里,4代表可读( r ),2代表可写入 ( w ),1代表可执行 ( x ) 如果拥有7 421 的权限,即代表这个人可以对档案完全控制。 以0777为例: 去掉0,第一个7代表着拥有者…
深度学习概述:NLP vs CNN
作者 | Manish Kuwar译者 | 苏本如,责编 | 郭芮头图 | CSDN 下载自视觉中国出品 | CSDN(ID:CSDNnews)以下为译文:当今,人工智能已经不仅仅是一个技术术语了。这项技术在过去十年的时间内几乎将其影响扩展到…

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(global search regular expression(RE)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。UNIX的grep家族包括grep、egrep和fgrep。egrep和fgrep的命令…
万字长文综述目标检测领域,你要的都在这里
来源 | AI专栏(ID: pursue-Y-future)目标检测是计算机视觉中的一个重要问题,近年来传统检测方法已难以满足人们对目标检测效果的要求,随着深度学习在图像分类任务上取得巨大进展,基于深度学习的目标检测算法逐渐成为主…

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

PreferenceActivity是什么?
我们看到Android系统本身就大量用到了PreferenceActivity来对系统进行信息配置和管理,那么它是怎么保存数据的呢,如何创建PrefenceActivity的呢?创建Android项目,并添加一个pref.xml文件(先建一个xml名的Folder)。注意,这次选择的…
坑系列 --- 时间和空间的平衡
这是坑系列的最后一弹了,这篇文章非常长,希望你能看完,要是看完有很酣畅的感觉就最好了。这一篇的坑主要来说说架构中时间和空间的平衡吧,这里的时间指代比较广,可能是开发时间,但大部分指的是执行时间&…