防火墙的数据包拦截方式
最近看了许多关于防火墙的包拦截方式,有比较全的,但依然不是很清楚,现将各个网络上的资源整理下。
网络防火墙都是基于数据包的拦截技术之上的。在 Windows 下,数据包的拦截方式有很多种,其原理和实现方式也千差万别。总的来说,可分为“用户级”和“内核级”数据包拦截两大类。
用户级下的数据包拦截方式有:
- Winsock Layered Service Provider (LSP)
- Win2K 包过滤接口 (Win2K Packet Filtering Interface)
- 替换 Winsock 动态链接库 (Winsock Replacement DLL)
- 挂钩WinsockAPI
内核级下的数据包拦截方式有:
- TDI过滤驱动程序 (TDI-Filter Driver)
- NDIS中间层驱动程序 (NDIS Intermediate Driver)
- Win2K Filter-Hook Driver
- Win2K Firewall-Hook Driver
- NDIS-Hook Driver
下面再说说各种截包方式的特点:
1)Winsock Layered Service Provider (LSP)
该方式也称为 SPI (Service Provider Interface) 截包技术。SPI是由 Winsock2 提供的一个 接口,它需要用户机上安装有 Winsock 2.0。Winsock2 SPI 工作在 API 之下的 Driver 之上,可以截获所有基于 Socket 的网络数据包。
优点:以DLL形式存在,编程方便,调试简单。数据封包比较完整,未做切片,便于做内容过滤。
缺点:拦截不够严密,对于不用 Socket 的网络通讯则无法拦截 (如 ICMP),木马病毒很容易绕过。
这种技术的典型代表有费尔个人防火墙(xfilter)的早期版本,天网个人防火墙的早期版本等。
2)Win2000 Packet Filtering Interface
这是 Win2000 中一组 API 提供的功能 (PfCreateInterface, PfAddFiltersToInterface, ...),主要是运用头文件IPHlpApi.h中的接口函数。
优点:接口简单,不用改动客户机和主机上的应用程序,与应用层无关,实现起来不是非常难。
缺点:功能过于简单,只能提供IP和端口的过滤,可能无法满足防火墙的复杂需求。处于 API 层,木马病毒容易绕过。只能在 Win2K 以上(含)系统中使用。
3)Winsock Replacement DLL
这种方法通过替换系统 Winsock 库的部分导出函数,实现数据报的监听和拦截。Windows提供了许多用于网络连接的API函数,这些函数通过一些DLL(动态链接库)文件导出,在WindowsXP系统中它是“ws2_32.dll”。
由于DLL文件是通过文件名来查找目标文件的,因此我们可以编写一个DLL文件,然后将系统中的“ws2_32.dll”文件改为其它名字如“bak_ws2_32.dll”,再将自己编写的文件命名为“ws2_32.dll”,当然我们必须自己导出“ws2_32.dll”中的所有导出函数。这样当应用程序调用WinsockAPI时,它实际调用的是我们自己编写的DLL文件,这就给了我们一个进行过滤的机会。我们可以返回失败,也可以直接调用“bak_ws2_32.dll”中的同名函数来转发。
这种方法的缺点之一是工作量太大,因为“ws2_32.dll”提供的导出函数多达上百个;另一个缺点就是要考虑系统版本的问题,移植性太差。因为每次当系统版本改变后,Windows都可能会对一些系统文件进行修改,这就迫使我们必须自己考虑到所有的系统版本。二是由于工作在 Winsock 层,所以木马病毒容易绕过。
4)挂钩WinsockAPI
挂钩WinsockAPI没有了替换系统文件的麻烦,因为我们可以仅考虑自己关注的API函数,对其它函数不作处理。
但是采用何种方法挂钩却是一个问题。
如果在用户模式下进行挂钩,那么为了实现全局有效,我们必须把HOOK用的DLL文件注入到所有进程中,这可能导致某些进程崩溃。
如果在内核模式下进行挂钩,由于WinsockAPI没有经过SSDT的转发,我们无法使用较为稳定的SSDTHOOK,而只能使用inlinehook。inlinehook相对SSDTHOOK来说不够稳定,而且我们不得不考虑各个函数的不同实现,通常还需要反汇编引擎的辅助才能实现挂钩。
5)TDI-Filter Driver
TDI 的全称是 Transport Driver Interface。传输层过滤驱动程序通过创建一个或多个设备对象直接挂接到一个现有的驱动程序之上。当有应用程序或其它驱动程序调用这个设备对象时,会首先映射到过滤驱动程序上,然后由过滤驱动程序再传递给原来的设备对象。
当应用程序需要进行发送或接收网络数据包的时候,都是通过协议驱动所提供的接口来进行的。协议驱动提供了一套系统预定义的标准接口来和应用程序之间进行交互。在Windows2000/NT下,IP、TCP、UDP是在一个驱动程序里实现的,叫做“TCPIP.sys”,这个驱动程序创建了几个特殊设备:\Device\RawIp、\Device\Udp、\Device\Tcp、\Device\Ip、\Device\MultiCast,应用程序所有的网络数据操作都是通过这几个设备进行的。因此,我们只需要开发一个过滤驱动来截获这些交互的接口,就可以实现网络数据包的拦截。TDI层的网络数据拦截还可以得到操作网络数据包的进程详细信息,这也是个人防火墙的一个重要功能。
优点:能获取到当前进程的详细信息,这对开发防火墙尤其有用。
缺点:驱动位于 tcpip.sys 之上,所以没有机会得到那些由 tcpip.sys 直接处理的包,比如ICMP。TDI驱动需要重启系统方能生效。
6)NDIS Intermediate Driver
NDIS的全称是NetworkDriverInterfaceSpecification,即网络驱动接口规范,也称之为 IM Driver。它是微软为网络接口卡(NIC)的局域网驱动程序提供的一种标准应用程序接口(API)。NDIS适用于服务器或工作站。NDIS标准支持计算机通过不同的通信协议与网络相连,如:TCP/IP、IPX、NetBIOS、AppleTalk等。
NDIS支持以下网络驱动类型:小端口驱动(MiniportDriver)、中间层驱动(IntermediateDriver)、协议驱动(ProtocolDriver)。
中间层驱动介于协议层驱动和小端口驱动之间,它能够截获所有的网络数据包(如果是以太网那就是以太帧)。NDIS中间层驱动的应用很广泛,不仅仅是个人防火墙,还可以用来实现VPN,NAT,PPPOverEthernet以及VLan。它主要是在网络层和链路层之间对所有的数据包进行检查,因而具有强大的过滤功能。它能截获所有的数据包。可参考DDK中附带的例子Passthru,中间层驱动的概念是在WindowNTSP4之后才有的,因此对于Windows9x来说无法直接利用中间层驱动的功能。
优点:功能非常强大,应用面广泛,不仅仅是防火墙,还可以用来实现VPN,NAT 和 VLan 等。
缺点:编程复杂,难度较大。中间层驱动的概念是在 WinNT SP4 之后才有的,因此 Win9X 无法使用。不容易安装,自动化安装太困难。
中间层驱动功能强大,目前很多商业级别的个人防火墙都是使用的这种技术,例如卡巴斯基反黑客(KasperskyAnti-Hacker)防火墙。
7)Win2000 Filter-Hook Driver
这是从 Win2000开始提供的一种机制,该机制主要利用 ipfiltdrv.sys 所提供的功能来拦截网络数据包。Filter-Hook Driver 的结构非常简单,易于实现。但是正因为其结构过于简单,并且依赖于 ipfiltdrv.sys,微软并不推荐使用。
可参考 CodeProject 上的例子:http://www.codeproject.com/KB/IP/drvfltip.aspx
优点:结构简单,易于实现;能截获所有的IP包(包括ICMP包)。
缺点:工作于内核进程中,无法取得当前应用程序进程的信息;虽能截获所有IP包,但无法取得数据包的以太帧(Ethernet Frame);只能在 Win2000 以上(含)系统中使用。
8)Win2000 Firewall-Hook Driver
这是一种和 Win2000 Filter-Hook Driver 差不多的机制,所不同的是,Firewall-Hook Driver 能在 IP Driver 上挂接多个回调函数,所以和前者相比,它引起冲突的可能性更小一些。
可参考 CodeProject 上的例子:http://www.codeproject.com/KB/IP/FwHookDrv.aspx这种方式的优缺点和 Win2000 Filter-Hook Driver 基本相同。
9)NDIS-Hook Driver
NDIS-HOOK Driver也是应用比较常见的一种方法。它的实现原理是安装钩子到ndis.sys中,替换其中的某些关键函数,从而达到截包的目的。
它相比NDIS中间层驱动来说优点更多,例如它安装简单,可即时安装和卸载驱动,无需重启系统;同样能截获所有的IP包,而且能同时取得数据包的以太帧(EthernetFrame);能在Win98及其以上的系统中使用等。
优点:安装简单,可即时安装和卸载驱动,无需重启系统。能截获所有的IP包,同时能取得数据包的以太帧(Ethernet Frame)。安全性高,木马病毒不容易穿透。在大多数情况下,能获取到当前应用程序的进程信息。能在 Win98 以上(含)系统中使用。
缺点:接收数据包、或偶尔发送数据包时,驱动工作在内核进程中,无法获得应用程序进程信息。
使用这种技术的防火墙代表有Comodo防火墙(ComodoFirewallPro)等,但它的开发需要对驱动编程非常熟悉,难度较大。