(1)广播方式(Broadcast):能够接收网络中的广播信息。
(2)组播方式(Multicast):网卡能够接收组播数据,也就是一个人发出的包可以同时被其他多个有资格的人接收,这些人就形成了一个组,他们在组内的通信是广播式的。
(3)直接方式(Directory):只有目的网卡才能接收该数据。
(4)混杂模式(Promiscuous):能够接收一切通过网卡的数据。
网卡的缺省工作模式包含广播模式和直接模式,即它只接收广播帧和发给自己的帧,而网络数据包截获程序一般采用第4种模式。
2.3数据包截获实现基础
以太网数据帧是一组比特流,它们在传输介质上进行传输,从而实现信息的传递。以太网帧格式符合IEEE802.3标准,帧中包含目的地址和源地址,目的地址最高位为0是普通地址,为1时是组地址。当一个帧送到组地址时,组内的所有站点都会收到该帧。如果将它送到一个普通地址,一般情况下,只有一个站点收到这个帧,但是,以太网是以广播方式发送帧的,也即这个帧会传播到其所在网段内的所有站点,只不过该站点不会接收目的地址不为本机地址的帧。为了截获网段内的所有帧(以后称数据包),可以设置以太网卡的工作方式,以太网卡通常有正常模式(normal mode)和混杂模式(promiscuous mode)两种工作模式。在正常模式下,网卡每接收到一个到达的数据包,就会检查该数据包的目的地址,如果是本机地址和广播地址,则将接收数据包放入缓冲区,其它目的地址的数据包则直接丢掉。因此,正常模式下主机仅处理以本机为目的的数据包,网卡如果工作在混杂模式,则可以接收本网段内传输的所有数据包。如果要进行数据包截获,必须利用网卡的混杂模式,获得经过本网段的所有数据信息。
2.4网络数据截获
网络数据截获主要利用系统提供的协议编程接口来实现,Windows sockets是在Windows环境下使用的一套网络编程规范简称为Winsock。在windows环境下Winsock API依靠套接口(Socket)进行通讯。通信时,数据首先被写入本地主机的socket中,然后该socket通过网络接口卡(NIC)的传输介质将传来的信息发送到另一台主机的socket中如图4所示
图4 网络数据截获原理图
套接口有三种类型:流式套接口、数据报套接口和原始套接口。前两种套接字只能访问到传输层。也就是说只能接收自己硬件地址相匹配的或是以广播形式发出的数据帧,对于其他形式的数据帧比如已到达网络接口但却不是发给此地址的数据帧,网络接口在验证投递地址并非自身地址之后将引起响应。而原始套接口允许对网络层协议如(IP或ICMP)进行直接访问,对于流经网卡的所有数据都可以接收到。原始套接字截获到的数据包并不仅仅是单纯的数据信息,而是包含有IP头、TCP头等信息头的最原始的数据信息,通过对这些在低层传输的原始信息的分析可以得到有关网络的一些信息。
3数据包截获机制的研究
3.1 概述
纵观国内外在数据包截获技术中所使用的包截获机制的方法,大致可归纳为两类:一类是由操作系统内核提供的截获机制;另一类是由应用软件或系统开发包通过安装包截获驱动程序提供的截获机制,该机制主要用于Win32平台下的开发。操作系统提供的截获机制主要有四种:BPF(Berkeley packet Filter),DLPI (Data Link Provider Interface),NIT(Network Interface Tap), Sock Packet类型套接口。BPF由基于BSD的Unix系统内核所实现。DLPI是Solaris(和其它System V Unix)系统的内嵌子系统。从性能上看, Sock Packet最弱。Windows操作系统没有提供内置的包截获机制。它只提供了数量很少并且功能有限的API调用。WinPcap(Windows Packet Capture)是Win32上的第一个用来截获数据包的开放系统软件包,它是一种新提出的强有力并且可扩展的框架结构。WinPcap包含了一系列以前系统所没有的创新特性。本文将对目前比较流行的WinPcap软件包提供的截获机制进行简单介绍。
3.2 WinPcap数据包截获机制
WinPcap的体系结构如图5所示:
图5 Winpcap的体系结构
由WinPcap体系结构图可以看出它采用的是分层化的驱动程序模型,并包含有三个组件:
1.内核级的数据包截获驱动程序
2.低级的动态连接库(Packet.dll)
3.高级系统无关库(Wpcap.dll)
WinPcap(Windows Packet Capture)是由微软资助的一个项目,其核心仍是基于NDIS的,但它对NDIS进行封装,它是Windows平台下一个免费、公共的网络访问系统,它为win32应用程序提供访问网络底层的能力.它提供了以下的各项功能:
1.截获原始数据报,包括在共享网络上各主机发送/接收以及相互之间交换的数据报;
2.在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉;
3.在网络上发送原始的数据报;
4.收集网络通信过程中的统计信息。
在Windows NT下WinPcap包截获驱动和网卡设备驱动的交互是通过NDIS(Network Device Interface Specification)来实现的。而且包截获驱动既与网络驱动通信又与用户应用程序通信,所以它在NDIS结构中如同一个协议驱动,对WindowsNT操作系统中的NDIS结构中的高端驱动进行编程,这样编制的程序与上层应用程序更容易连接,应用程序对驱动设置的工作也更方便。如图6所示:
图6 数据包截获驱动在NDIS中所处位置
3.3 套接字数据包截获机制
上世纪80年代初,加利福尼亚大学Berkeley分校在UNIX操作系统下实现了TCP/IP协议,它们为TCP/IP网络通信开发了一个应用程序接口(API),这个API称为socket(套接字)接口。Socket给程序员提供了一个高层接口,它的出现使得程序员在编写网络应用程序时只需要调用函数,对网络的底层细节并不需要精通,因此十分方便。
socket实质上是提供了进程通信的端点。进程通信之前,双方首先必须各自创建一个端点,否则是没有办法建立联系并相互通信的。正如打电话之前,双方必须拥有各自的电话机一样。
&nb