Winpcap编程(last).ppt

上传人:牧羊曲112 文档编号:6523769 上传时间:2023-11-08 格式:PPT 页数:58 大小:435KB
返回 下载 相关 举报
Winpcap编程(last).ppt_第1页
第1页 / 共58页
Winpcap编程(last).ppt_第2页
第2页 / 共58页
Winpcap编程(last).ppt_第3页
第3页 / 共58页
Winpcap编程(last).ppt_第4页
第4页 / 共58页
Winpcap编程(last).ppt_第5页
第5页 / 共58页
点击查看更多>>
资源描述

《Winpcap编程(last).ppt》由会员分享,可在线阅读,更多相关《Winpcap编程(last).ppt(58页珍藏版)》请在三一办公上搜索。

1、WinPcap编程,内容提要,什么是WinPcap WinPcap的结构WinPcap编程环境配置数据结构WinPcap编程,1.什么是WinPcap,当应用程序需要访问原始数据包,即没有被操作系统利用网络协议处理过的数据包时,socket无法满足需要,WinPcap为Win32应用程序提供这种访问方式。WinPcap提供了以下功能 捕获原始数据包,无论它是发往本机的,还是在其他设备(共享媒介)上交互的 在数据包递交给某应用程序前,根据用户指定的规则过滤数据包 将原始数据包通过网络发送出去 收集并统计网络流量信息,1.什么是WinPcap?,1.什么是WinPcap?,基于WinPcap的典型

2、应用网络与协议分析器(network and protocol analyzers)网络监视器(network monitors)网络流量记录器(traffic loggers)网络流量发生器(traffic generators)用户级网桥及路由(user-level bridges and routers)网络入侵检测系统(network intrusion detection systems(NIDS)网络扫描器(network scanners)安全工具(security tools),1.什么是WinPcap?,什么是WinPcap做不到的?WinPcap不能阻止、过滤或操纵同一机器

3、上的其他应用程序的通讯:它仅仅能简单地“监视”在网络上传输的数据包。所以,它不能提供以下支持:网络流量控制服务质量调度个人防火墙,1.什么是WinPcap,2.WinPcap的结构,2.1 WinPcap组成,WinPcap is an architecture for packet capture and network analysis for the Win32 platforms.It includes a kernel-level packet filter(NPF),a low-level dynamic link library(packet.dll),and a high-le

4、vel and system-independent library(wpcap.dll).,设备驱动-数据捕获-数据发送-可编程的过滤系统-监听引擎-,接口,2.1 WinPcap组成-Packet.dll,packet.dll(Packet Driver API)提供了一个底层的API访问接口,可以直接访问网卡,为win32平台提供了一个公共的接口。,2.1 WinPcap组成-Packet.dll,功能安装,启动和停止NPF设备驱动 从NPF驱动接收数据包 通过NPF驱动发送数据包 获取可用的网络适配器列表 获取适配器的不同信息,比如设备描述,地址列表和掩码 查询并设置一个低层的适配器参

5、数two versions of packet.dll the first one runs under Windows 95/98/ME the second one is for Windows NT/2000/XP.说明:以系统独立的方式访问网卡,开发的应用程序在不同的Windows系统上运行不需重新编译(向后兼容)透明处理NPF驱动,2.1 WinPcap组成-Wpcap.dll,Wpcap.dll(wpcap,libpcap)不依赖于操作系统,与libpcap兼容,提供了更加高层、抽象的函数。,2.1 WinPcap组成-Wpcap.dll,功能获取网络适配器列表 获取网络适配器的不

6、同信息,比如网卡描述和地址的列表 捕获数据包 发送数据 有效保存数据包到磁盘创建一个数据包过滤器把它们应用到数据捕获中去,2.1 WinPcap组成-NPF,NPF(Netgroup Packet Filter)一个数据报捕捉系统需要不经过系统协议栈的实现直接访问网络上传输的原始数据,这种功能的实现需要在系统内核运行组件与网卡直接打交道,由于需要与系统交互,因此与操作系统的依赖性非常强,对于不同的操作系统,都需要提供不同版本的NPF与系统交互。,2.1 WinPcap组成,NPF的位置NPF is implemented as a protocol driver,2.1 WinPcap组成,N

7、PF功能:数据捕获 流量监测 数据发送 dump to disk,1.什么是WinPcap,2.WinPcap的结构,3.WinPcap编程环境配置,Winpcap的安装,下载安装包和开发包 http:/winpcap.polito.it Winpcap的安装包(Winpcap4_0_2.exe)程序员开发包(WpdPack4_0_2.zip)运行Winpcap4_0_2.exe 测试安装结果,VC6.0编程环境设定,1.运行Visual C+6.0,打开WpdPack_3_1WpdPackExamples-pcap下的任一项目(本例用basic_dump目录下 basic_dump.dsw)

8、2.在“工程-设置 Link对象/库模块”中加入 wsock32.lib ws2_32.lib wpcap.lib 在“工具-选择-目录”的include files和library files设置中引入winpcap开发包中的Include和Lib目录3.编译,运行,环境配置,典型错误:VC6.0 编译不通过,下载4.0.1版本的WinPcap安装包和开发包,更新VC6.0的SDK,使用VS2005,OR,OR,1.什么是WinPcap,2.WinPcap的结构,4.数据结构,3.WinPcap编程环境配置,3 数据结构,网卡接口信息typedef struct pcap_if pcap_i

9、f_t struct pcap_if struct pcap_if*next;/指向下一个接口结构 char*name;/设备名,打开设备时使用 char*description;/设备的描述信息 struct pcap_addr*addresses;/指向地址链表的第一个地址 bpf_u_int32 flags;/接口标志;,接口地址信息struct pcap_addr struct pcap_addr*next;/指向下一个地址struct sockaddr*addr;/指向sockaddr类型的结构struct sockaddr*netmask;/指向addr相应的掩码struct so

10、ckaddr*broadaddr;/addr相应的广播地址struct sockaddr*dstaddr;/与addr对应的目标地址,如非点到点,则为NULL;,3 数据结构,接口地址数据结构,struct sockaddr u_short sa_family;char sa_data14;struct sockaddr_in short sin_family;u_short sin_port;struct in_addr sin_addr;char sin_zero8;,接口地址数据结构,struct in_addr union struct u_char s_b1,s_b2,s_b3,s_

11、b4;S_un_b;struct u_short s_w1,s_w2;S_un_w;u_long S_addr;S_un;,3 数据结构,捕捉实例typedef struct pcap pcap_t 一个已打开的捕捉实例的描述符。这个结构体对用户来说是不透明的,它通过wpcap.dll提供的函数,维护了它的内容。在打开网卡后作为捕获接口设备的标识。,libpcap dump文件头结构 struct pcap_file_header bpf_u_int32 magic;/标识位,是16进制的0 xa1b2c3d4 u_short version_major;/主版本号,0X02 u_short

12、version_minor;/次版本号,ox04 bpf_int32 thiszone;/时区校正,0 x0 bpf_u_int32 sigfigs;/时间戳精度,0X0 bpf_u_int32 snaplen;/包的最大存储长度,0 x0000ffff bpf_u_int32 linktype;/链路类型,以太网0 x00000001;,3 数据结构,3 数据结构,包描述头:dump文件中每个数据包的头部描述信息。struct pcap_pkthdr struct timeval ts;/时间戳bpf_u_int32 caplen;/数据包保存在pcap文件中的实际长度,以字节为单位bpf_

13、u_int32 len;/所抓获的数据包的真实长度,如果文件中保存不是完整的数据包,那么这个值可能要比前面的数据包长度的值大。;struct timeval DWORD GMTtime;/秒计时:32位,用来记录数据包抓获的时间,记录方式是记录从格林尼治时间的1970年1月1日 00:00:00 到抓包时经过的秒数 DWORD microTime;/毫秒计时:32位,抓取数据包时的毫秒值,1.什么是WinPcap,2.WinPcap的结构,5.WinPcap编程,4.数据结构,3.WinPcap编程环境配置,使用winpcap.dll编程,1、获取设备列表 int pcap_findallde

14、vs(pcap_if_t*alldevsp,char*errbuf)功能:返回本机所有的网络接口设备。当用户无法了解自己机器的接口设备时在程序的首部调用该函数。输入参数:两个参数全为空值(出口参数)返回:失败返回-1,errbuf中包含错误信息。成功则alldevsp中包含全部网络接口设备。举例:使用WPcap获得设备列表,释放设备列表,voidpcap_freealldevs(pcap_if_t*alldevsp),功能:释放一个由pcap_findalldevs()生成的接口列表,#include pcap.hint main()pcap_if_t*alldevs;pcap_if_t*d;

15、int i=0;char errbufPCAP_ERRBUF_SIZE;/*Retrieve the device list from the local machine*/if(pcap_findalldevs(,/*Print the list*/for(d=alldevs;d!=NULL;d=d-next)printf(%d.%s,+i,d-name);if(d-description)printf(%s)n,d-description);else printf(No description available)n);if(i=0)printf(nNo interfaces found!

16、Make sure WinPcap is installed.n);return;/*We dont need any more the device list.Free it*/pcap_freealldevs(alldevs);,使用winpcap.dll编程,2、打开适配器 pcap_t*pcap_open_live(char*DeviceName,int snaplen,int promisc,int to_ms,char*errbuf)功能:打开一个捕获接口设备。输入参数:DeviceName:设备名;snaplen:一个包中截取的字节数;通常设为65535 promisc:1混杂模

17、式,0正常模式;to_ms:时延(毫秒);errbuf:错误信息。返回:失败返回NULL,errbuf中包含错误信息。成功则捕获句柄。,打开离线的存储文件,读取数据包,pcap_t*pcap_open_offline(const char*fname,char*errbuf),功能:打开一个 tcpdump/libpcap 格式 的存储文件,来读取数据包,使用winpcap.dll编程,3、捕获数据包 不用回调方法捕获数据包int pcap_next_ex(pcap_t*p,struct pcap_pkthdr*pkt_header,const u_char*pkt_data)功能:从一个设备

18、接口,或从一个脱机文件中,取一个数据包 返回值:1:成功 0:超时错误-1:出现错误-2:离线捕获遇到文件尾部Tips:pcap_next_ex()目前只在Win32下可用,因为它不是属libpcap原始的API。这意味着含有这个函数的代码将不能被移植到Unix上。,使用winpcap.dll编程,3、捕获数据包 使用回调函数捕获数据包的(1)int pcap_loop(pcap_t*p,int cnt,pcap_handler callback,u_char*user)功能:循环抓取网络数据报文。每捕获到cnt个报文就调用callback回调用户函数。输入参数:p为句柄,cnt为每一次抓包数

19、,若为-1则表示循环抓包 callback为用户自定义的处理函数,user是传递给回调函数的参数。返回:失败返回-1。,使用winpcap.dll编程,3、捕获数据包(2)int pcap_dispatch(pcap_t*p,intcnt,pcap_handlercallback,u_char*user)功能:捕获并处理数据包。输入参数:cnt参数指定函数返回前所处理数据包的最大值。callback参数指定一个带有三个参数的回调函数。参数user为用户传递给回调函数的指针。返回:失败返回-1。成功则返回读取到的字节数。,使用winpcap.dll编程,回调函数的原型:void(*)pcap_h

20、andler(u_char*user,const struct pcap_pkthdr*pkt_header,const u_char*pkt_data)pcap_loop接受数据包的回调函数的原型 举例:使用回调函数打开适配器并捕获数据包,pcap_loop()函数的作用,voidpcap_breakloop(pcap_t*)功能:设置一个标志位,这个标志位会强制 pcap_dispatch()或 pcap_loop()返回,而不是继续循环。,将捕获数据保存在文件中,pcap_dumper_t*pcap_dump_open(pcap_t*p,const char*fname)功能:打开一个文

21、件来写入数据包 void pcap_dump(u_char*user,const struct pcap_pkthdr*h,const u_char*sp)功能:将数据包保存到磁盘中void pcap_dump_close pcap_dumper_t*p)功能:关闭数据包文件,4、过滤数据包 编译过滤规则函数int pcap_compile(pcap_t*p,struct bpf_program*fp,char*str,intoptimize,bpf_u_int32netmask)将一个高层的布尔过滤表达式编译成一个能够被过滤引擎所解释的低层的字节码。功能:编译过滤规则。输入参数:str:规则

22、串;optimize:是否优化。返回:失败返回-1。成功则捕获句柄。,使用winpcap.dll编程,4、过滤数据包 设置过路规则int pcap_setfilter(pcap_t*p,struct bpf_program*fp)将一个过滤器与内核捕获会话关联。举例:过滤并分析UDP数据包,使用winpcap.dll编程,使用pcap.dll编程,4、过滤数据包,WinPcap的过滤规则,1)表达式支持逻辑操作符,可以使用关键字 and、or、not对子表达式进行组合,同时支持使用小括号。2)基于协议的过滤:使用协议限定符:ip、arp、rarp、tcp、udp等。3)基于MAC地址的过滤要使

23、用限定符ether(代表以太网地址)仅作为源地址时:ether src mac_addr 仅作为目的地址:ether dst mac_addr 既作为源地址又作为目的地址:ether host mac_addrmac_addr应该遵从00:E0:4C:E0:38:88的格式,WinPcap的过滤规则,4)基于IP地址的过滤应该使用限定符host(代表主机地址)仅作为源地址:src host ip_addr仅作为目的地址:dst host ip_addr既作为源地址又作为目的地址:host ip_addr 5)基于端口的过滤应使用限定符 port。举例:仅接收80端口的数据包:port 80。只

24、捕获arp或icmp数据包:arp or(ip and icmp)捕获主机192.168.1.23与192.168.1.28之间传递的所有UDP数据包:(ip and udp)and(host 192.168.1.23 or host 192.168.1.28),生成线程,HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINE lpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWO

25、RD lpThreadId);,线程入口函数的定义,DWORD WINAPI Getpacket(LPVOID lpParameter).,使用pcap.dll编程,5、发送原始数据int pcap_sendpacket(pcap_t*p,u_char*buf,int size)功能:发送一个原始数据包到网络中。p:设备标识buf:待发送的数据包size:缓冲区buf的长度,举例:发送原始数据包(1),#include#include#include void main(int argc,char*argv)pcap_t*fp;char errbufPCAP_ERRBUF_SIZE;u_cha

26、r packet100;int i;/*Check the validity of the command line*/if(argc!=2)printf(usage:%s interface(e.g.rpcap:/eth0),argv0);return;,if(fp=pcap_open_live(argv1,/name of the device 100,/paceket maxlen PCAP_OPENFLAG_PROMISCUOUS,1000,/read timeout errbuf/error buffer)=NULL)printf(nUnable to open the adapte

27、r.%s is not supported by WinPcapn,argv1);return;,举例:发送原始数据包(2),/*Supposing to be on ethernet,set mac destination to 1:1:1:1:1:1*/packet0=1;packet1=1;packet2=1;packet3=1;packet4=1;packet5=1;/*set mac source to 2:2:2:2:2:2*/packet6=2;packet7=2;packet8=2;packet9=2;packet10=2;packet11=2;,举例:发送原始数据包(3),/

28、*Fill the rest of the packet*/for(i=12;i100;i+)packeti=i%256;/*Send down the packet*/if(pcap_sendpacket(fp,packet,100/*size*/)!=0)printf(nError sending the packet:n,return;,举例:发送原始数据包(4),WinPcap的典型应用,回调机制,直接方式,以太网首部,struct Ether_Head int srcaddr6;/源MAC地址int destaddr6;/目的MAC地址int type;/网络层报文类型 char*d

29、ata;Ether_Head;,IP首部,typedef struct ip_header u_char ver_ihl;/版本(4 bits)+首部长度(4 bits)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;

30、/协议(Protocol)u_short crc;/首部校验和(Header checksum)ip_address saddr;/源地址(Source address)ip_address daddr;/目的地址(Destination address)u_int op_pad;/选项与填充(Option+Padding)ip_header;,TCP首部,typedef struct tcp_header unsigned short th_sport;/源端口号 unsigned short th_dport;/目的端口号 unsigned int th_seq;/SEQ序号 unsigned int th_ack;/ACK序号 unsigned char th_lenres;/首部长度 unsigned char th_flag;/控制位 unsigned short th_win;/窗口大小 unsigned short th_sum;/校验和 unsigned short th_urp;/紧急指针 tcp_header;,UDP首部,typedef struct udp_header u_short sport;/源端口 u_short dport;/目的端口 u_short len;/UDP数据包长度 u_short crc;/校验和udp_header;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号