你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / Linux开发
Windows软件防火墙实现技术简述(二)
 
需要处理的,是ndis open block里面的SendHandler,ReceiveHandler,WanReceiveHandler,ReceivePacketHandler和SendPacketsHandler。

  一定要注意的是,不同于很多文章中的描述,主要处理SendHandler和ReceiveHandler,正确的应该是主要处理ReceivePacketHandler和SendPacketsHandler,现在的主流网卡和系统驱动,都是使用后面两者。

  应用程序访问网络控制

  以往的防火墙只能古板的允许或者禁止整个系统去访问网络上的目标,比如允许了系统可以访问外网的http端口,就允许了所有进程,不能只控制IE等几个进程有权这样做。该技术的出现解决了这个问题,对每个陌生的进程都会询问客户是否允许访问网络,因此还有一定的查杀未知木马病毒的能力。

  由于NDIS里面的那些send/receive handler全都是由tdi缓冲之后再调用的,运行的上下文全都是kernel,并且不保存原先进行tdi操作的进程号,因此在封包过滤的NDIS钩子层次无法取得进行操作的进程ID。想要解决应用程序访问网络控制的问题,就需要在tdi或者更高的层次上使用钩子。一般来说,主流是使用tdi钩子,在进程的网络调用栈进行到tdi的TDI_CONNECT,TDI_LISTEN,TDI_RECEIVE,TDI_SET_EVENT_HANDLER等调用时,进行进程判断和提示。

  对于winsock的应用程序来说,最重要的是主动连接请求,TDI_CONNECT;接受连接请求,TDI_SET_EVENT_HANDLER中的TDI_EVENT_CONNECT。对于udp收发,还要处理TDI_SEND_DATAGRAM,TDI_RECEIVE_DATAGRAM和TDI_SET_EVENT_HANDLER中的TDI_EVENT_RECEIVE_DATAGRAM请求。这个时候,直接PsGetCurrentProcessId就可以得到进程号。

  tdi钩子有一个问题,就是对于TDI_SET_EVENT_HANDLER的hook,很可能不能及时发挥作用,必须要重起以后。由于不像ndis钩子需要hook系统函数或者修改系统数据结构,tdi钩子可以直接使用微软提供的过滤器驱动程序接口,在安装编写上要比ndis钩子简单的多,IoAttachDeviceToDeviceStack就可以了。

给出一段detour的tdi的dispatch routine的代码:NTSTATUS hook_disp(IN PDEVICE_OBJECT parampdrvob, IN PIRP irp)
{
   ....
   case IRP_MJ_INTERNAL_DEVICE_CONTROL:
     switch(irpsp->MinorFunction)
   {
       ///原来想得要监控的几个似乎afd并不使用,而是用set event handler
     case TDI_LISTEN:
#ifdef bydbg
       DbgPrint("bytdiflt:TDI_LISTEN traped.should caused by kmd other than AFD.
");
#endif
       stat=gettcpportbyfile(irpsp->FileObject);
#ifdef bydbg
       DbgPrint("bytdiflt:**********TDI_EVENT_CONNECT port:%d.***********
",stat);
#endif
       if(stat==0 || stat==-1){break;}//non-tcp or internal error
       if(denyport[(unsigned short)stat]==1)//直接失败请求
       {
#ifdef bydbg
         DbgPrint("bytdiflt:*********port %d blocked!!*********
",stat);
         //DbgBreakPoint();
#endif
         stat=STATUS_ACCESS_VIOLATION;
         irp->IoStatus.Status=stat;
         irp->IoStatus.Information=0;
         IoCompleteRequest(irp, IO_NO_INCREMENT);
         return stat;
       }
       break;
     case TDI_RECEIVE:
#ifdef bydbg
       DbgPrint("bytdiflt:TDI_RECEIVE traped.should caused by kmd other than AFD.
");
       //DbgBreakPoint();
#endif
       break;
     case TDI_SET_EVENT_HANDLER:
#ifdef bydbg
       DbgPrint("bytdiflt:TDI_SET_EVENT_HANDLER traped.req local_node:%x
",irpsp->FileObject);
       DbgPrint("TDI_SET_EVENT_HANDLER EventType:%d EventHandler:%x EventContext:%x
",
         ((TDI_REQUEST_KERNEL_SET_EVENT*)&(irpsp->Parameters))->EventType,
         ((TDI_REQUEST_KERNEL_SET_EVENT*)&(irpsp->Parameters))->EventHandler,
         ((TDI_REQUEST_KERNEL_SET_EVENT*)&(irpsp->Parameters))->EventContext
         );
#endif
       switch(((TDI_REQUEST_KERNEL_SET_EVENT*)&(irpsp->Parameters))->EventType){
       case TDI_EVENT_CONNECT:
         tmpstrptr="TDI_EVENT_CONNECT";
         stat=gettcpportbyfile(irpsp->FileObject);
#ifdef bydbg
         DbgPrint("bytdiflt:**********TDI_EVENT_CONNECT port:%d.***********
",stat);
#endif
         if(stat==0 || stat==-1){break;}//non-tcp or internal error
         if(denyport[(unsigned short)stat]==1)//完成请求但不做事情
         {
#ifdef bydbg
           DbgPrint("bytdiflt:*********port %d blocked!!*********
",stat);
           //DbgBreakPoint();
#endif
           stat=STATUS_SUCCESS;
           irp->IoStatus.Status=stat;
           irp->IoStatus.Information=0;
           IoCompleteRequest(irp, IO_NO_INCREMENT);
           return stat;
         }
         break;
       case TDI_EVENT_RECEIVE:
         tmpstrptr="TDI_EVENT_RECEIVE";
         break;
       case TDI_EVENT_CHAINED_RECEIVE:
         tmpstrptr="TDI_EVENT_CHAINED_RECEIVE";
         break;
       case TDI_EVENT_RECEIVE_EXPEDITED:
         tmpstrptr="TDI_EVENT_RECEIVE_EXPEDITED";
         break;
       case TDI_EVENT_CHAINED_RECEIVE_EXPEDITED:
         tmpstrptr="TDI_EVENT_CHAINED_RECEIVE_EXPEDITED";
         break;
       case TDI_EVENT_RECEIVE_DATAGRAM:
         tmpstrptr="TDI_EVENT_RECEIVE_DATAGRAM";
         break;
       default:
         tmpstrptr="Other TDI_EVENT";
         break;
       }
#ifdef bydbg
       DbgPrint("EventType is:%s
",tmpstrptr);
#endif
       break;
     case TDI_CONNECT://处理主动外出连接
       stat=gettcpportbyfile(irpsp->FileObject);
#ifdef bydbg
       if(stat==0 || stat==-1)//non-tcp or internal error
       {DbgPrint("bytdiflt:**********TDI_CONNECT local port UNKNOWN.***********
");}
       else
       {DbgPrint("bytdiflt:**********TDI_CONNECT local port:%d.************
",stat);}
       //DbgBreakPoint();
#endif
       break;
   ....
   PsGetCurrentProcessId....//判断进程号
   ....
}

智能行为监控

  随着防火墙的发展,现在的ZoneAlarm,Kaspersky等都发展成了所谓的“安全套件”,能够多方位的保护用户的系统。查杀未知的病毒和木马是所有防火墙厂商都非常注视的一环。在目前来说,查杀未知病毒木马,最行之有效的方法,就是类似于ZoneAlarm,Karpasky Internet Security,Mcafee,System Safety Monitor等安全工具的智能行为监控手段。实践证明,这种智能行为监控针对未知的恶意软件有着强大的杀伤力。例如,灰鸽子无论如何加壳变形,能够躲过杀毒软件的查杀,也不能逃避ZoneAlarm的智能行为监控;很多地下流传的没有公开的木马,放上去安装,在安装过程中也一样会报警;甚至很多0day overflow exploit在执行过程中就会报警。可以说,这个可能是目前最有前景的防火墙新技术。

  例如,一个智能行为监控模块,可以监控以下进程行为,并且判定为恶意软件或者提示用户,让用户选择是否允许:

  把自己注册成每次开机自动启动;

  装载可疑的内核驱动程序;

  注册未知的新服务;

  修改或者替换系统重要文件;

  使用raw_socket接口;

  可疑的word宏或者脚本;

  可疑的邮件附件例如可执行程序;

  安装windows消息钩子;

  创建远程线程到其他程序;

  创建受控制的傀儡进程;

  对系统API的请求来源代码和数据区在同一区域;

  监控上述的这些行为,全部都可以使用系统钩子,消息钩子和API钩子等技术来实现,洗劫这里就不详细谈了,熟悉hook的技术人员都应该知道怎么做了。

  反流氓软件技术

  目前的信息安全领域,由于病毒的不可控性和黑客的技术门槛提高,黑客攻击和病毒攻击均有大幅度减少的趋势。但是一种新型的安全威胁却在日益的发展壮大,这种很不同于传统病毒的安全威胁,就是从开始就彻底的有明确商业目的的流氓软件。这种软件为了自己的商业利益,不惜牺牲客户的权益,强行在客户的浏览器上安装,驻留系统,强制制止用户卸载或者删除自己。这类软件也带来了非常大的麻烦,经常性地弹出广告页面,篡改用户浏览器主页,篡改用户浏览器搜索引擎,降低用户系统性能,更严重的是很多设计低劣的流氓软件会让用户的系统变得很不稳定,经常性的死机和重起。大量的防火墙客户对流氓软件深恶痛绝,希望防火墙能够在流氓软件安装的时候能够提示客户,给客户一个选择的机会。因此这也成了新一代防火墙应该拥有的功能模块。

  由于流氓软件不同于一般病毒木马,有着强大的商业支持,升级换代非常快,并且碍于各方面的影响,防火墙和杀毒软件不好将其作为病毒木马来查杀,否则可能会引起法律和商业等背景关系上面的很多问题,所以比较好的一个选择,就是防火墙厂商使用行为监控方法来提示用户流氓软件的安装。

  流氓软件除了拥有普通木马或病毒的以下几个特征,

  把自己注册成每次开机自动启动;

  装载可疑的内核驱动程序;

  注册未知的新服务;

  之外,还有一个很重要的特征就是劫持浏览器。以下的为了避免麻烦,均不举软件实例。  

  HKLMSoftwareMicrosoftWindowsCurrentVersionExplorerBrowser Helper Objects,这个被叫做BHO插件的东西,是最多流氓软件和ie插件的栖身之所,监控这个健值是最重要的;

  HKCUSoftwareMicrosoftInternet ExplorerUrlSearchHooks,这个健值可用来劫持搜索引擎;

  HKLMSoftwareMicrosoftInternet ExplorerToolbar,很多浏览器插件也会注册在这里;

  HKCUSoftwareMicrosoftInternet ExplorerExplorer Bars      HKLMSoftwareMicrosoftInternet ExplorerExplorer Bars      HKCUSoftwareMicrosoftInternet ExplorerExtensions        HKLMSoftwareMicrosoftInternet ExplorerExtensions        这四个键值也有流氓插件钻入的可能。

  HKLMSOFTWAREMicrosoftInternet ExplorerMain和  HKCUSOFTWAREMicrosoftInternet ExplorerMain这两个子目录下面有大量的IE首页,搜索页面等敏感信息需要保护或者提示用户,这里就不仔细说了。

(编辑:aniston)

  推荐精品文章

·2024年12月目录 
·2024年11月目录 
·2024年10月目录 
·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089