缘起
上一篇博文 模仿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