基于Windows系统下网络数据包过滤方法的分析

 

 

1、windows的分层网络构架

可以把windows操作系统的网络构架粗略划分为6层,其中逻辑链路层、网络层和传输层都是通过传输驱动程序实现的,也叫做协议驱动程序网络驱动接口标准(NDIS)用于windows环境下网络驱动程序的开发,NDIS提供了很多功能函数,在各种驱动程序的编写中只需要调用各种函数,NDIS负责把上下层驱动程序联系起来,实现网络数据包的上下发送与接收。

例如,当协议驱动程序分配包,从应用程序中将数据拷贝到包中,并且通过调用NDIS函数将这些包发送到底层驱动程序中。协议驱动程序也为从下层驱动程序中接收包提供了接口,协议驱动程序将接收到的数据包转换成相应的客户应用程序。

2、网络数据包的过滤方法

2.1 基于NDIS包拦截技术

数据包的拦截技术,其中最多的是编写IM Driver在DDIS中间层对Min Port(网卡驱动程序)和协议驱动程序之间的数据包进行拦截,这是微软提供的一种技术。

中间层驱动程序,由于其特殊的位置,使得它既能与上层协议驱动进行通信又能与下层端口驱动程序通信。当接收来自上下层的数据包时,中间驱动程序需要MinPortSend、ProtocolTeceive、MinportSendPacket、protocolReceivePacket、MinportTransferData进程来完成数据的传输。

下面再介绍一种更有效的基于NDIS包拦截方法,NDIS协议驱动程序是通过填写一张NDIS_PROTOCOL_CHARACTERISTICS的表,并调用NDIS API函数NdisRegister Protocol进行注册。现在关注一下NDIS_PROTOCOL_CHARACTERISTICS这张表,这张表中存有所有协议驱动程序与底层的派发函数的入口,如SendHandler、ReceiveHandler、BindAdapterHandler等。

当网卡有数据包进入时,会通过表中的ReceiveHandler或ReceivePacketHandler通知协议驱动程序有一个该协议的数据包进入,反之协议驱动程序是通过SendHandler或SendPacketsHandler函数向网卡驱动发送数据包到网络上去的,通过NDIS.h的头文件知道通过这个表中的SendHandler或SendPacketsHandler发送的,只要将每一个协议程序所填写的NDIS_Protocol_characteristics表里的派发函数指向自己的函数,就能成功的对数据包进行拦截。

看下面的NdisRegisterProtocol原型就清楚了。

NdisRegisterProtocol(OUT PNDIS_STATUS Status,OUT PNDIS_PROTOCOL_BLOCK NdisProtocolHandle,IN PNDIS_PROTOCOL_CHARACTERISTICS ProtocolCharacteristics,IN U INT CharacteristicsLength);

如果查询成功,返回一个非零值。

2.2   基于WinPcap抓报的过滤方法

winpcap(windows packet capture)核心功能是捕获网络数据包,其中NPF是一个虚拟设备驱动程序文件,它的功能是过滤数据包,并把这些数据包原封不懂地传给用户态模块,如下图:

基于Windows系统下网络数据包过滤方法的分析_第1张图片

图中箭头方向表示网络数据包的流动方向,NPF工作在内核层,它从网卡驱动程序收集网络数据包,

既可以发送过滤部件,对网络数据包进行过滤;

也可以发送给统计部件,对网络进行统计分析;

还可以发送给存储部件,把网络数据包直接存储到磁盘。

winpcap的优势:提供了一套标准的抓包接口,与Libpacp兼容,可使得原来许多Unix平台下的网络分析工具快速移植过来,便于开发各种网络分析工具,充分考虑了各种性能和效率的优化,包括对于NPF内核层次上的过滤器支持,支持内核态的统计模式,提供了发送数据包的能力。

 

2.3   传输层过滤驱动程序

挂接到TCP/IP协议驱动程序上对TCP协议做过滤的驱动程序,工作在传输层,将本身作为过滤驱动程序挂接到其他驱动程序上 并截获IRP请求及进行IRP请求的转发,从而能够实现网络数据包的截获与过滤功能,挂接到TCP/IP的驱动程序前后对照如图:

基于Windows系统下网络数据包过滤方法的分析_第2张图片

可以用IoAttachDeviceToDeviceStack或IoAttachDevice函数将过滤驱动依附到TCP或UDP设备上,就可以在IRP的处理过程中得到相应的网络数据,并且可以根据需要进行过滤。

2.4   实用Filter-hook驱动程序

filter-hook驱动程序是一个用于过滤网络数据包的内核驱动程序,它扩展了系统支持的IP过滤驱动程序的功能,并且仅能安装在WIN2000及以后的版本中,在系统中Filter-hook驱动程序仅能有一个实例被IP过滤驱动程序使用,由于它向IP过滤驱动程序注册自己,因此它运行时需要先加载IP过滤驱动程序,即  ipfltdrv.sys

filter-hook驱动程序向IP过滤驱动程序注册回调函数,当发送或接收每一个IP数据包时,IP过滤驱动程序将调用这个函数,这样就可以说在函数中对IP数据进行修改或者过滤

2.5   采用RAW winsock

windows系统提供的winsock2增加了许多新特性,winsock2允许程序使用WSA Toctl给一个Sock_RAW类型的socket Rcvall属性,这样socket就可以收到所有经过本机的数据了,因此可以利用socket编写接口,绕过复杂的NDIS驱动程序设计,来达到接收网络数据包的目的。首先,调用WSA socket函数建立SOCK_RAW套接字,并指定网络协议类型为IP,然后得到当前网卡设置的IP地址与建立的套接字绑定,在设置接受属性好就可以接收数据了。

Raw Socket:原始套接字

可以用它来发送和接收IP层以下的原始数据包,如ICMP、TCP、UDP、、、、

int sockRaw = socket(AF_NET, SOCK_RAW, IP_PROTO_RAW);

这样就创建了一个Raw Socket.。

 

结论:

由于windows系统的网络结构是分层,根据过滤数据包的目的不同,可以在不同层次进行网络数据包拦截,上面讲解的几种方法有的需要专门的驱动程序编写知识,有一定难度,但是可以修改驱动程序达到自己的目的,甚至可以修改数据再将其转发。


 

你可能感兴趣的:(windows,网络,socket,网络协议,filter,hook)