您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Linux下查看進(jìn)程信息的途徑以及修改進(jìn)程名的方法”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
Linux下查看進(jìn)程信息的途徑通常有以下幾種方式
途徑 | 說(shuō)明 |
---|---|
top、ps等命令 | 通過(guò)ps及top命令查看進(jìn)程信息時(shí),只能查到相對(duì)路徑,查不到的進(jìn)程的詳細(xì)信息,如絕對(duì)路徑等。常用命令如下 ps -A 查看所有進(jìn)程名稱; ps -ef 接顯示進(jìn)程絕對(duì)路徑及參數(shù); ps -aux顯示所有用戶進(jìn)程狀態(tài),最后一列顯示進(jìn)程絕對(duì)路徑及參數(shù); top命令 參考http://c.biancheng.net/view/1065.html |
/proc/pid/文件夾 | Linux在啟動(dòng)一個(gè)進(jìn)程時(shí),系統(tǒng)會(huì)在/proc下創(chuàng)建一個(gè)以pid命名的文件夾,在該文件夾下會(huì)有我們的進(jìn)程的信息,其中包括一個(gè)名為exe的文件即記錄了絕對(duì)路徑,通過(guò)ll或ls –l命令即可查看。exe實(shí)際運(yùn)行程序的符號(hào)鏈接; cmdline 一個(gè)只讀文件,包含進(jìn)程的完整命令行信息; comm 包含進(jìn)程的命令名; cwd 進(jìn)程當(dāng)前工作目錄的符號(hào)鏈接; status 進(jìn)程狀態(tài)信息,包含的信息多于stat; stat 進(jìn)程狀態(tài)信息; cwd 進(jìn)程當(dāng)前工作目錄的符號(hào)鏈接; latency 顯示哪些代碼造成的延時(shí)比較大; environ記錄了進(jìn)程運(yùn)行時(shí)的環(huán)境變量; fd目錄下是進(jìn)程打開(kāi)或使用的文件的符號(hào)連接。 |
初級(jí)隱藏篇介紹以下兩種方式修改隱藏進(jìn)程名
1. 通過(guò)修改進(jìn)程argv[0]修改進(jìn)程名 2. 通過(guò)Linux prctl修改進(jìn)程名
優(yōu)缺點(diǎn):
優(yōu)點(diǎn)是ps -ef 、ps -aux看不到進(jìn)程名及參數(shù)了
缺點(diǎn)是這種方法僅僅是修改了/prco/pid/cmdline 的值,使用ps -A 或者top 命令還是可以看到進(jìn)程名稱
我們知道在一個(gè)程序中,參數(shù)的個(gè)數(shù)保存在int型argc中,參數(shù)保存在數(shù)組argv[]中,數(shù)組的第一個(gè)元素argv[0]保存的就是進(jìn)程名,第二個(gè)元素argv[1]保存的是第一個(gè)參數(shù),依次類推。通過(guò)修改進(jìn)程argv[0]修改進(jìn)程名,這一方法實(shí)現(xiàn)比較簡(jiǎn)單,我們只要在進(jìn)程啟動(dòng)mian函數(shù)中修改掉argv數(shù)組所指向的內(nèi)存空間的內(nèi)容即可,這里需要注意的是 linux中main()還有一個(gè)隱藏參數(shù)就是環(huán)境變量信息,存放了運(yùn)行時(shí)所需要的環(huán)境變量,
如果新名稱比argv[0]的長(zhǎng)度小,我們可以直接修改,并把多余的部分請(qǐng)0
如果新名稱比argv[0]長(zhǎng)我們需要兩步
1) 申請(qǐng)新內(nèi)存保存環(huán)境變量信息和argv[1…argc-1]參數(shù)信息
2) 修改argv[0],將新名稱往后到environ的最后一項(xiàng)清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; }
優(yōu)缺點(diǎn):
優(yōu)點(diǎn)是修改了/prco/pid/stat及/prco/pid/status中的進(jìn)程名稱,使用ps -A 或者top 命令看不到原來(lái)的進(jìn)程名稱
缺點(diǎn)是未修改/prco/pid/cmdline 的值,使用ps -ef 、ps -aux可以看到進(jìn)程名稱及參數(shù)
使用prctl修改進(jìn)程名實(shí)現(xiàn)也比較簡(jiǎn)單,
看下面代碼
/* 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修改的進(jìn)程名,只能是16個(gè)字節(jié)(包括’\0’),當(dāng)新名稱長(zhǎng)度大于16時(shí)就會(huì)截?cái)?,上面的新名字截?cái)嗪笫?234567890abcde
ubuntu18@ubuntu:~/Desktop/change_processname$ ps -A | grep chang ubuntu18@ubuntu:~/Desktop/change_processname$ ps -A | grep 1234 10764 pts/8 00:00:00 1234567890abcde ubuntu18@ubuntu:~/Desktop/change_processname$ cat /proc/10764/stat 10764 (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
我們可以發(fā)現(xiàn),使用以上兩種方法相結(jié)合,可以使得 ps -ef 、ps -aux 、ps -A 、top、/proc/pid/status、/proc/pid/cmdline 均看不到真實(shí)的進(jìn)程信息;
看下面代碼:
/* 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 2048 extern 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; //調(diào)用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]所指向的內(nèi)存空間的內(nèi)容 setproctitle_init(argc, argv, environ); //調(diào)用prctl修改進(jìn)程名 setproctitle("%s@%s %s", "12345678", "ip", argv_buf); for (i = 0; environ[i] != NULL; i++) free(environ[i]); getchar(); return 0; }
但是這樣還是有一定的局限性,比如說(shuō),ps、top等命令還是能看見(jiàn)真實(shí)的pid信息,proc文件夾下還是會(huì)生成相應(yīng)的pid文件夾;最理想的情況應(yīng)該是讓我們的進(jìn)程信息徹底消失。
“Linux下查看進(jìn)程信息的途徑以及修改進(jìn)程名的方法”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。