目录

前言

一、通过修改进程argv[0]修改进程名

二、通过Linux prctl修改进程名

三、两者方法相结合


前言

Linux下查看进程信息的途径通常有以下几种方式

途径 说明
top、ps等命令 通过ps及top命令查看进程信息时,只能查到相对路径,查不到的进程的详细信息,如绝对路径等。常用命令如下
ps -A 查看所有进程名称;
ps -ef 接显示进程绝对路径及参数;
ps -aux显示所有用户进程状态,最后一列显示进程绝对路径及参数;
top命令 参考http://c.biancheng.net/view/1065.html
/proc/pid/文件夹 Linux在启动一个进程时,系统会在/proc下创建一个以pid命名的文件夹,在该文件夹下会有我们的进程的信息,其中包括一个名为exe的文件即记录了绝对路径,通过ll或ls –l命令即可查看。exe实际运行程序的符号链接;
cmdline 一个只读文件,包含进程的完整命令行信息;
comm 包含进程的命令名;
cwd 进程当前工作目录的符号链接;
status 进程状态信息,包含的信息多于stat;
stat 进程状态信息;
cwd 进程当前工作目录的符号链接;
latency 显示哪些代码造成的延时比较大;
environ记录了进程运行时的环境变量;
fd目录下是进程打开或使用的文件的符号连接。

初级隐藏篇介绍以下两种方式修改隐藏进程名

1. 通过修改进程argv[0]修改进程名
2. 通过Linux prctl修改进程名

一、通过修改进程argv[0]修改进程名

优缺点:

优点是ps -ef 、ps -aux看不到进程名及参数了

缺点是这种方法仅仅是修改了/prco/pid/cmdline 的值,使用ps -A 或者top 命令还是可以看到进程名称

我们知道在一个程序中,参数的个数保存在int型argc中,参数保存在数组argv[]中,数组的第一个元素argv[0]保存的就是进程名,第二个元素argv[1]保存的是第一个参数,依次类推。通过修改进程argv[0]修改进程名,这一方法实现比较简单,我们只要在进程启动mian函数中修改掉argv数组所指向的内存空间的内容即可,这里需要注意的是 linux中main()还有一个隐藏参数就是环境变量信息,存放了运行时所需要的环境变量,

  1. 如果新名称比argv[0]的长度小,我们可以直接修改,并把多余的部分请0

  2. 如果新名称比argv[0]长我们需要两步

​ 1) 申请新内存保存环境变量信息和argv[1…argc-1]参数信息

​ 2) 修改argv[0],将新名称往后到environ的最后一项清0

以下示例代码仅仅是将argv[]清空

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv) {printf("========== Before the modification ============\n");printf("ProcessName: %s\n", argv[0]);for(int i = 1; i < argc; i ++){printf("Argv%d: %s\n", i, argv[i]);}/* Start the modification */int new_argc = argc;char ** new_argv = malloc((argc+1) * sizeof(*new_argv));for(int j = 0; j < argc; j++){size_t length = strlen(argv[j]) + 1;new_argv[j] = malloc(length);memcpy(new_argv[j], argv[j], length);memset(argv[j], '\0', length);}printf("========== After the modification ============\n");printf("ProcessName: %s\n", argv[0]);for(int i = 1; i < argc; i ++){printf("Argv%d: %s\n", i, argv[i]);}printf("========== Copy data ============\n");printf("ProcessName: %s\n", new_argv[0]);for(int k = 1; k < new_argc; k ++){printf("Argv%d: %s\n", k, new_argv[k]);}sleep(1000);return 0;
}

二、通过Linux prctl修改进程名

优缺点:

优点是修改了/prco/pid/stat及/prco/pid/status中的进程名称,使用ps -A 或者top 命令看不到原来的进程名称

缺点是未修改/prco/pid/cmdline 的值,使用ps -ef 、ps -aux可以看到进程名称及参数

使用prctl修改进程名实现也比较简单,

看下面代码

/*
gcc changetitle.c -o changetitle
*/
#include <stdio.h>
#include <sys/prctl.h>int main(int argc, char *argv[], char *envp[])
{char *new_name = "1234567890abcdefg";getchar();prctl(PR_SET_NAME, new_name);getchar();return 0;
}

但是prctl修改的进程名,只能是16个字节(包括’\0’),当新名称长度大于16时就会截断,上面的新名字截断后是1234567890abcde

ubuntu18@ubuntu:~/Desktop/change_processname$ ps -A | grep changubuntu18@ubuntu:~/Desktop/change_processname$ ps -A | grep 123410764 pts/8    00:00:00 1234567890abcdeubuntu18@ubuntu:~/Desktop/change_processname$ cat /proc/10764/stat10764 (1234567890abcde) S 10709 10764 10709 34824 10764 4194304 69 0 0 0 0 0 0 0 20 0 1 0 14090125 4612096 197 18446744073709551615 94579895803904 94579895806128 140721599190352 0 0 0 0 0 0 1 0 0 17 0 0 0 0 0 0 94579897904560 94579897905168 94579902476288 140721599193924 140721599193938 140721599193938 140721599197162 0

三、两者方法相结合

我们可以发现,使用以上两种方法相结合,可以使得 ps -ef 、ps -aux 、ps -A 、top、/proc/pid/status、/proc/pid/cmdline 均看不到真实的进程信息;

看下面代码:

/*
gcc changetitle.c -o changetitle
*/
#include <unistd.h>
#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include <sys/prctl.h># define MAXLINE 2048extern char **environ;static char **g_main_Argv = NULL;    /* pointer to argument vector */
static char *g_main_LastArgv = NULL;    /* end of argv */void setproctitle_init(int argc, char **argv, char **envp)
{int i;for (i = 0; envp[i] != NULL; i++) // calc envp numcontinue;environ = (char **) malloc(sizeof (char *) * (i + 1)); // malloc envp pointerfor (i = 0; envp[i] != NULL; i++){environ[i] = malloc(sizeof(char) * strlen(envp[i]));strcpy(environ[i], envp[i]);}environ[i] = NULL;g_main_Argv = argv;if (i > 0)g_main_LastArgv = envp[i - 1] + strlen(envp[i - 1]);elseg_main_LastArgv = argv[argc - 1] + strlen(argv[argc - 1]);
}void setproctitle(const char *fmt, ...)
{char *p;int i;char buf[MAXLINE];extern char **g_main_Argv;extern char *g_main_LastArgv;va_list ap;p = buf;va_start(ap, fmt);vsprintf(p, fmt, ap);va_end(ap);i = strlen(buf);if (i > g_main_LastArgv - g_main_Argv[0] - 2){i = g_main_LastArgv - g_main_Argv[0] - 2;buf[i] = '\0';}//修改argv[0](void) strcpy(g_main_Argv[0], buf);p = &g_main_Argv[0][i];while (p < g_main_LastArgv)*p++ = '\0';g_main_Argv[1] = NULL;//调用prctlprctl(PR_SET_NAME,buf);
}int main(int argc, char *argv[])
{char argv_buf[MAXLINE] = {0}; // save argv paramtersint i;for( i = 1; i < argc; i++){strcat(argv_buf, argv[i]);strcat(argv_buf, " ");}//修改argv[0]所指向的内存空间的内容setproctitle_init(argc, argv, environ);//调用prctl修改进程名setproctitle("%s@%s %s", "12345678", "ip", argv_buf);for (i = 0; environ[i] != NULL; i++)free(environ[i]);getchar();return 0;
}

但是这样还是有一定的局限性,比如说,ps、top等命令还是能看见真实的pid信息,proc文件夹下还是会生成相应的pid文件夹;最理想的情况应该是让我们的进程信息彻底消失,Linux进程隐藏-中级隐藏篇将会进一步介绍更加高级的进程隐藏技术。

linux进程隐藏 argv[0] prctl 修改进程名相关推荐

  1. linux进程隐藏 hook readdir函数 挂载覆盖/proc/pid 目录

    前言 上篇介绍了如何在有源码的情况下,通过 argv[] 及 prctl 对进程名及参数进行修改,整篇围绕/proc/pid/目录和 ps.top 命令进行分析,做到了初步隐藏,即修改了 /proc/ ...

  2. (渗透测试后期)Linux进程隐藏详解

    文章目录 (渗透测试后期)Linux进程隐藏详解 前言 Linux进程基础 Linux进程侦查手段 Linux进程隐藏手段 一.基于用户态的进程隐藏 方法1:小隐隐于/proc/pid--劫持read ...

  3. linux 进程隐藏常见方法

    一.基于用户空间进程隐藏手法 1.偷梁换柱型 1)隐藏原理 ​ 道理很简单,通过替换系统中常见的进程查看工具(比如ps.top.lsof)的二进制程序,导致原先查看进程相关信息的工具(ps.top.l ...

  4. Linux进程隐藏问题————显示隐藏进程

    阿里云云监控到有两台redis服务器CPU被某进程消耗400%cpu资源 系统查看Top 情况并未找到高消耗进程X7但CPU100%ni Netstat 查找到了一些异常请求,初步判断出组件被提权入侵 ...

  5. 深入理解Linux进程管理(1.0)

    学习方法论 写作原则 标题括号中的数字代表完成度与完善度 0.0-1.0 代表完成度,1.1-1.5 代表完善度 0.0 :还没开始写 0.1 :写了一个简介 0.3 :写了一小部分内容 0.5 :写 ...

  6. 【Linux、进程隐藏】在Linux环境下添加系统调用实现进程隐藏

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 [进程隐藏]在Linux环境下添加系统调用实现进程隐藏 前言 一.环境设置: 二.实现方法步骤: 1.思路图 2.利用strace命令 ...

  7. 模仿nginx修改进程名

    个人博客原文: https://rebootcat.com/2020/10/25/setproctitle/ nginx 进程名 使用 nginx 的过程中,我们经常看到 nginx 的进程名是不同的 ...

  8. linux修改进程名字,linux修改进程名

    一.linux中的进程名 linux中有很多查看/操作进程的命令. 这些命令的参数或显示的结果,有的是真实的进程名(top/pstree/pgrep/kill/killall),有的是进程的命令行参数 ...

  9. Linux上隐藏进程名(初级版)

    缘起 上一篇博文 模仿nginx修改进程名 中提到了一种修改进程名的方法,就像 nginx 一样,给不同进程命名为 master 以及 worker 等.那么能不能把新进程名设置为空字符串呢?如果能, ...

最新文章

  1. 如何防止博客文章被窃取
  2. caffe 报错 Check failed: error == cudaSuccess (77 vs. 0) an illegal memory access was encounteredcaffe
  3. matlab绘制bland-altman,制作Bland-Altman图的步骤和程序(以SPSS作图为例讲解)
  4. 有3个集合, 从其中一个集合中删除同时存在于另外两个集合的元素
  5. Python 随机森林分类
  6. 浅析文件传输协议 (ftp) 的工作原理
  7. html5写入唯一标识,id - 唯一标识符 - html5全局属性
  8. Java8 方法引用
  9. 测试唯一ID支持多大的并发量
  10. 用yolov5训练kitti数据集
  11. w10计算机管理权限,设置win10管理权限_win10系统如何获取管理员权限
  12. IDEA的下载和使用安装
  13. Qt5给Excel添加批注
  14. win10打开资源管理器右键总是转圈卡顿的解决办法
  15. Ubuntu安装cuckoo布谷鸟沙箱详细步骤
  16. python爬虫 批量下载高清大图
  17. Error: At least one module has an unresolved import due to a missing export function in an implicitl
  18. coursera课程,coursera课程下载学习
  19. NVIDIA Control Panel 出现问题。请与你的系统管理员联系,以了解有关修复或重新安装该应用的信息。 关于win10安装新版N卡驱动没有显卡控制面板的解决办法
  20. xadmin的一些自定义

热门文章

  1. 爬虫初学(一):爬取笔趣阁小说(萌新用-详细讲解)
  2. Evosuite用maven构建(内附详细过程)
  3. 亚马逊云人工智能学习
  4. 【论文阅读】Fair and Efficient Gossip in Hyperledger Fabric -- ICDCS
  5. Spring的7种事务传播机制
  6. 【X-Ray】关于灯丝电压电流功率的理解
  7. 机器学习-白板推导-系列(五)笔记:降维(PCA/SVD/PCoA/PPCA)
  8. 云主机的魅力指数在哪?八度网络云主机为何崭露头角?
  9. Pngquant cannot open pngquant for reding 报错原因解决办法
  10. 计算机如何更改用户账户控制,互联网要点:如何更改电脑上的用户账户控制设置...