在用户态下进行网络数据包拦截有以下几种方法: 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层次上进行,而对于网络协议栈中底层协议的数据包无法进行处理。对于一些木马和病毒来说很容易避开这个层次的防火墙。
|