网络通信 频道

个人防火墙-网络数据包拦截技术概览

随着网络安全问题日益严重,网络安全产品也被人们重视起来。防火墙作为最早出现的网络安全产品和使用量最大的安全产品,也受到用户和研发机构的青睐。从防火墙的应用角度来看基本上可以分为两种:网络级的防火墙和个人防火墙。Windows操作系统作为使用最为广泛的PC操作系统,因此在Windows操作系统下开发的个人防火墙产品数不胜数。国外比较著名的有AtGuard,Outpost Firewall,ZoneAlarm,Tiny Personal Firewall,Norton Personal Firewall以及Sygate Personal Firewall等,国内用的比较多的有天网防火墙等产品。
  所有基于Windows操作系统的个人防火墙核心技术点在于Windows操作系统下网络数据包拦截技术。本文主要讲述的是Windows操作系统下网络数据包拦截的技术。首先读者应该对Windows网络体系结构有一定了解,并且对开发Windows驱动程序有一定了解。
  Windows 网络驱动程序结构
  图1显示了Windows 2000下的网络驱动程序结构。
  微软和3Com公司在1989年制定了一套开发Windows下网络驱动程序的标准,称为NDIS( Network Driver Interface Specification)。NDIS为网络驱动的开发提供了一套标准的接口,使得网络驱动程序的跨平台性更好。NDIS提供以下几个层次的接口:
  ?1、NDIS小端口驱动(Miniport driver)。这也就是我们常说的网卡驱动。
  ?2、NDIS 协议驱动(Protocol driver)。例如TCPIP协议驱动。
  ?3、NDIS 中间层驱动(Intermediate driver)。这是基于链路层和IP层之间的驱动。
  从图1中我们可以很清楚地看到网络驱动的分层结构,这就给我们提供了拦截网络数据包的基本思路。
  总的来说,要拦截Windows下的网络数据包可以在两个层面进行:用户态(user-mode)和内核态(kernel-mode)
  用户态下的网络数据包拦截
  在用户态下进行网络数据包拦截有以下几种方法:
  1) Winsock Layered Service Provider (LSP)。这种方法在MSDN里有很详细的文档,并且给出了一个例子(SPI.CPP)。这种方法的好处是可以获得调用Winsock的进程详细信息。这就可以用来实现QoS,数据流加密等目的。但是,如果应用程序直接通过TDI(Transport Driver Inface)调用TCPIP来发送数据包,这种方法就无能为力了。对于一些木马和病毒来说要实现通过TDI直接调用TCPIP是一件很容易的事情。因此,大多数的个人防火墙都不使用这种方法。国内也有使用该方法实现的个人防火墙,例如Xfilter(www.xfilter.com)。
  2) Windows 2000 包过滤接口。Windows 2000 IPHLP API提供了安装包过滤器的功能。但是,包过滤的规则有很多限制,对于个人防火墙来说是远远不够的。
  3) 替换系统自带的WINSOCK动态连接库。这种方法可以在很多文章里面找到详细的实现细节。
  很显然,在用户态下进行数据包拦截最致命的缺点就是只能在Winsock层次上进行,而对于网络协议栈中底层协议的数据包无法进行处理。对于一些木马和病毒来说很容易避开这个层次的防火墙。
  
  利用驱动程序拦截网络数据包
  大多数的个人防火墙都是利用网络驱动程序来实现的。从图1中我们马上可以想到可以从以下几个方面来做文章:
  ? 1、TDI过滤驱动程序(TDI Filter Driver)
  ? 2、NDIS中间层驱动程序(NDIS Intermediate Driver)
  ? 3、Win2k Filter-Hook Driver
  ? 4、NDIS Hook Driver
  以下我们大体介绍这几种方法。具体的实现细节请参见Win2k DDK文档。
  TDI过滤驱动程序。当应用程序要发送或接收网络数据包的时候,都是通过与协议驱动所提供的接口来进行的。协议驱动提供了一套系统预定义的标准接口来和应用程序之间进行交互。在Windows 2000/NT下,ip,tcp,udp是在一个驱动程序里实现的,叫做tcp.sys,这个驱动程序创建了几个设备:DeviceRawIp,DeviceUdp,DeviceTcp,DeviceIp, DeviceMULTICAST。应用程序所有的网络数据操作都是通过这几个设备进行的。因此,我们只需要开发一个过滤驱动来截获这些交互的接口,就可以实现网络数据包的拦截。TDI层的网络数据拦截还可以得到操作网络数据包的进程详细信息,这也是个人防火墙的一个重要功能。
  NDIS中间层驱动。中间层驱动介于协议层驱动和小端口驱动之间,它能够截获所有的网络数据包(如果是以太网那就是以太帧)。NDIS中间层驱动的应用很广泛,不仅仅是个人防火墙,还可以用来实现VPN,NAT,PPPOverEthernet以及VLan。中间层驱动的概念是在Window NT SP4之后才有的,因此对于Windows9x来说无法直接利用中间层驱动的功能。Windows DDK提供了两个著名的中间层驱动例子:Passthru以及Mux。开发人员可以在Passthru的基础上进行开发,Mux则实现了VLan功能。目前个人防火墙的产品还很少用到这种技术,主要的原因在于中间层驱动的安装过于复杂,尤其是在Windows NT下。Windows 2000下可以通过程序实现自动安装,但是如果驱动没有经过数字签名的话,系统会提示用户是否继续安装。中间层驱动功能强大,应该是今后个人防火墙技术的趋势所在,特别是一些附加功能的实现。
  Win2k Filter-Hook Driver。这是从Windows2000开始系统所提供的一种驱动程序,该驱动程序主要是利用ipfiltdrv.sys所提供的功能来拦截网络数据包。Filter-Hook Driver在结构非常简单,易于实现。但是正因为其结构过于简单,并且依赖于ipfiltdrv.sys,Microsfot并不推荐使用Filter-Hook Driver。
  NDIS Hook Driver。这是目前大多数个人防火墙所使用的方法。Hook的概念在Windows9x下非常流行,而且实现也很容易。在Windows9x下,驱动程序(VxD)通过使用Hook_Device_Service可以挂接NDIS所提供的所有服务。在Windows NT/2000下面如何实现Hook呢?有两种不同的思路:
  1) 通过修改NDIS.SYS的Export Table。在Windows NT/2000下,可执行文件(包括DLL以及SYS)都是遵从PE(Portable Executable)格式的。所有向其他操作系统组件提供接口的驱动程序都有Export Table,因此只要修改NDIS.SYS的Export Table就可以实现对关键NDIS API的挂接。由于协议驱动程序在系统启动的时候会调用NdisRegisterProtocol来向系统进行协议注册,因此这种方法关键在于修改NDIS.SYS所提供的NdisRegisterProtocol/NdisDeRegisterProtocol/NdisOpenAdapter/NdisCloseAdapter/NdisSend函数的起始地址。我们知道,在用户态模式要修改PE文件格式可以用一些API来实现,而NDIS.SYS位于系统的核心内存区,因此要修改NDIS.SYS就不得不通过写驱动程序来实现,也就要求我们对PE文件格式有比较深入的了解。使用这种方法还要注意驱动程序的加载次序,显然Hook Driver必须在NDIS.SYS被加载之后,而在协议驱动程序如tcpip.sys被加载之前。另外,Windows2000还提供了系统文件保护机制,因此在修改ndis.sys还需要通过修改注册表屏蔽系统文件保护机制。
  2) 向系统注册假协议(fake protocol)。在Windows内核中,所有已注册的协议是通过一个单向的协议链表来维护的。这个单向链表保存了所有已注册协议的NDIS_PROTOCOL_BLOCK结构的地址,在这个结构中保存了协议驱动所指定的相应的派发函数的地址如RECEIVE_HANDLER等。并且,每个协议驱动还对应一个NDIS_OPEN_BLOCK的单向链表来维护其所绑定的网卡信息。当协议驱动调用NdisRegisterProtocol之后,NDIS总是会把新注册的协议放在协议链表的表头并返回这张表,所以只要我们注册一个新的协议通过新协议注册返回的链表头就可以轻而易举的遍历系统中所有协议表。但是,如果要成功地挂接派发函数,还需要对协议所对应的NDIS_OPEN_BLOCK结构里的派发函数进行挂接,因为NDIS并不是直接调用协议驱动在NDIS_PROTOCOL_CHARACTERISTICS所注册的派发函数地址,而是调用NDIS_OPEN_BLOCK里的派发函数。值得注意的是,在Windows9x/Me/NT的DDK中,NDIS_PROTOCOL_BLOCK的定义是很明确的,而在Windows 2000/xp的DDK中,并没有该结构的详细定义,也就是说该结构在Windows2000/xp下是非公开的,因此开发人员需要利用各种调试工具来发掘该结构的详细定义。也正是因为如此,这种方法对平台的依赖性比较大,需要在程序中判断不同的操作系统版本而使用不同的结构定义。
  总结
  本文重点描述了在WindowsNT/2000/xp下个人防火墙核心技术-网络数据包拦截技术,分析了各种可能的方法以及各种方法的优缺点,实际上许多个人防火墙结合了几种不同的技术来在不同层面上进行网络数据包拦截。值得说明的是,网络数据包拦截技术不仅仅可以用来开发个人防火墙,还可以用来开发其他的产品。

 

转载地址:http://www.netsp.com.cn/Article/netsafe/FW/200506/20050602132818.html

0
相关文章