第5章直接网络编程.ppt_第1页
第5章直接网络编程.ppt_第2页
第5章直接网络编程.ppt_第3页
第5章直接网络编程.ppt_第4页
第5章直接网络编程.ppt_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Windows网络编程技术第5章直接网络编程,授课老师:胡鸣 数学与计算机学院 计算机系,本章提纲,5.1 原始套接字编程 5.1.1原始套接字简介 5.1.2WinSock原始套接字 5.1.3WinSock原始套接字编程步骤 5.1.4WinSock原始套接字实例 5.2 WinPcap网络数据包捕获 5.2.1WinPcap简介 5.2.2网络数据包捕获的原理 5.2.3Windows捕获数据包结构 5.2.4利用WinPcap捕获和过滤数据包步骤 5.2.5 WinPcap开发环境配置 5.2.6 WinPcap实例分析 5.2.7数据包捕获性能的优化,5.1.1原始套接字简介,原始套

2、接字是另一种常用的套接字。常用于与路由相关的应用。与流/数据报套接字相比,它具有如下3个主要特点: 原始套接字可以读/写ICMP、IGMP数据包 原始套接字可以读/写IP包,只要这些IP包的协议域不是由系统内核处理。通常系统内核只处理ICMP、IGMP、TCP和UDP几种协议。其他协议则由用户进程通过读写原始套接字来实现。 通过原始套接字,可以构造自己的IP包头。这样可以发送具有特殊IP头的UDP和TCP包。,5.1.2WinSock原始套接字,Windows Sockets 是一个编程接口,它是在加州大学伯克利分校开发的套接字接口的基础上定义的。它包括了一组扩展件,以充分利用 Microso

3、ft Windows 消息驱动的特点。规范的 1.1 版是在 1993 年 1 月发行的,2.2.0 版在 1996 年 5 月发行。 Windows 2000 支持 Winsock 2.2 版。在Winsock2中,支持多个传输协议的原始套接字,重叠I/O模型、服务质量控制等。,5.1.3WinSock原始套接字编程步骤,创建一个原始套接字,并设置IP头选项。 构造IP头部和TCP头部 发送原始套接字数据报 接收数据,1创建原始套接字,设置IP头选项。,这里,设置SOCK_RAW标志,表示声明原始套接字类型。创建原始套接字后,IP头就会包含在接收的数据中,如果设定 IP_HDRINCL 选项

4、,就需要构造IP头。注意,该选项设置,必须具有 administrator权限。否则需要修改注册表:,SOCKET sock; sock = socket(AF_INET,SOCK_RAW,IPPROTO_IP);,。,BOOL blnFlag=TRUE; setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char *),设置IP_HDRINCL 选项代码如下:,在HKEY_LOCAL_MACHINE System CurrentControlSet ServicesAfdParameter 下修改键:DisableRawSecurity(类型为DWORD),

5、把值修改为 1。如果没有,就添加,如果接收的数据报中协议类型和定义的原始套接字匹配,那么,接收的所有数据就拷贝到套接字中。 如果绑定了本地地址,那么只有接收数据IP头中对应的远端地址匹配,接收的数据就拷贝到套接字中。 如果定义的是外部地址,比如使用connect(),那么,只有接收数据IP头中对应的源地址匹配,接收的数据就拷贝到套接字中。,原始套接字接收数据报,要注意以下几点,2构造IP头部和TCP头部,(1)IP头部结构,(2)IP头部定义,struct ip_header u_char ver_ihl; / Version (4 bits) + header length (4 bits)

6、 u_char tos;/ Type of service u_short tlen;/ Total length u_short identification; / Identification u_short flags_fo; / Flags (3 bits) + Fragment offset (13 bits) u_char ttl;/ Time to live u_char proto;/ Protocol u_short crc;/ Header checksum u_long saddr;/ Source address u_long daddr;/ Destination a

7、ddress u_long op_pad;/ Option + Padding ;,(3)TCP伪首部,typedef struct psd_hdr /定义TCP伪首部 unsigned long saddr; /源地址 unsigned long daddr; /目的地址 char mbz; char ptcl; /协议类型 unsigned short tcpl; /TCP长度 PSD_HEADER;,(4)TCP定义,typedef struct _tcphdr /定义TCP首部 USHORT th_sport; /16位源端口 USHORT th_dport; /16位目的端口 uns

8、igned int th_seq; /32位序列号 unsigned int th_ack; /32位确认号 unsigned char th_lenres; /4位首部长度/6位保留字 unsigned char th_flag; /6位标志位 USHORT th_win; /16位窗口大小 USHORT th_sum; /16位校验和 USHORT th_urp; /16位紧急数据偏移量 TCP_HEADER;,(5)校验和函数代码,TCP伪首部并不是真正存在的,只是用于计算检验和,如下:,USHORT checksum(USHORT *buffer, int size) unsigned

9、 long cksum=0; while (size 1) cksum += *buffer+; size -= sizeof(USHORT); if (size) cksum += *(UCHAR*)buffer; cksum = (cksum 16) + (cksum ,在默认情况下,写入的数据将由系统内核填入IP包或TCP包的数据域,而IP头部和TCP头部由系统内核自动产生。只有当需要自己填充IP头部和TCP头部的时候,同时需要自己计算他们的检验和。,3发送原始套接字数据报,填充这些头部稍微麻烦点,发送就相对简单多了。只需要使用sendto()就可以了。,sendto(sock, (ch

10、ar*),4接收数据,和发送相比,接收比较麻烦。在windows2000中不能用recv()接收原始套接字上的数据,这是因为,所有的IP包都是先递交给系统内核,然后再传输到用户程序,当发送一个原始套接字包的时候(比如syn),内核并不知道,也没有这个数据被发送或者连接建立的记录。因此,当远端主机回应的时候,系统内核全部丢掉这些包,从而应用程序无法获得。 应用程序要接收数据,必须采用嗅探,接收所有通过的数据包,然后筛选留下符合需要的。可以再定义一个原始套接字,用来完成接收数据的任务,需要设置SIO_RCVALL,表示接收所有的数据。,创建用于接收数据的原始套接字,可以用接收函数接收数据包。然后在

11、使用一个过滤函数达到筛选的目的,接收需要的数据包。,SOCKET sniffersock; sniffsock = WSASocket(AF_INET, SOCK_RAW, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED); DWORD lpvBuffer = 1; DWORD lpcbBytesReturned = 0 ; WSAIoctl(sniffersock, SIO_RCVALL, ,5.1.4WinSock原始套接字实例,(1) PING程序(“第5章代码”的example1) (2)嗅探检测 (“第5章代码”的example2) ping程序原理

12、很简单:ping程序发ICMP响应请求给某一主机,该主机返回一个ICMP响应应答,程序收到应答则显示结果。为完成这个功能,首先应创建协议为ICMP的原始套接字以接收/发送ICMP包,然后需要构造ICMP包,通过原始套接字发送给对方主机。,图:ICMP包结构,图:响应请求和响应应答的ICMP包格式,0,8,16,32,0,8,16,32,ICMP数据结构定义,struct icmp_header BYTE i_type; BYTE i_code; /* type sub code */ USHORT i_cksum; USHORT i_id; USHORT i_seq; ;,校验和算法,USHO

13、RT checksum(USHORT *buffer, int size) unsigned long cksum=0; /*把ICMP报头二进制数据以2字节为单位累加起来*/ while(size 1) cksum+=*buffer+; size -=sizeof(USHORT); /*若ICMP报头为奇数个字节,会剩下最后一字节。 把最后一个字节视为一个2字节数据的高字节,这个2字节数据的低字节为0,继续累加*/ if(size ) cksum += *(UCHAR*)buffer; cksum = (cksum 16) + (cksum ,设置(偶)校验位,void SetCheck(c

14、har c) /设置(偶)校验位D7 (一个字节) int i,sum = 0; BYTE x = 0 x01; for(i=0;isum if(c /若sum为偶数,则置D70 ,校验(偶)校验位,bool checkSum(BYTE c) /(偶)校验计算(一个字节) int i,sum = 0; BYTE x = 0 x01; for(i=0;isum if(c /若sum为偶数,则无差错,5.2.1WinPcap简介,虽然Unix 平台上的BSD 包截获系统提供了一组供应用程序直接调用的网络数据包截获函数,允许应用程序与网卡间直接进行交互, 但在Win32 平台上, 目前主要使用Win

15、Pcap 体系结构。 WinPcap 是基于Win32 平台的网络包截获和分析的系统,它具有丰富的网络数据包处理函数,其功能比BSD 包截获系统更强,如“包监视”和“包发送”等功能函数在早先的Unix 平台上是不具备的。 WinPcap是一个重要的抓包工具,它是libpcap的Windows版本,WinPcap组成模块,WinPcap 包括三个部分: 第一个模块:内核级的包过滤驱动程序 NPF(Netgroup Packet Filter),是一个虚拟设备驱动程序文件, 是架构的核心(在Win95/98 中是一个VXD文件,在NT/2000 中是一个SYS 文件) ,它的主要功能是过滤数据包,

16、在包上附加时间戳、数据包长度等信息。 第二个模块:低级动态链接库packet.dll,在Win32 平台上提供了与NPF 的一个通用接口。 packet.dll数据包驱动程序库是与libpcap 相兼容的一组用户级的函数库。 第三个模块:用户级的Wpcap.dll。通过调用packet.dll 提供的函数生成,它包括了过滤器生成等一系列可以被用户级调用的高级函数,另外还有诸如数据包统计及发送功能。,WinPcap功能,开发WinPcap这个项目的目的在于为win32应用程序提供访问网络底层的能力。它提供了以下的各项功能: 捕获原始数据报,包括在共享网络上各主机发送/接收的以及相互之间交换的数据

17、 在数据报发往应用程序之前,按照自定义的规则将某些特殊的数据报过滤掉; 在网络上发送原始的数据报; 收集网络通信过程中的统计信息。,5.2.2网络数据包捕获的原理,以太网(Ethernet)具有共享介质的特征,信息是以明文形式在网络上传输,当网络适配器设置为监听模式(混杂模式,Promiscuous)时,由于采用以太网广播信道争用的方式,使得监听系统与正常通信的网络能够并联连接,并可以捕获任何一个在同一冲突域上传输的数据包。 IEEE802.3 标准的以太网采用的是持续 CSMA 的方式,正是由于以太网采用这种广播信道争用的方式,使得各个站点可以获得其他站点发送的数据。运用这一原理使信息捕获系

18、统能够拦截的所要的信息,这是捕获数据包的物理基础。,网卡工作模式,网卡具有如下的几种工作模式: 广播模式(Broad Cast Model):它的物理地址(MAC)地址是 0Xffffff 的帧为广播帧,工作在广播模式的网卡接收广播帧。 多播传送(MultiCast Model):多播传送地址作为目的物理地址的帧可以被组内的其它主机同时接收,而组外主机却接收不到。但是,如果将网卡设置为多播传送模式,它可以接收所有的多播传送帧,而不论它是不是组内成员。 直接模式(Direct Model):工作在直接模式下的网卡只接收目地址是自己 Mac地址的帧。 混杂模式(Promiscuous Model)

19、:工作在混杂模式下的网卡接收所有的流过网卡的帧,信包捕获程序就是在这种模式下运行的。,5.2.3Windows捕获数据包结构,NDIS驱动程序结构,捕获数据包的结构与函数,Packet.dll相关的数据结构 Packet.dll相关函数 wpcap.dll库函数介绍 wpcap.dll的相关数据结构 wpcap.dll主要函数,Packet.dll相关的数据结构,typedef struct _ADAPTER *LPADAPTER 描述一个网络适配器。 它包含了两个域: HANDLE hFile TCHAR SymbolicLink hFile是一个指向驱动器句柄的指针。通过该句柄,我们可以直

20、接与驱动器进行通信,如接收或发送数据包。SymbolicLink是一个字符串,它包含了当前打开的网络适配器的名称。,typedef struct _PACKET *LPPACKET 描述一组网络数据包的结构。 它包含了以下几个域: OVERLAPPED OverLapped PVOID Buffer UINT Length PVOID ulBytesReceived BOOLEAN bIoComplete OverLapped是用来处理对驱动器的异步调用。Buffer是用来指向缓存的指针,该缓存包含了数据包的数据。Length是该缓存区的大小。而ulBytesReceived表明了该缓存中包含

21、的有效数据的大小。BIoComplete是在异步调用中用来表示该Packet是否包含有效的数据。,struct bpf_hdr 数据报头部。 它包含以下几个域: struct timeval bh_tstamp UNIT bh_caplen UNIT bh_datalen USHORT bh_hdrlen bh_tstamp是一个时间戳,它包含两个域:tv_sec和tv_usec,用来表示报文的捕获时间。bh_caplen是封装报文后的报文长度。bh_datalen是原始报文长度。bh_hdrlen是封装报文的报头长度。,typedef struct NetType NetType 描述网络类

22、型的数据结构。 typedef struct npf_if_addr npf_if_addr 描述一个网络适配器的ip地址。 Struct bpf_stat 当前捕获数据报的统计信息,Packet.dll相关函数,1LPPACKET PacketAllocatePacket(void)如果运行成功,返回一个_PACKET结构的指针,否则返回NULL。成功返回的结果将会传送到PacketReceivePacket()函数,接收来自驱动的网络数据报。 2 VOID PacketFreePacket(LPPACKET lpPacket)释放参数提供的_PACKET结构。 3VOID PacketCl

23、oseAdapter(LPADAPTER lpAdapter)关闭参数中提供的网络适配器,释放相关的ADAPTER结构。,4BOOLEAN PacketGetAdapterNames(LPSTR pStr,PULONG BufferSize)返回可以得到的网络适配器列表及描述。 5BOOLEAN PacketGetNetInfoEx(LPTSTR AdapterNames,npf_ip_addr *buff, PLONG NEntries)返回某个网络适配器的全面地址信息。其中npf_ip_addr结构包含: IPAddress: ip地址SubnetMask: 子网掩码Broadcast:

24、广播地址,6BOOLEAN PacketGetNetType(LPADAPTER AdapterObject, NetType *type)返回某个网络适配器的MAC类型。NetType结构里包含了LinkSpeed(速度)和LinkType(类型)。其中LinkType包含以下几种情况:NdisMedium802_3: Ethernet(802.3)NdisMediumWan: WANNdisMedium802_5: Token Ring(802.5)NdisMediumFddi: FDDINdisMediumAtm: ATMNdisMediumArcnet878_2: ARCNET(878

25、.2),7BOOLEAN PacketGetStats(LPADAPTER AdapterObject,struct bpf_stat *s)返回几个关于当前捕获报告的统计信息。其中bpf_stat结构包含: bs_recv, bs_drop,ps_ifdrop,bs_captbs_recv: 从网络适配器开始捕获数据报开始所接收到的所有数据报的数目,包括丢失的数据报;bs_drop: 丢失的数据报数目。 8PCHAR PacketGetVersion()返回关于dll的版本信息。,9VOID PacketInitPacket(LPPACKET lpPacket, PVOID Buffer,

26、UINT Length)初始化一个_PACKET结构。 10 LPADAPTER PacketOpenAdapter(LPTSTR AdapterName)打开一个网络适配器。 11 BOOLEAN PacketReceivePacket(LPADAPTER AdapterObject,LPPACKET lpPacket,BOOLEAN Sync)从NPF驱动程序读取网络数据报及统计信息。数据报编码结构: |bpf_hdr|data|Padding|bpf_hdr|data|Padding|,12 BOOLEAN PacketSendPacket(LPADAPTER AdapterObject

27、,LPPACKET lpPacket, BOOLEAN Sync)发送一个或多个数据报的副本。 13 BOOLEAN PacketSetBuff(LPADAPTER AdapterObject,int dim)设置捕获数据报的内核级缓冲区大小。,14 BOOLEAN PacketSetHwFilter(LPADAPTER AdapterObject,ULONG Filter)为接收到的数据报设置硬件过滤规则。以下为一些典型的过滤规则:NDIS_PACKET_TYPE_PROMISCUOUS: 设置为混杂模式,接收所有流过的数据报;NDIS_PACKET_TYPE_DIRECTED: 只有目的地

28、为本地主机网络适配器的数据报才会被接收;NDIS_PACKET_TYPE_BROADCAST: 只有广播数据报才会被接收;NDIS_PACKET_TYPE_MULTICAST: 只有与本地主机网络适配器相对应的多播数据报才会被接收;NDIS_PACKET_TYPE_ALL_MULTICAST: 所有多播数据报均被接收;NDIS_PACKET_TYPE_ALL_LOCAL: 所有本地数据报均被接收。,15 BOOLEAN PacketSetNumWrites(LPADAPTER AdapterObject,int nwrites)设置调用PacketSendPacket()函数发送一个数据报副本

29、的最大重发次数。 16 BOOLEAN PacketSetReadTimeout(LPADAPTER AdapterObject,int timeout)设置读操作等待时间 。 以上介绍的包含了packet.dll里的大部分函数。如果想更深层的了解winpcap,请访问相关网站,主页地址: http:/winpcap.polito.it,wpcap.dll库函数介绍,wpcap.dll为包捕获应用提供了一个高级的编程接口,它是从Libpcap发展而来并且相互兼容,所以wpcap.dll包含了Libpcap具有的函数。另外,由于它还增加了数据包发送和统计等功能,为此增加了以下的函数: pcap_

30、setbuff:该函数用于设置包驱动器缓冲区的大小,一个适合大小的缓冲区不仅可以减少丢包率,还可以提供包捕获能力。 pcap_setmode:该函数把网络适配器设置为统计方式。 pcap_stats:这个函数用于获取包捕获过程的统计数据。 Wpcap为了要与硬件接口,还直接调用了packet.dll提供的函数。,wpcap.dll的相关数据结构,接口地址: struct pcap_addr struct pcap_addr *next; /*指到链表的下一个结点*/ struct sockaddr *addr; /*指到sockaddr类型的结构*/ struct sockaddr *netm

31、ask; /*指到addr相应的掩码*/ struct sockaddr *broadaddr; /*addr相应的广播地址*/ struct sockaddr *dstaddr; /*与addr对应的目标地址, 如非点到点,则为NULL*/ ;,libpcap dump文件的头结构: struct pcap_file_header bpf_u_int32 magic;/*/ u_short version_major;/*主版本号*/ u_short version_minor;/*次版本号*/ bpf_int32 thiszone;/*本地时间*/ bpf_u_int32 sigfigs;

32、/*时间戳*/ bpf_u_int32 snaplen;/*保存一个包中多大的数据*/ bpf_u_int32 linktype;/*数据链路类型*/ ;,接口数据结构: struct pcap_if struct pcap_if *next; /*本链下一个结点*/ char *name; /*设备名称*/ char *description;/*描述*/ struct pcap_addr *addresses; u_int flags;/*如是一个回路接口, 则设成PCAP_IF_LOOPBACK */ ;,pcap_if,pcap_if,pcap_if,pcap_addr,pcap_ad

33、dr,dump file中包的头结构: struct pcap_pkthdr struct timeval ts;/*时间戳*/ bpf_u_int32 caplen;/*长度*/ bpf_u_int32 len;/*捕获包的长度*/ ;,统计数据结构: struct pcap_stat u_int ps_recv;/*网上已传送的包数*/ u_int ps_drop; /*丢弃的包数*/ u_int ps_ifdrop;/*接口拒绝的包数,暂不支持*/ #ifdef WIN32 u_int bs_capt;/*Win32专用,捕获的包数*/ #endif /* WIN32 */ ;,wpca

34、p.dll主要函数,(1)Int pcap_findalldevs(pcap_if_t * alldevsp, char * errbuf) 功能:返回本机所有的网络接口设备。 输入参数:两个参数全为空值 返回: 失败:返回-1,errbuf中包含错误信息。 成功:alldevsp中包含全部网络接口设备。 当用户无法了解自己机器的接口设备时在程序的首部调用该函数。 (2)Char *pcat_lookupdev(char *errbuf) 该函数用于返回可被pcap_open_live()或pcap_lookupnet()函数调用的网络设备名(一个字符串指针)。如果函数出错,则返回NULL,同

35、时errbuf中存放相关的错误消息。,(3)int pcap_lookupnet(char *device, bpf_u_int32 *netp,bpf_u_int32 *maskp, char *errbuf) 获得指定网络设备的IP地址和掩码。netp参数和maskp参数都是bpf_u_int32指针。如果函数出错,则返回-1,同时errbuf中存放相关的错误消息。 (4)Pcap_dumper_t *pcap_dump_open(pcap_t *p,char *filename) 打开一个保存数据包的文件,其文件格式是固定的,和tcpdump等文件格式相兼容。,(5)Pcap_t * p

36、cap_open_live(char * DeviceName,int snaplen,int promisc,int to_ms,char *errbuf) 功能:打开一个捕获接口设备。 输入参数: DeviceName:设备名; snaplen:一个包中截取的字节数; promisc:1杂凑模式,0正常模式; to_ms:时延(毫称);errbuf:错误信息 返回: 失败:返回非正数,errbuf中包含错误信息。 成功:捕获句柄。,(6)intpcap_compile (pcap_t *p, struct bpf_program *fp, char *str, int optimize,

37、bpf_u_int32 netmask) 功能:编译过滤规则 输入参数: Str规则串; optimize是否优化; 返回: 失败:返回-1。 成功:捕获句柄,(7)int pcap_setfilter (pcap_t *p, struct bpf_program *fp) 功能:设置过滤器规则 输入参数: fp为指到结构体 bpf_program 的指针, pcap_compile()函数的返回值。 返回: 失败:返回-1。,(8)int pcap_dispatch(pcap_t *p, int cnt,pcap_handler callback, u_char *user) 捕获并处理数据

38、包。cnt参数指定函数返回前所处理数据包的最大值。cnt=-1表示在一个缓冲区中处理所有的数据包。cnt=0表示处理所有数据包,直到产生以下错误之一:读取到EOF;超时读取。 callback参数指定一个带有三个参数的回调函数,这三个参数为:typedef void ( *pcap_handler ) ( u_char *agrs, const struct pcap_pkthdr *header, const u_char *packet ); 其中agrs是从pcap_dispatch()函数传递过来的第四个形参 ,一般我们自己的包捕捉程序不需要提供它,总是为NULL ;header指向p

39、cap_pkthdr结构,该结构位于真正的物理帧前面,用于消除不同链路层支持的差异 ;packet指向所捕获报文的物理帧。 参数user 为用户传递给回调函数的指针。 如果成功则返回读取到的字节数。读取到EOF时则返回零值。出错时则返回-1,此时可调用pcap_perror()或pcap_geterr()函数获取错误消息。,(9)Int pcap_loop (pcap_t *p, int cnt, pcap_handler callback, u_char *user) 功能:循环抓取网络数据报文。每捕获到cnt个报文就调用callback用户函数。 输入参数:P句柄,cnt每一次抓包数,ca

40、llback用户自定义的处理函数,user一般为null。 注:该函数功能基本与pcap_dispatch()函数相同,只不过此函数在cnt个数据包被处理或出现错误时才返回,但读取超时不会返回。而如果为pcap_open_live()函数指定了一个非零值的超时设置,然后调用pcap_dispatch()函数,则当超时发生时pcap_dispatch()函数会返回。cnt参数为负值时pcap_loop()函数将始终循环运行,除非出现错误,(10) pcap_read() 这个函数从包捕获驱动器中读取一组数据包并针对每一个包运行包过滤程序,然后把过滤后的数据送应用程序缓冲器 u_char *pca

41、p_next(pcap_t *p, struct pcap_pkthdr *h) 返回指向下一个数据包的u_char指针。 (11)void pcap_close (pcap_t *p) 功能:关闭库。 输入参数:P句柄。 (12)Int pcap_setbuff(pcap_t *p,int dim) 用来设置核心层的缓冲区。,(13)Int pcap_setmode(pcap_t *p,int mode) 用来设置网卡的工作模式:混杂/非混杂。 (14)pcap_stats():这个函数用于获取包捕获过程的统计数据。 (15)Int pcap_sendpacket(pcap_t *p,cha

42、r *buf,int size) 用来发送数据包。 (16)FILE *pcap_file(pcap_t *p) 返回被打开文件的文件名。 (17)int pcap_fileno(pcap_t *p) 返回被打开文件的文件描述字号码,5.2.4利用WinPcap捕获和过滤数据包步骤,针对WinPcap的两种动态链接库:Packet.dll和wpcap.dll有三种应用模式:数据包捕获应用、数据包监测和数据包统计 其中数据包捕获应用利用wpcap.dll提供的数据结构与函数 而数据包监测和数据包统计采用Packet.dll提供的数据结构与函数来实现,wpcap.dll捕获数据包的调用流程,首先调

43、用pcap_lookupdev(char * errbuf) 函数获得主机上的网络设备,该函数返回一个指向主机上的网络设备(如网卡) 的指针;然后调用pcap_open_live (char * device , int snaplen , int promisc , int to_ms , char * ebuf) 函数打开一个网络设备, 该函数返回一个包捕获描述符pcap_t。其中, device 是要打开的网络设备字符串, snaplen 设定捕获的包的最大长度, promisc 确定接口是否被设为promiscuous(混杂)模式。在网络监视仪系统中,此参数设为promiscuous模

44、式,以捕捉本地网络上的所有包。To_ms 设定读超时的毫秒数, ebuf 用来返回错误文本。,然后调用intpcap_compile (pcap_t *p, struct bpf_program *fp, char *str, int optimize, bpf_u_int32 netmask)来编译过滤规则,用int pcap_setfilter (pcap_t *p, struct bpf_program *fp)来设置过滤器规则。 接下来用pcap_loop (pcap_t* p , int cnt , pcap_handler callback , u_char * user) 或pc

45、ap_next (pcap_t * p , struct pcap_pkthdr *h)函数捕获网络上所有的数据包给应用程序作分析用。 最后用void pcap_close (pcap_t *p)来关闭库。,发送数据包,Winpcap中有发送单个包和发送多个包的方法。其中发送单个包的大致过程如下: 通过名字打开一个设备pcap_open; 自己构造一个原始数据包(原始数据包为链路帧,这个数据包会不经过任何处理就发送出去); 使用pcap_sendpacket()发送数据包。,统计网络流量,通过名字打开一个设备pcap_open 通过 read_timeout来设置统计的时间间隔 设置filte

46、rpcap_compile, pcap_setfilter (可选) 设置设备的为统计模式 pcap_setmode(MODE_STAT); 开始统计,pcap_loop/pcap_dispatch() 在回调函数中的参数中就包含了统计信息,Packet.dll监听流程图,5.2.5 WinPcap开发环境配置,用 Microsoft Visual C+ 创建一个使用 wpcap.dll 的应用程序,需要按以下步骤: 在每个使用库的源程序中,将 pcap.h 头文件包含进来。 如果程序使用了WinPcap提供给Win32平台的特有函数, 记得在预处理中加入WPCAP 的定义。 如果程序使用了W

47、inPcap的远程捕获功能,那么在预处理定义中加入HAVE_REMOTE。不要直接把remote-ext.h直接加入到源文件中。 设置VC+的链接器(Linker),把wpcap.lib库文件包含进来。wpcap.lib可以在WinPcap中找到。 设置VC+的链接器(Linker),把ws2_32.lib库文件包含进来。这个文件分布于C的编译器,并且包含了Windows的一些socket函数。本教程中的一些范例程序,会需要它。,另外还要记住以下几点: 添加预处理定义,打开Project菜单,选择Settings,然后选择C/C+选项卡,在General类Preprocessor Defini

48、tions下的文本框中添加定义。 在VC+6.0工程添加库,打开Project菜单,选择Settings,然后选择Link选项卡,然后把库名添加到Object/Library modules下的文本框中 添加库所在路径,打开Tool菜单,选择Options,然后选择Directories选项卡,在Show directories下拉框中选择Library files,并且将新的路径添加到Directories中去,添加包含文件所在路径,打开Tool菜单,选择Options,然后选择Directories选项卡,在Show directories下拉框中选择Include files,并且将新的

49、路径添加到Directories中去,5.2.6 WinPcap实例分析,下面给出两个编程应用方法: wpcap.dll应用方法 Packet.dll应用方法 此外第5章代码给出实际的应用程序Example3-6,主要实现的功能是 1. 获取网络接口列表 2. 获取设备的高级信息 3. 打开一个接口并捕捉流量 4. 数据包捕获过滤,wpcap.dll应用,下面程序给出利用wpcap.dll接口对网络数据包进行监听的简单实例。 #include #include int main() pcap_t * handle; /* 监听会话句柄 */ char *dev; /* 监听网络接口 */ char errbufIPCAP_ERRBUF_SIZE; /* 错误代码 */ struct bpf_program filter; /* 编译后过滤器表达式 */ char filter_app=”port 23”; /* 指定过滤条件 */ bpf_u_in

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论