WinPcap包含一个内核级的数据包过滤器,一个低层的动态链接库(packet.dll),一个高层的、依赖于系统的库(wpcap.dll)。
WinPcap的主要结构如上。
首先,捕获系统需要占用操作系统的协议栈,来访问通过网络的原始数据。这就需要有部分内容要运行在操作系统内核中,能直接访问网络接口驱动。这部分内容非常依赖于系统,在WinPcap的解决方案中,它被认为是设备驱动,称为NetGroup Packet Filter(NPF)。
其次,捕获系统必须输出一个端口,以便用户应用程序利用内核驱动所提供的特性。WinPcap提供了两个不同的库:packet.dll和wpcap.dll。第一个提供了低层的API,它可以直接访问驱动的函数,并且依赖于微软操作系统的可编程接口。第一个提供了更多强大的、高层的,和libpcap兼容的捕获原语。
NPF和NDIS
NDIS(Network Driver Interface Specification)是一个标准,定义了网络适配器(可适配器驱动程序)和协议驱动程序(如TCP、IP的实现)间的通信。NDIS的主要作用是封装,以使协议驱动在收发数据包时不需要考虑适配器和操作系统。
NDIS支持三种网络驱动:
(1)Network interface card or NIC drivers.
NIC驱动直接管理网卡,它直接操作硬件并向上一层提供接口用于发送数据、处理中断、复位NIC、停止NIC、查询和设置驱动的其它可操作属性。
(2)Intermediate drivers
中层驱动介于上层驱动(如协议驱动)和miniport之间,从上层驱动来看,中层驱动像是一个miniport。从miniport来看,中层驱动像是一个协议驱动。开发这类驱动的主要原因多是用于协议驱动和miniport间传输媒体。一个中层驱动不能与用户模式的应用交互,只能与其它的NDIS驱动交互。
(3)Transport drivers or protocol drivers
一个protocol driver实现了网络的协议如:IPX/SPX或TCP/IP,并向一个或多个网卡提供它的服务。
NPF作为协议驱动实现,与操作系统的交互是异步的,这意味着驱动提供了一组回调函数,当调用NPF时,NPF调用这些系统回调函数。
NPF structure basis
NPF可以运行一些不同的操作:捕获、监控、dump to disk、包注入。
(1)Packet Capture
NPF最重要的操作就是包捕获,驱动通过网络接口检测到数据包并把它传递给用户级应用程序。
这个捕获过程依赖两个主要的部分: