实验3背景知识网络协议分析.doc_第1页
实验3背景知识网络协议分析.doc_第2页
实验3背景知识网络协议分析.doc_第3页
实验3背景知识网络协议分析.doc_第4页
实验3背景知识网络协议分析.doc_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

一、winpcap 介绍2 1、winpcap 驱动各项功能 .2 2、Winpcap 程序实例.5 二、Wireshark(前称 Ethereal)10 三、Wireshark 捕获数据帧和 IP 数据包 10 网网络络协协议议分分析析 winpcap(windows packet capture)是 windows 平台下一个免费,公共的网络访问系统。开 发 winpcap 这个项目的目的在于为 win32 应用程序提供访问网络底层的能力。 下载网址:/。 1 捕获原始数据包,包括在共享网络上各主机发送 /接收的以及相互之间交换的数据 winpcap 结构 包; 2 在数据包发往应用程序之前,按照自定义的规则将某些特殊的数据包过滤掉; 3 在网络上发送原始的数据包; 4 收集网络通信过程中的统计信息。 winpcap 的主要功能在于独立于主机协议(如 TCP-IP)而发送和接收原始数据包。也就 是说,winpcap 不能阻塞,过滤或控制其他应用程序数据包的发收,它仅仅只是监听共享 网络上传送的数据包。因此,它不能用于 QoS 调度程序或个人防火墙。目前,winpcap 开 发的主要对象是 windows NT/2000/XP,M$也已经放弃了对 win9x 的开发。因此本文相关 的程序 T-ARP 也是面向 NT/2000/XP 用户的。 winpcap 提供给用户两个不同级别的编程接口:一个基于 libpcap 的 wpcap.dll,另一 个是较底层的 packet.dll。对于一般的要与 unix 平台上 libpcap 兼容的开发来说,使用 wpcap.dll 是当然的选择。 2 2、WINPCAP 的内部结构 Winpcap 的各个组成部分 Winpcap 是针对 Win32 平台上的抓包和网络分析的一个架构。它包括一个核心态的包 过滤器,一个底层的动态链接库( packet.dll)和一个高层的不依赖于系统的库 (wpcap.dll)。 为什么使用“architecture”而不是“library”呢?因为抓包是一个要求与网络适配器(网 卡)和操作系统交互的底层机制,而且与网络的实施也有密切关系,所以仅用 “library”不 能充分表达 Winpcap 的作用。 下图表明了 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)。 NPF 和和 NDIS 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 在 NDIS 栈中的位置 NPF 是一个协议驱动。从性能方面来看,这不是最好的选择,但是它合理地独立于 MAC 层并且有权使用原始通信( raw traffic)。 下图表现了 NPF 在 NDIS 栈中的位置: 伴随着 NPF 驱动细节的 Winpcap 的结构 NPF 结结构构基基础础 下图表现了伴随着 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 队列首部为逻辑网卡,一般不对它进行什么操作。 (一一)获获得得网网卡卡接接口口 i nclude “pcap.h“ void main() pcap_if_t *alldevs; /*struct pcap_if_t pcap_if_t *next; char *name; char *description; pcap_addr *addresses; U_int falgs; */ pcap_if_t *d; int i=0; char errbufPCAP_ERRBUF_SIZE; /* Retrieve the device list */ if (pcap_findalldevs( exit(1); /* Print the list */ for(d=alldevs;d;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! Make sure WinPcap is installed.n“); return; /* We dont need any more the device list. Free it */ pcap_freealldevs(alldevs); - (二二)抓抓包包 本程序俘获局域网内 UDP 报文。 i nclude “pcap.h“ /* 4 bytes IP address */ typedef struct ip_address u_char byte1; u_char byte2; u_char byte3; u_char byte4; ip_address; /* IPv4 header */ typedef struct ip_header u_char ver_ihl; / Version (4 bits) + Internet header length (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; / Protocol u_short crc; / Header checksum ip_address saddr; / Source address ip_address daddr; / Destination address u_int op_pad; / Option + Padding ip_header; /* UDP header*/ typedef struct udp_header u_short sport; / Source port u_short dport; / Destination port u_short len; / Datagram length u_short crc; / Checksum udp_header; /* prototype of the packet handler */ void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data); main() pcap_if_t *alldevs; pcap_if_t *d; int inum; int i=0; pcap_t *adhandle; char errbufPCAP_ERRBUF_SIZE; u_int netmask; char packet_filter = “ip and udp“; struct bpf_program fcode; /* Retrieve the device list */ if (pcap_findalldevs( exit(1); /* Print the list */ for(d=alldevs; d; 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! Make sure WinPcap is installed.n“); return -1; printf(“Enter the interface number (1-%d):“,i); scanf(“%d“, if(inum i) printf(“nInterface number out of range.n“); /* Free the device list */ pcap_freealldevs(alldevs); return -1; /* Jump to the selected adapter */ for(d=alldevs, i=0; inext, i+); /* Open the adapter */ if ( (adhandle= pcap_open_live(d-name, / name of the device 65536, / portion of the packet to capture. / 65536 grants that the whole packet will be captured on all the MACs. 1, / promiscuous mode 1000, / read timeout errbuf / error buffer ) ) = NULL) fprintf(stderr,“nUnable to open the adapter. %s is not supported by WinPcapn“); /* Free the device list */ pcap_freealldevs(alldevs); return -1; /* Check the link layer. We support only Ethernet for simplicity. */ if(pcap_datalink(adhandle) != DLT_EN10MB) fprintf(stderr,“nThis program works only on Ethernet networks.n“); /* Free the device list */ pcap_freealldevs(alldevs); return -1; if(d-addresses != NULL) /* Retrieve the mask of the first address of the interface */ netmask=(struct sockaddr_in *)(d-addresses-netmask)-sin_addr.S_un.S_addr; else /* If the interface is without addresses we suppose to be in a C class network */ netmask=0xffffff; /compile the filter if(pcap_compile(adhandle, /* At this point, we dont need any more the device list. Free it */ pcap_freealldevs(alldevs); /* start the capture */ pcap_loop(adhandle, 0, packet_handler, NULL); return 0; /* Callback function invoked by libpcap for every incoming packet */ void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data) struct tm *ltime; char timestr16; ip_header *ih; udp_header *uh; u_int ip_len; /* convert the timestamp to readable format */ ltime=localtime( strftime( timestr, sizeof timestr, “%H:%M:%S“, ltime); /* print timestamp and length of the packet */ /* retireve the position of the ip header */ ih = (ip_header *) (pkt_data + 14); /length of ethernet header /* retireve the position of the udp header */ ip_len = (ih-ver_ihl uh = (udp_header *) (u_char*)ih + ip_len); /* convert from network byte order to host byte order */ printf(“%s.%.6d len:%d “, timestr, header-ts.tv_usec, header-len); /* print ip addresses */ printf(“%d.%d.%d.%d - %d.%d.%d.%dn“, ih-saddr.byte1, ih-saddr.byte2, ih-saddr.byte3, ih-saddr.byte4, ih-daddr.byte1, ih-daddr.byte2, ih-daddr.byte3, ih-daddr.byte4 ); - (三三)发发包包 要在命令行下运行,给与参数:网卡描述符。或者添加代码 findalldevs(),那样应 很方便。 i nclude i nclude i nclude void usage(); void main(int argc, char *argv) pcap_t *fp; char errorPCAP_ERRBUF_SIZE; u_char packet100; int i; /* Check the validity of the command line */ if (argc != 2) printf(“usage: %s inerface“, argv0); return; /* Open the output adapter */ if(fp = pcap_open_live(argv1, 100, 1, 1000, error) ) = NULL) fprintf(stderr,“nError opening adapter: %sn“, error); return; /* 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; /* Fill the rest of the packet */ for(i=12;icmd-ping (2)用 IE 打开网页: (3)登录一个 FTP 服务器 5.至至此此,可可以以点点 Stop 按按钮钮停停止止 Wireshark 的的抓抓捕捕工工作作。得得到到如如下下图图所所示示的的结结束束,刚刚才才被被捕捕 获获的的数数据据帧帧全全部部在在这这了了。 6.以以下下来来分分析析数数据据帧帧和和数数据据包包 捕 获的数据含义如下: 第一列是捕获数据的编号; 第二列是捕获数据的相对时间,从开始捕获算为 0.000 秒; 第三列是源地址,第四列是目的地址; 第五列是协议信息; 第六列是数据包的信息。 为了避免因操作失误导致数据丢失,我们可以先将捕获的数据保存起来(选择 file- save 命令)。 7.以以太太网网的的帧帧格格式式: (1)ARP 协协议议封封装装在在以以太太网网中中的的格格式式: 分分析析 ARP 封封装装在在以以太太网网数数据据帧帧中中 在下图中 Filter 后面的编辑框中输入:arp(注意是小写),然后回车或者点击 “Apply”按钮, 现在只有 ARP 协议了。其他的协议数据包都被过滤掉了。如下图: 选中一个数据帧,然后从整体上整体上 WiresharkWireshark 的窗口,主要被分成三部分:上面部分是所的窗口,主要被分成三部分:上面部分是所 有数据帧的列表;中间部分是数据帧的描述信息有数据帧的列表;中间部分是数据帧的描述信息;下面部分是帧里面的数据。 中间部分的三行前面都有一个“+”,点击它,这一行就会被展开。现在展开第一行。 看到的结果如下: 在上图中我们

温馨提示

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

评论

0/150

提交评论