首页 > 编程知识 正文

远程摄像头监控,监控摄像头

时间:2023-05-03 13:46:54 阅读:118004 作者:773

file _ filter.c # include stdio.h # include string.h # include stdlib.h # includesys/stat.h # include unistd.h # include //机密字,受监视目录中存在机密字的文件受保护typedefint(*new_open ) ) const char *pathname,int flags ); intopen (常数char * pathname,int flags ) { void *handle=NULL; new_open old_open=NULL; 保存为old_open以调用libc.so.6的句柄handle=dlopen('libc.so.6 ',RTLD_LAZY ); 返回libc.so.6中加载open函数时的地址old_open=(new_open ) dlsym(Handle,' open ' ); 结构开始开始开始; if(stat(Pathname,ststat )==0) ) /判断是否为文件if(s_isreg ) ST.ST_mode ) /所有路径,否则为当前路径charpathbbbe='/' ) {memset(pathbuf,0,STRMAXLEN ); getcwd(pathbuf,STRMAXLEN ); if(pathbuf[Strlen(pathbuf )-1]!='/' (strcat (路径buf,'/' ); 静态(path buf,pathname ); (else ) strcpy ) pathbuf,pathname; //判断文件是否在监视对象目录中的if(strstr(pathbuf,path )==pathbuf[0] )//表示该文件是监视对象的FILE *fp=NULL; char buffer[1024]; memset (缓冲器,0,sizeof ) (缓冲器); char strcmd[128]; 短信(strcmd,0,sizeof ) strcmd ); sprintf(strcmd,sizeof ) strcmd )、' grep %s %s '、word、pathbuf ); FP=popen(strcmd,' r ' ); //buffer如果不为空则存在关键字,阻止if(fgets(buffer,sizeof ),fp )!=NULL ) { printf ('进程%d已打开%s。 操作已被阻止。 n ',getpid ),pathbuf ); 关闭(FP ); 退出(0; }pclose(FP ); } } } printf ('进程%d已打开%s。 n ',getpid ),pathname ); 返回old _ open (pathname,flags ); } socket _ filter.c # include stdio.h # includesys/types.h/* seenotes */# include dlfcn.h # includesys/socket.* typedef int (*new_socket)(int, const struct sockaddr *, socklen_t);typedef int (*new_accept)(int, struct sockaddr *, socklen_t *);// 判断接入的网络是否为过滤IP,如果是则提前返回int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen){ void *handle = NULL; new_socket old_connect = NULL; // 保存成old_connect以备调用 // 获得libc.so.6的句柄 handle = dlopen("libc.so.6", RTLD_LAZY); // 返回open函数在libc.so.6中的加载时的地址 old_connect = (new_socket)dlsym(handle, "connect"); char ip[128]; memset(ip, 0, sizeof(ip)); // ip地址 int port = -1; // 端口号 if (AF_INET == addr->sa_family) { struct sockaddr_in *sa4 = (struct sockaddr_in *)addr; inet_ntop(AF_INET, (void *)(struct sockaddr *)&sa4->sin_addr, ip, sizeof(ip)); port = ntohs(sa4->sin_port); printf("nAF_INET IP===%s:%dn", ip, port); } if (0 == strcmp(ip, URL)) { printf("n===%s netfilter...connect failed!n", ip); return -1; } printf("nPID:%d, socket:%d, %s Successfully connected!n", getpid(), sockfd, ip); return old_connect(sockfd, addr, addrlen);}int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen){ void *handle = NULL; new_accept old_accept = NULL; // 保存old_accept以备调用 // 获得libc.so.6的句柄 handle = dlopen("libc.so.6", RTLD_LAZY); // 返回accept函数在libc.so.6中的加载时的地址 old_accept = (new_accept)dlsym(handle, "accept"); char ip[128]; memset(ip, 0, sizeof(ip)); // Ip地址 int clientfd = -1; // 客户端socketfd if (AF_INET == addr->sa_family) { struct sockaddr_in *sa4 = (struct sockaddr_in *)addr; strcpy(ip, inet_ntoa(sa4->sin_addr)); // IP // 阻止接入 if (0 == strcmp(ip, URL)) { printf("nPID:%d ===%s=== netfilter...accept failed!n", getpid(), ip); return -1; } } // 放行 clientfd = old_accept(sockfd, addr, addrlen); printf("nPID:%d, clientfd:%d, %s Successfully accepted!n", getpid(), clientfd, ip); return clientfd;} makefile GC=gccall:libmyfilter.solibmyfilter.so:file_filter.c socket_filter.c $(GC) -fPIC -shared -o libmyfilter.so file_filter.c socket_filter.c -ldlclean: rm -rf *.so 需求说明

1、文件监控系统,实现指定目录的文件监控,当存在关键字的文件被打开时拒绝打开并提示某进程危险,正在打开某文件,若文件不存在关键字或者不在监控范围内则提示用户某进程正在打开文件允许放行。
2、网络监控系统,实现指定IP地址的拦截,不允许指定的IP连接和访问,并且提示用户某IP正在访问或连接,处理结果为放行或者拦截。

hook技术

挂钩是一种功能强大的编程技术,可以在不更改原始代码的情况下监视软件行为或扩展功能。 这个想法是拦截某些事件或系统调用(即自己创建的动态库相对系统动态库有优先调用权),并使用它们来启动您自己的自定义代码。特别是在网络安全,数据采集和系统控制领域使用广泛。
关于文件监控拦截,其实不管是Ring0的LKM开发(系统调用表)还是Ring3这种用户不需要考虑内核的操作思想都是类似(ring0和ring3就是我们常说的内核态和用户态,ring0是驱动层和操作系统一样的大佬哦),在open等系统调用前进行劫持,根据用户的需求进行确定,是否继续调用真正的系统调用,是否进行其他操作。Ring0的内核驱动开发,需要汇编的知识,内核开发复杂难度大,所以本文采用ring3的hook技术(技术不到家T_T)。当然写驱动来进行文件监控更强(看了别人的资料有大佬写了驱动编译到内核实现文件监控模块,他们公司是这么做的),因为此我特地看了别人的博士论文关于文件监控的,别人的观点是不管ring0内核hook还是ring3用户hook都不那么完美(有静态编译,强制加载LD_PRELOAD为系统原有动态库等方法阻止),人家有更好的方法。
关于网络拦截的思路就是确定hook点在connect和accept这两个系统调用,只要hook了这两个系统调用,那么指定IP的来连接或者访问此IP都不能进行。

hook动态库的组织

当我们写完了代码,make之后得到了动态库,我们就需要确定我们使用的范围来确定我们将创建的动态库默认加载在哪。export LD_PRELOAD = /home/changun/filetrack/hook/libmyfilter.so,这一句要加在环境变量中,而环境变量有三种:shell环境变量,用户环境变量和系统环境变量。影响的范围是层层递进的,当我们执行这句命令就是在加载到当前shell中,若退出当前终端,动态库就不能生效了(通常需求的范围不会这么小),若我们需要在某个用户下达到hook的效果,那么就在当前用户的profile中添加这句。(当然不同架构,不同系统的文件名不同,但都不难找,就在用户目录中的某个隐藏文件),当我们需要在整个系统生效时,我们就需要在/etc/profile配置文件中加入这句(这是使用场景最多的)。重启电脑后就能看见效果:指定的目录的具有关键字文件不能打开(双击,cat都不能打开文件,但是vim可以,为什么呢,因为vim不是用open打开文件,需要我们再次确定hook点, 这里深入了解请百度strace),指定的IP不能访问也不能主动连接本机(浏览器,wget等均不能连接)。

危险的hook技术

hook是十分危险的技术,因为它已经在系统层面作用,控制不好会反噬其主,我也写了一个open的动态库,结果中间不小心产生了无限递归(open中不能再用open),导致系统开机就进不去了。我后面也写死了几个系统了,所以每次测试之前都要快照!!
我们假设某位不法人士将上面的程序改成任何目录和文件都是exit,那么你重启系统,系统就死掉了,这是无法挽回的后果!将网络拦截程序写成任意IP都不能访问,注入到你的电脑中,如果你不了解hook技术。那么你无论如何也找不出原因,不管如何调试你将无法上网!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。