千家信息网

Linux下查看进程信息的途径以及修改进程名的方法

发表于:2025-01-17 作者:千家信息网编辑
千家信息网最后更新 2025年01月17日,本篇内容介绍了"Linux下查看进程信息的途径以及修改进程名的方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能
千家信息网最后更新 2025年01月17日Linux下查看进程信息的途径以及修改进程名的方法

本篇内容介绍了"Linux下查看进程信息的途径以及修改进程名的方法"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

前言

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 #include #include #include 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 #include 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 #include #include #include #include #include # 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 num        continue;    environ = (char **) malloc(sizeof (char *) * (i + 1)); // malloc envp pointer    for (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]);    else        g_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;        //调用prctl    prctl(PR_SET_NAME,buf);}int main(int argc, char *argv[]){    char argv_buf[MAXLINE] = {0}; // save argv paramters    int 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下查看进程信息的途径以及修改进程名的方法"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!

进程 信息 命令 参数 名称 文件 方法 文件夹 路径 途径 代码 内容 变量 环境 符号 缺点 还是 内存 数组 状态 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 我的世界蜂巢服务器 怎么筛选字符多的数据库 钉钉接口如何连接内网服务器 数据库网页设计图 服务器管理 推荐书 数据结构与数据库技术 剑侠情缘3服务器查询 主根服务器什么时候出来的 网络安全黑客基本理论 数学题目怎么存入数据库 sql如何将数据库表导入数据库 市场监管网络安全监管宣传 部落冲突服务器断开连接不上 计算机网络技术难学吗知乎 澪pro服务器版怎么加外设 黑河网络安全倡议书 机动车驾驶人网络安全教育 计算机专业研究生网络安全吗 数据库与信息系统实验四 深圳自主可控软件开发定做价格 客户机服务器模式名词解释 关于高校网络安全的总结 财务专业软件开发 邯郸首选dns服务器 幻塔折跃门显示服务器未准备好 联通网络技术研究院 面试 传统的网络安全主要包括 根域名服务器是远程域名服务器 ps5账号无法连接到服务器 ios软件开发工资待遇
0