winpcap(
windows packet capture)是windows平台下一个免费,公共的网络访问系统。开发winpcap这个项目的目的在于为
win32应用程序提供访问网络底层的能力。它用于windows系统下的直接的
网络编程。
特点介绍
Winpcap提供了一个强大的编程接口,它很容易地在各个操作系统之间进行移植,也很方便程序员进行开发。
什么样的程序需要使用Winpcap
很多不同的工具软件使用Winpcap于
网络分析,
故障排除,网络
安全监控等方面。Winpcap特别适用于下面这几个经典领域:
3、通信日志记录
4、traffic generators
5、用户级别的桥路和路由
8、安全工具
Winpcap有些方面不能做。它不依靠主机的诸如
TCP/IP协议去收发数据包。这意味着它不能阻塞,不能处理同一台主机中各程序之间的通信数据。它只能“嗅探”到物理线路上的数据包。因此它不适用于traffic shapers,QoS调度,以及
个人防火墙。
Winpcap内部结构
Winpcap是一个Win32平台下用于抓包和分析的系统。包括一个内核级别的packet filter,一个底层的DLL(packet.dll)和一个高级的独立于系统的DLL(Wpcap.dll)
驱动功能
winpcap的主要功能在于独立于主机协议(如
TCP-IP)而发送和接收原始
数据包。也就是说,winpcap不能阻塞,过滤或控制其他
应用程序数据包的发收,它仅仅只是监听共享网络上传送的数据包。因此,它不能用于
QoS调度程序或
个人防火墙。winpcap开发的主要对象是windows NT/2000/XP,这主要是因为在使用winpcap的用户中只有一小部分是仅使用
windows 95/98/Me,并且MS也已经放弃了对
win9x的开发。因此本文相关的程序T-ARP也是面向NT/2000/XP用户的。其实winpcap中的面向9x系统的概念和NT系统的非常相似,只是在某些实现上有点差异,比如说9x只支持
ANSI编码,而NT系统则提倡使用
Unicode编码。有个软件叫snifferpro.可以作
网管软件用,有很多功能,可监视网络运行情况,每台网内机器的数据流量,实时反映每台机器所访问IP以及它们之间的数据流通情况,可以抓包,可对过滤器进行设置,以便只抓取想要的包,比如
POP3包,
smtp包,
ftp包等,并可从中找到邮箱
用户名和密码,还有ftp用户名和密码。它还可以在使用交换机的网络上监听,不过要在交换机上装它的一个软件。还有一个简单的
监听软件叫Passwordsniffer,可截获邮箱用户名和密码,还有ftp用户名和密码,它只能用在
HUB网络上。著名软件
tcpdump及idssnort都是基于
libpcap编写的,此外
Nmap扫描器也是基于libpcap来捕获目标主机返回的数据包的。
winpcap提供给用户两个不同级别的
编程接口:一个基于libpcap的
wpcap.dll,另一个是较底层的
packet.dll。对于一般的要与
unix平台上libpcap兼容的开发来说,使用wpcap.dll是当然的选择。
内部结构
Winpcap是针对Win32平台上的抓包和
网络分析的一个架构。它包括一个
核心态的
包过滤器,一个底层的
动态链接库(packet.dll)和一个高层的不依赖于系统的库(wpcap.dll)。
为什么使用“architecture”而不是“library”呢?因为抓包是一个要求与网络适配器(
网卡)和操作系统交互的底层机制,而且与网络的实施也有密切关系,所以仅用“library”不能充分表达Winpcap的作用。
图1表明了Winpcap的各个组成部分:
首先,抓包系统必须绕过操作系统的
协议栈来访问在网络上传输的原始数据包(raw packet),这就要求一部分运行在操作系统核心内部,直接与
网络接口驱动交互。这个部分是系统依赖(system
dependent)的,在Winpcap的解决方案里它被认为是一个
设备驱动,称作NPF(Netgroup
Packet Filter)。Winpcap开发小组针对
Windows95,Windows98,WindowsME,
Windows NT 4,
Windows2000和
WindowsXP提供了不同版本的驱动。这些驱动不仅提供了基本的特性(例如抓包和injection),还有更高级的特性(例如可编程的过滤器系统和
监视引擎)。前者可以被用来约束一个抓包会话只针对
网络通信中的一个子集(例如,仅仅捕获特殊主机产生的
ftp通信的数据包),后者提供了一个强大而简单的统计网络通信量的机制(例如,获得网络负载或两个主机间的数据
交换量)。
其次,抓包系统必须有用户级的
程序接口,通过这些接口,
用户程序可以利用内核驱动提供的高级特性。Winpcap提供了两个不同的库:packet.dll和wpcap.dll。前者提供了一个底层
API,伴随着一个独立于Microsoft操作系统的
编程接口,这些API可以直接用来访问驱动的函数;后者导出了一组更强大的与
libpcap一致的高层抓包函数库(capture primitives)。这些函数使得数据包的捕获以一种与
网络硬件和操作系统无关的方式进行。
NPF驱动
网络数据包过滤器(Netgroup Packet Filter,NPF)是Winpcap的核心部分,它是Winpcap完成困难工作的组件。它处理网络上传输的数据包,并且对用户级提供可捕获(capture)、发送(injection)和分析性能(analysis capabilities)。
NDIS(Network Driver Interface Specification)是一个定义网络
适配器(或者说成是管理网络适配器的
驱动程序)与协议驱动(例如TCP/IP的实现)之间通信的规范。NDIS最主要的目的是作为一个允许协议驱动发送和接收网络(
LAN或
WAN)上的数据包而不必关心特定的适配器或特定的
Win32操作系统的封装。
NDIS支持三种类型的网络驱动:
(1)
网络接口卡或
NIC驱动(Network interface card or NIC
drivers)。NIC驱动
直接管理着
网络接口卡(NIC)。NIC驱动接下边与硬件连接,从上边表现为一个接口,该接口允许高层发送数据包到网络上,处理中断,重置NIC,停止NIC,查询和设置驱动的运行特征。NIC驱动可以是小端口(miniport)或完全的NIC驱动(full NIC driver)。
Miniport驱动仅仅实现了管理NIC的必要操作,包括在NIC上发送和
接收数据。对于所有最底层的NIC驱动的操作由NDIS提供,例如同步(synchronization)。小端口(miniport)不直接调用操作系统函数,它们对于操作系统的接口是NDIS。
小端口仅仅是向上传递数据包给NDIS并且NDIS确保这些数据包被传递给正确的协议。
完全
NIC驱动(Full NIC driver)完成硬件细节的操作和所有由
NDIS完成的同步和查询操作。例如,完全NIC驱动维持接收到的数据的绑定信息。
(2) 中间层驱动(Intermediate drivers)中间层驱动位于高层驱动(例如协议驱动)和小端口之间。对于高层驱动,中间层驱动看起来像是小端口;对于小端口,中间层驱动看起来像协议驱动。一个中间层协议驱动可以位于另一个中间层驱动之上,尽管这种分层可能对
系统性能带来
负面影响。开发中间层驱动的一个关键原因是在现存的遗留协议驱动(legacy protocol driver)和小端口之间形成媒体的转化。例如,中间层驱动可以将LAN
协议转换成
ATM协议。中间层驱动不能与用户模式的应用程序通信,但可以与其他的NDIS驱动通信。
(3) 传输驱动或协议驱动(Transport drivers or protocol drivers)协议驱动实现了网络协议栈,例如
IPX/SPX或TCP/IP,在一个或多个
网络接口卡上提供它的服务。在协议驱动的上面,它为
应用层客户程序服务;在它的下面,它与一个或多个NIC驱动或中间层NDIS驱动连接。
NPF是一个协议驱动。从性能方面来看,这不是最好的选择,但是它合理地独立于
MAC层并且有权使用原始通信(raw traffic)。
图2表现了NPF在NDIS栈中的位置:
结构基础
图3表现了伴随着NPF驱动细节的Winpcap的结构。
抓包
抓包是NPF最重要的操作。在抓包的时候,驱动使用一个网络接口监视着数据包,并将这些数据包完整无缺地投递给用户级应用程序。
抓包过程依赖于两个主要组件:
一个数据包过滤器,它决定着是否接收进来的数据包并把数据包拷贝给监听程序。数据包过滤器是一个有布尔输出的函数。如果
函数值是true,
抓包驱动拷贝数据包给应用程序;如果是false,数据包将被丢弃。NPF数据包过滤器更复杂一些,因为它不仅决定数据包是否应该被保存,而且还得决定要保存的字节数。被NPF驱动采用的
过滤系统来源于
BSD Packet Filter(BPF),一个
虚拟处理器可以执行伪汇编书写的用户级过滤程序。应用程序采用用户定义的过滤器并使用wpcap.dll将它们编译进BPF程序。然后,应用程序使用BIOCSETF IOCTL写入
核心态的过滤器。这样,对于每一个到来的数据包该程序都将被执行,而满足条件的数据包将被接收。与传统解决方案不同,NPF不解释(interpret)过滤器,而是执行(
execute)它。由于性能的原因,在使用过滤器前,NPF提供一个
JIT编译器将它转化成本地的80x86函数。当一个数据包被捕获,NPF调用这个本地函数而不是调用过滤器
解释器,这使得
处理过程相当快。
一个循环缓冲区,用来保存数据包并且避免丢失。一个保存在缓冲区中的数据包有一个头,它包含了一些主要的信息,例如
时间戳和
数据包的大小,但它不是协议头。此外,以队列插入的方式来保存数据包可以提高数据的存储效率。可以以组的方式将数据包从NPF缓冲区拷贝到应用程序。这样就提高了性能,因为它降低了读的次数。如果一个数据包到来的时候缓冲区已经满了,那么该数据包将被丢弃,因此就发生了丢包。
实例
获得网卡接口。在普通的SOCKET编程中,对
双网卡编程是不行的。当主机为双网卡时,本程序可分别获得两张网卡各自的描述结构及地址,然后可以对它们分别进行操作。返回的alldevs队列首部为逻辑网卡,一般不对它进行什么操作。
获得网卡接口
--------------------------------------------------------------------------------
抓包
--------------------------------------------------------------------------------
发包
要在
命令行下运行,给与参数:网卡描述符。或者添加代码findalldevs,那样应很方便。
卸载问题
winpcap卸载不干净的的时候,在
windows下删除一些文件即可,删除下面的文件即可: