Ring3 hook动态库优先加载劫持函数调用(用于实现文件监控)

  1 #include <stdio.h>                                                                                                                        
  2 #include <string.h>
  3 #include <stdlib.h>
  4 #include <dlfcn.h>
  5 #include <sys/stat.h>
  6 #include <unistd.h>
  7 typedef int (*realopen)(const char *pathname,int flags);
  8 
  9 int open(const char *pathname,int flags)
 10 {
 11     void *handle = NULL;
 12     realopen oldopen = NULL;
        //获得libc.so.6的句柄
 13     handle = dlopen("libc.so.6",RTLD_LAZY);
 		//返回open函数在libc.so.6中的加载时地址
 14     oldopen = (realopen)dlsym(handle,"open");
 15     
 16     struct stat s;
 17     stat(pathname,&s);
 18     
 19     if(s.st_size > 200)
 20     {
 21         printf("进程%d打开文件%s\n",getpid(),pathname);
 22         return oldopen(pathname,flags);
 23     }   
 24     else
 25     {
 26         printf("进程%d非法打开文件 %s\n",getpid(),pathname);
 27         exit(0);
 28     }   
 29 }   

gcc -fPIC -shared -o libmyopen.so filelisten.c -ldl (没有ldl会报错)
生成动态库后设置环境变量,优先加载我们自己写的动态库实现劫持。

export LD_PRELOAD = /home/fd/work/libmyopen.so
当前会话有效
或者临时一次生效LD_PRELOAD=./libmyopen.c ./openfile

单个用户永久生效的话系统不一样文件不同.bashrc或者.bash_profile等,设置同上export LD_PRELOAD = /home/fd/work/libmyopen.so

或者在/etc/profile中永久设置(全用户永久生效)
export LD_PRELOAD = /home/fd/work/libmyopen.so

或者添加到系统配置文件中(全局生效) ldconfig
vim /etc/ld.so.preload
/home/fd/work/libmyopen.so

如果是全局设置然后重启后生效了,因为我hook的是open,所以逻辑一定不要乱写即便是实验。就是因为如此,我reboot后导致了ubuntu进不去了。即便是crtl+alt+F几来着忘了,然后root登录接着就闪退,一直这样网上搜索资料是让我命令行操作的,但是我都进不了咋命令行,没搞清楚。反正结果是我快照还原导致我的资料都没了,xshell6远程登录显示打开/dev/tty失败,/home/jin/.Xauthority打开失败登录不了。

这个时候如果有个进程想open一个文件我能够知道是哪个进程想打开哪个文件根据条件进行过滤(现在只是作用于用户进程)。如果在/etc/profile设置了全局的环境变量LD_PRELOAD即便是桌面的文件双击打开也可以进行拦截(实现阻止桌面文件被双击打开的功能)。

关于文件监控拦截,其实不管是Ring0的LKM开发(系统调用表)还是Ring3这种用户不需要考虑内核的操作思想都是类似,在open等系统调用前进行劫持,根据用户的需求进行确定,是否继续调用真正的系统调用。Ring0的内核驱动开发,由于我不懂汇编看来不是适合我,内核开发复杂难度大,还是这种直接接口上手的好点。哈哈(网上很多这种,只不过最近工作用到了记录下)。当然没写驱动来进行文件监控(因为看了别人的资料有大佬写了驱动编译到内核实现文件监控模块,他们公司是这么做的),因为此我特地看了别人的博士论文关于文件监控的,别人的观点是不管ring0内核hook还是ring3用户hook都不那么完美(静态编译,强制加载LD_PRELOAD为系统原有等方法阻止),人家有更好的方法

最后/etc/profile全局环境变量设置务必快照或者小心操作,提醒自己。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

posted @   J1nu  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示