实验1_基于WinPcap的简单网络编程

合集下载

基于libcap、winpcap的网络编程

基于libcap、winpcap的网络编程

第五章基于libpcap的网络编程技术5. 1常见的包捕获机制简介包捕获就是利用以太网的介质共享的特性,通过将网络适配器设置为混杂模式的方法,接收到所有网络上的以太网帧。

包捕获的机制大致可以分为两类:一类是由操作系统内核提供的捕获机制。

另一类是由应用软件或系统开发包捕获驱动程序提供的捕获机制。

常见的包捕获机制如表5-1所示。

其中最主要的是下列4种:BPF ( Berkeley Packet Filter )DLPI ( Data Link Provider In terface )NIT ( Network In terface Tap ) SOCK-PACKET 类型套接口。

BPF由基于BSD的Unix系统内核所实现。

DLPI是Solaris (和其他System V UNIX ) 系统的内嵌子系统。

NIT是SUN OS4 系统的一部分,但在Solaris /SUN OS5 中被DLPI 所取代。

Linux核心则实现了SOCK-PACKET 的包捕获机制。

从性能上看,BPF比DLPI 和NIT 好得多,SOCK-PACKET 最弱。

表5-1常用的包捕获机制由于现在很多局域网为NT网,其网络传输方式大多采用以太网标准,所以涉及的编程也是在Windows 环境下实现的。

Windows 操作系统没有提供包捕获机制,只提供了数量很少并且功能有限的API调用。

在Windows 环境下由于其自身的封装性,很难对其底层进行编程。

本章将对BSD系列的libpcap进行深入地介绍。

5.2 Libpcap 与 BPF(1) libpcap 概述libpcap(Packet Capturelibrary),即数据包捕获函数库。

该库提供的 C 函数接口可用于捕获经过网络接口 (只要经过该接口,目标地址不一定为本机)的数据包。

它是由洛仑兹 伯克利试验室的研究人员 Steven McCanne 和Van Jacobson 于1993 年在Usenix'93 会议上正式提出的一种用于 Unix 内核数据包过滤体制。

使用Wincap编制一个简单的网络数据包监听与捕获程序

使用Wincap编制一个简单的网络数据包监听与捕获程序
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)
使用pcap_open()函数打开适配器,将这个函数的snaplen参数设为65535,这比能遇到的最大的MTU还要大,以保证能收到完整的数据包。另一个参数flag设为PCAP_OPENFLAG_PROMISCUOUS,意为混杂模式,不管这个数据包是不是发给本机的,都会去捕获。参数to_ms指定读取数据的超时时间,这里设置为1000ms,在适配器上进行读取操作都会在to_ms毫秒时间内响应。
ih = (ip_header *) (pkt_data +
14); //以太网头部长度
/*打印协议类型*/
int i;
for(i = 0; i < 10; i++){
if(protocol[i].number == ih->proto){
break;
}
}
if(i <= 9)
printf("%5s ", protocol[i].name);
return 0;
}
/*回调函数,当收到每一个数据包时会被libpcap所调用*/
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)

实验Winpcap网络编程

实验Winpcap网络编程
深 圳 大 学 实 验 报 告
课程名称:计算机网络
实验项目名称:实验3-Winpcap网络编程
学院:计算机与软件学院
专业:计算机科学与技术
指导教师:陆楠
报告人:卢志敏学号:2006131114班级:3
实验时间:2009-05-14
实验报告提交时间:2009-6-17
教务处制
1、实验目的
了解和分析以太网帧格式
break;
default:
strcpy(List.Protocol,"未知IP包");
strcpy(List.sIP,"----------");
strcpy(List.dIP,"----------");
strcpy(List.sPort,"--");
strcpy(List.dPort,"--");
mac_string=eth->ether_dhost;
sprintf(List.dMac,"%02X:%02X:%02X:%02X:%02X:%02X",*mac_string,*(mac_string+1),*(mac_string+2),*(mac_string+3),*(mac_string+4),*(mac_string+5));
break;
default:
strcpy(List.Protocol,"未知以太包");
strcpy(List.sIP,"----------");
strcpy(List.dIP,"----------");
strcpy(List.sPort,"--");

【网络程序设计】在vsMFC下开发基于winpcap的网络嗅探器(IP,TCP,UDP)

【网络程序设计】在vsMFC下开发基于winpcap的网络嗅探器(IP,TCP,UDP)

课程设计Ⅰ设计报告题目:基于Winpcap的网络嗅探器的实现学号:姓名:学院:专业班级:指导教师:设计时间:目录1 概述 (3)1.1课程设计的目的 (3)1.2设计任务与要求 (3)1.3开发环境 (3)2系统设计的基本概念与原理 (3)2.1IP协议基本知识 (3)2.2TCP协议基本知识 (6)2.3UDP协议基本知识 (9)2.4 WINPCAP基本知识 (9)2.5 WINPCAP基本原理 (14)2.6MFC编程框架 (16)3 基于WINPCAP的单文档网络嗅探器的设计与分析 (19)3.1系统设计实现的基本原理与过程 (19)3.2系统功能设计 (21)3.3系统架构设计 (22)3.4子系统与模块设计 (23)3.4.1网络嗅探器设置模块 (23)3.4.2网络数据包的捕获模块 (23)3.4.3解析和显示模块 (23)4 系统详细设计与实现 (24)4.1数据结构的设计 (24)4.2全局变量与函数的声明 (25)4.3嗅探器界面设计 (25)4.4嗅探器捕获模块的设计与实现 (26)4.5网络数据包捕获模块的设计与实现 (31)4.6解析和显示模块的设计与实现 (32)4.6.1列表视图初始化设置 (32)4.6.2从读取离线数据包并在列表视图中显示 (33)4.6.2响应用户鼠标消息,解析对应行的数据包信息。

(36)5 系统调试与运行 (38)5.1 WINPCAP函数库的安装 (38)5.2 SNIFFER网络嗅探器的测试与运行 (38)6 课程设计总结 (39)参考文献 (40)1 概述1.1 课程设计的目的目的:设计一个GUI程序,实现IP、TCP、UDP数据包的捕获和解析。

通过编程了解各类数据报的结构,掌握网络编程的基本原理和方法。

1.2 设计任务与要求本课程设计的基本内容是捕获IP,TCP,UDP数据包,通过解析数据包,理解和掌握各类数据包的结构(1)设计一个GUI程序,完成局域网数据包的捕获和IP、TCP、UDP数据包的解析;(2)捕获几个网络数据报,给出实例并分析各数据包各字段的含义;(3)说明基于Winpcap编程的基本原理、程序的总体框架,绘制每个函数的详细设计流程图。

winpcap 编程

winpcap 编程

[中原工学院] [TCP/IP作业]——WinPcap编程学生:郑仙玉学号:201300824401 班级:网络13卓越目录3.WinPcap编程 (3)3.1获取网络适配器信息 (3)3.2 抓包 (22)创建一个使用wpcap.dll的应用程序 (22)3.3 包过滤 (27)3.4 数据包统计 (29)3.WinPcap编程3.1获取网络适配器信息任务目标:获取本机网络适配器的信息任务描述:(1)安装配置WinPcap开发环境(2)获取本机所有网络适配器,并显示每个适配器的名称、描述、是否Loopback、地址家族、地址家族名称、IP地址、子网掩码、广播地址。

任务提示:参考WinPcap开发包下“Examples-pcap”目录中的例程。

实验内容:(1).安装配置WinPcap开发环境:1.下载并安装最新版本的WinPcap安装包。

地址是:/install/default.htm2.下载最新版本的WinPcap开发包。

地址是:/devel.htm3.安装WinPcap,可以复制步骤1的链接到浏览器上进行下载,并进行安装。

安装步骤如下:1.点击1或2进行下载、安装2.点next3.选i agree4.点install5.选finish,然后就行了6.解压开发包到你想要的位置,我把自己的开发包解压到了E盘的winpcap文件夹下,如下图所示:其中docs目录中包含了WinPcap相关文档,Examples-pcap和Examples-remote都是使用WinPcap的一些例子程序,Include目录包含的是头文件,Lib目录中包含的是库文件。

4.双击打开老师给的程序ServerClientDemo5.双击ServerClientDemo的运行程序在2013运行环境下:6.(1)在菜单栏中选中视图(2)在下拉窗口选中其他窗口(3)选中属性管理器,如下图:7.双击Debug | Win32下的“er“,或者右键单击->Properties。

实验一基于WinPcap的网络嗅探器设计

实验一基于WinPcap的网络嗅探器设计

实验一、基于WinPcap的网络嗅探器设计1、目的与要求◆掌握基于WinPcap的网络编程模式。

◆理解并能应用WinPcap设计并实现网络数据包的捕获、解析。

2、实验设备与环境连网PC机(至少一台)。

计算机硬件要求:Intel Pentium5 处理器、256MB以上内存,Ethernet网卡,网线若干。

计算机软件要求:MS Windows 9x/2000/XP操作系统,TCP/IP协议,WinPcap430,Visual c++6.0/.net系统。

3、实验内容与步骤:在程序设计之前,请参照提供的软件安装WinPcap。

之后,按照如下步骤操作:步骤1:在VC++ 6.0下创建一个DOS命令行程序,工程名:201200824302步骤2:打开main()函数,在主程序中增加如下头文件和常量定义:头文件添加如下:#include <pcap.h>#define LINE_LEN 16代码内容如下:pcap_if_t *alldevs, *d;pcap_t *fp;u_int inum, i=0;char errbuf[PCAP_ERRBUF_SIZE];int res;struct pcap_pkthdr *header;const u_char *pkt_data;printf("pktdump_ex: prints the packets of the network using WinPcap.\n");printf("Usage: pktdump_ex [-s source]\n\n"" Examples:\n"“pktdump_ex -s file.acp\n""pktdump_ex \\Device\\NPF_{C8736017-F3C3-4373-94AC-9A34B7DAD998}\n\n"); if(argc < 3){printf("\nNo adapter selected: printing the device list:\n");// The user didn't provide a packet source: Retrieve the local device listif(pcap_findalldevs(&alldevs, errbuf) == -1){fprintf(stderr,"Error in pcap_findalldevs_ex: %s\n", errbuf);exit(1);}/* Print the list */for(d=alldevs; d; d=d->next){printf("%d. %s\n ", ++i, d->name);if (d->description)printf(" (%s)\n", d->description);elseprintf(" (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", &inum);if (inum < 1 || inum > i){printf("\nInterface number out of range.\n");/* Free the device list */pcap_freealldevs(alldevs);return -1;}/* Jump to the selected adapter */if ((fp = pcap_open_live(argv[2], // name of the device65536, // portion of the packet to capture. // 65536 grants that the whole packet will be captured on all the MACs. // promiscuous mode (nonzero means promiscuous)1000, // read timeouerrbuf // error buffer)) == NULL){fprintf(stderr,"\nError opening adapter\n");return -1;}}/* Read the packets */while((res = pcap_next_ex( fp, &header, &pkt_data)) >= 0){if(res == 0)/* Timeout elapsed */continue;/* print pkt timestamp and pkt len */printf("%ld:%ld (%ld)\n", header->_sec, header->_usec, header->len);/* Print the packet */for (i=1; (i < header->caplen + 1 ) ; i++){printf("%.2x ", pkt_data[i-1]);if ( (i % LINE_LEN) == 0) printf("\n");}printf("\n\n"); }if(res == -1){printf("Error reading the packets: %s\n", pcap_geterr(fp));return -1;}pcap_close(fp);return 0;步骤3:为编译器指定包含文件和库文件搜索目录。

基于Winpcap的网口测试软件开发

基于Winpcap的网口测试软件开发

基于Winpcap的网口测试软件开发摘要:网口通信常用于通信系统间收发数据,由于系统间的差异,需要在链路层进行数据的发送和接收。

本文利用Winpcap在Windows系统上开发了一个在链路层进行通信的软件,使用MFC完成界面设计,使用多线程完成同时收发的功能,具有一定的工程实用意义。

关键词:网口通信Winpcap MFC 多线程1.引言网口通信常用于各种通信系统间收发数据。

Windows系统中提供了基于TCP/IP协议的网口通信API,利用API能够收发IP数据包。

但是在Windows系统与其他系统进行网口通信时,无法通过IP进行数据的收发,需要对链路层数据进行处理。

因此,在Windows系统下开发一种能于链路层进行数据收发的软件具有重要意义。

本文在Microsoft Visual Studio 2010环境下使用MFC开发了一种基于Winpcap的网口测试软件,能够在Windows下与其他系统进行网口通信,具有一定的工程实用价值。

1.Winpcap技术1.WinpcapWinpcap是应用于Windows平台下对网络数据包捕获功能的一个开源、公共、免费的网络访问系统。

其为Windows环境下应用程序提供了直接访问网络底层的能力,常用于Windows系统下的直接网络编程[1]。

Winpcap由内核态下的NPFDevice Driver、用户态下的动态链接库peaket.dll和Wpcap.dll三部分组成,其结构如图 1所示。

图1Winpcap结构Winpcap通过3个模块提供以下功能:1)捕获原始数据包,包括在共享网络上各主机发送、接收以及相互之间交换数据包;2)在数据包发往应用程序前,按照自定义的规则将某些特殊数据包过滤掉;3)在网络上发送原始数据包;4)收集网络通信过程中的统计信息。

1.2.数据接收和发送由于本文需要在链路层进行网口数据的收发,因此本文使用Winpcap中的1、3功能,具体实现方法如下:1)使用Winpcap中pcap_findalldevs_ex函数查找计算机中所有网卡;2)使用Winpcap中pcap_open函数打开需要使用的网卡;3)使用pcap_sendpacket和pcap_next_ex函数分别实现网口的数据发送及数据接收功能。

WinPcap开发(一):零基础入门

WinPcap开发(一):零基础入门

WinPcap开发〔一〕:零基础入门*原创追影人0×00 前言网络编程在网络安全方面具有举足轻重的作用,如何快捷高效的监听、分析、构造网络流量,成为很多安全从业者需要解决的重点问题.而winpcap这一免费开源项目恰好可以为win32应用程序提供访问网络底层的能力,所以其成为了相关网络编程的首选开发工具.0×01 winpcap是什么?winpcap<windows packet capture>是windows平台下一个免费的网络访问系统,可用于windows系统下的网络编程.著名的wireshark便是基于winpcap开发的,大家在安装wireshark中可以看到winpcap驱动程序的安装过程.有关winpcap的介绍网络上很多,百科里面介绍的也很详细,我就不再copy了.需要注意的一点是,winpcap并不是一个简单的library,而是一个针对Win32平台上的抓包和网络分析的一个架构,它包括一个核心态的包过滤器,一个底层的动态库〔packe t.dll〕和一个高层的不依赖于系统的库〔wpcap.dll〕.所以它只能"嗅探"到物理线路上的数据包,而不具备拦截的能力,因此不适用于个人防火墙等项目.0×02 你需要准备些什么?本系列文章主要带大家认识和了解如何利用winpcap网络编程技术进行网络的协议分析、流量统计与网络探测扫描等,这里我们并不会去深硬的解读相关源代码,而是以轻松的方式结合实验来对相关原理进行深入理解.在本系列文章中,笔者从简到难,简明介绍winpcap架构原理、相关环境搭建与快速编写核心代码.但是在开始前,读者需要有一些相关基础:了解网络协议相关基础知识,掌握一门winpcap开发库支持的编程语言,自己能动手实践编写一些例子.Winpcap提供的开发接口原生是c语言的,不过热心肠的程序猿们已经为其他语言的使用提供了封装,比如java、.net、p ython,好像连易语言都有.本系列文章将使用c语言来进行各种实验,有兴趣的读者可以将其转换成自己熟悉的语言来动手实践.0×03 你能学到什么?有关winpcap开发的文章在网上很容易找到,但是更多的都是对于代码的讲解,笔者在本文尽量系统性的从原理层面结合各个应用场景来介绍相关知识:1. Winpcap获取网卡基本信息与收发数据包2. 存活主机探测3. 端口扫描4. Arp欺骗5. 中间人攻击的简单实现6. 流量统计与分析0×04 知识补充进行下面的介绍前,我们需要了解几个名词的关系.winpcap<windows packet capture>是windows平台下一个免费的网络访问系统,可用于windows系统下的网络编程.linux 平台下对应的开发包是libpcap. Wireshark是基于winpcap处理网络驱动层.Wpdpack是winpcap的开发包,提供开发相关程序的接口.0×05 环境准备首先根据你所选择的开发语言选择对应的编译器,笔者使用c语言,利用VS2012进行相关开发.安装好编译器后,进行相关配置.下载wpdpack点击这里初学者可以选择里面的Examples进行编译,可以看到找不到头文件,与相关库.这是因为wpdpack中的相关库还没有引入到编译环境中将wpdpack包中的Include和lib文件夹中的文件添加到VS的相关目录下即可编译通过.将编译后的程序进行运行则出现以下错误.这是由于运行时缺乏动态库导致,最简单的方法是直接下载并安装winpcap驱动程序下载如果你觉得这样子很麻烦,也可以采用简易方法.程序在运行时只需要winpcap在system32下面释放的wpcap.dll和packet.dll,还有driver下面的npf.sys,所以不需要完整安装winp cap,而选择只复制以上三个文件到对应目录中即可.本节笔者将采用著名的Arpspoof源码进行相关讲解,源码下载地址0×06 枚举可用网络适配器资源在使用winpcap进行收发数据包时,需指定对应的网卡,所以有必要列出计算机上所有可用的网络适配资源.列取网卡信息的核心代码:科普Tips:"网卡"是神马?计算机与外界局域网的连接是通过主机箱内插入一块网络接口板〔或者是在笔记本电脑中插入一块PCMCIA卡〕.网络接口板又称为通信适配器或网络适配器〔network adapter〕或网络接口卡NIC〔Network Interface Card〕,但是更多的人愿意使用更为简单的名称"网卡".利用上面的程序,我们可以查看计算机上可利用的所有网卡资源,以便选择相应的网卡资源进行相关操作.为了便于观察,我们在VMware虚拟机中进行,首先在对应的虚拟机设置中增加硬件选项中添加多块网卡,然后配置相应的IP,运行程序,可以得到对应网卡的名称描述、IP 地址、MAC地址等.0×07 如何构造和发送数据包上一步我们列出了所有的可用网卡资源,在发送数据包前,需要打开对应的网卡来进行发送数据包的操作.这里使用的函数是pcap_open_live:函数名称:pcap_t *pcap_open_live<char *device, intsnaplen, intpromisc, i ntto_ms, char *ebuf>函数功能:获得用于捕获网络数据包的数据包捕获描述字.参数说明:device参数为指定打开的网络设备名.snaplen参数定义捕获数据的最大字节数.promisc指定是否将网络接口置于混杂模式.to_ms参数指定超时时间〔毫秒〕.ebuf参数则仅在pcap_open_live<>函数出错返回NULL时用于传递错误消息.返回值:打开的网卡句柄Arpspoof中将网卡的打开操作进行了如下封装,调用时直接输入网卡序号即可,程序会对参数2、3、4进行初始化设置:使用范例:在获取到网卡句柄并打开后,发送数据包就很容易了ucFrame是封装好的数据包,ucFrameLen为数据包的长度.下面我们封装一个例子,使用上述代码发送ARP请求包,用于查询某IP对应的MAC地址. ARP协议格式关键代码启动wireshark进行监听,运行程序,我们可以看到如下结果,程序发出了一个ARP广播包,用于查询192.168.0.2的主机MAC,并且目标机在收到该查询包后,进行了回复,将自己的MAC 地址告诉了查询发起的机器.0×08如何监听分析数据包在监听数据包时,使用的关键函数为pcap_loop函数名称:intpcap_loop<pcap_t * p,intt, pcap_handler callback, uchar * u ser>;参数说明:p 是由pcap_open_live<>返回的所打开的网卡的指针;t用于设置所捕获数据包的个数;callback 是回调函数,其原型为pcap_callback<u_char* argument,conststructp cap_pkthdr* packet_header,constu_char* packet_content>;user值一般为NULL结合上面的代码,我们在获得并打开网卡句柄adhandle,使用下面的代码并可捕获数据包程序在每一个数据包到来时,都会自动调用回调函数packet_handler来对数据包进行处理,其第三个参数便是数据包内容.上图为运行结果图,可以看到每一个数据包的时间戳信息,和长度信息.值得注意的是,原始套接字也可以完成数据包的发送和监听工作,但是与winpcap相比,在监听数据包方面是有区别的,由于winpcap更接近与底层,所以在混杂模式下,凡是到达网卡的数据包不管目的地址是否为自身主机,winpcap均能接收到;而原始套接字只能接收到投送给自己的数据包.0×09 总结与预告本章中我们简单认识了winpcap的相关基础知识,学习了发送数据包和接收数据包的方法,其实不难发现,发送和接收数据包的过程都比较简单,只需要调用相关库函数即可,而更多的精力在数据包的组织和拆分上,同时在一些场景中,算法的使用也较为重要.在接下来的章节中,我们会看到下面的内容:1.扫描存活主机2.Arp欺骗的实现与应用3.端口扫描4.流量监控与统计分析。

上机:基于WinPcap的网络嗅探器设计与实现

上机:基于WinPcap的网络嗅探器设计与实现
ﻩﻩreturn -1;

ﻩﻩ
ﻩﻩprintf("Enterthe interface number(1-%d):",i);
ﻩscanf("%d",&inum);

ﻩﻩif (inum <1|| inum>i)
ﻩ{
ﻩprintf("\nInterfacenumber outofrange.\n");
ﻩ{
fprintf(stderr,"Error inpcap_findalldevs_ex: %s\n",errbuf);
ﻩﻩexit(1);
ﻩﻩ}

ﻩ/* Printthe list*/
for(d=alldevs;d;d=d->next)
ﻩ{
printf("%d.%s\n",++i,d->name);
ﻩ/*Free thedevicelist*/
ﻩﻩpcap_freealldevs(alldevs);
ﻩﻩreturn -1;
}

/* Jumptothe selectedadapter*/
ﻩfor(d=alldevs, i=0;i<inum-1 ;d=d->next, i++);
ﻩ/*Opentheadapter */
ﻩﻩﻩreturn-1;
ﻩ}
ﻩ}
else
ﻩ{
ﻩﻩ/*Do notcheck fortheswitchtype ('-s') */
ﻩif((fp=pcap_open_live(argv[2],// name ofthe device
ﻩﻩ65536,ﻩﻩﻩﻩﻩ//portion of the packet tocapture.

用VC_实现基于Winpcap的网络数据包捕获与分析.

用VC_实现基于Winpcap的网络数据包捕获与分析.
1.2GA-BP算法
GA从本质上是一种不依赖具体问题
算法与语言
106
文献标识Байду номын сангаас:A
文章编号:1672-7800(200703-0104-02
图1
WinPcap基本体系结构
算法与语言
104
dapterNames((char*AdapterName,&Ada-
pterLength函数值为TRUE则可以得到网络适配器列表及描述,否则返回为FALSE,意为查找失败。
(2打开适配器,如果调用成功返回一个类型为lpadapter指针的包捕获描述字lpadapter=PacketOpenAdapter(Adapter-List。
结构描述_IP
typedef struct_IP{
union{BYTE Version;//版本
BYTE HdrLen;//IHL
};
BYTE ServiceType;//服务类型
WORD TotalLen;//总长
WORD ID;//标识
union{WORD Flags;//标志
WORD FragOff;//分段偏移
PacketSetBuff(lpadapter,500*1024
//设置捕获数据报的内核级缓冲区大小
PacketInitPacket(pthis->lppacketr, (char*recvbuf,sizeof(recvbuf
//初始化一个LPACKET结构
PacketReceivePacket(pthis->lpada-pter,pthis->lppacketr,TRUE
[6]周正军.网络入侵检测系统的设计与实现
[M ].北京:电子工业出版社,2002.[7]唐正春.精通Visual C ++6.0[M ].北京:电子

winpcap计算机网络实验

winpcap计算机网络实验

实验一 wireshark抓包工具使用[实验目的]学习wireshark抓包工具的使用了解wireshark抓包工具的功能通过学习,进一步理解协议及网络体系结构思想[实验原理]Wireshark是网络包分析工具。

网络包分析工具的主要作用是尝试捕获网络包,并尝试显示包的尽可能详细的情况。

主要应用:网络管理员用来解决网络问题网络安全工程师用来检测安全隐患开发人员用来测试协议执行情况用来学习网络协议[实验内容]下载WIRESHARK,学习工具的使用和功能。

[习题与思考题]1、网络工程师能通过WIRESHARK做哪些工作?2书名实验二 WINPCWP编程[实验目的]了解WINPCAP的架构学习WINPCAP编程[实验原理]WinPcap是一个基于Win32平台的,用于捕获网络数据包并进行分析的开源库.大多数网络应用程序通过被广泛使用的操作系统元件来访问网络,比如sockets。

这是一种简单的实现方式,因为操作系统已经妥善处理了底层具体实现细节(比如协议处理,封装数据包等等),并且提供了一个与读写文件类似的,令人熟悉的接口。

然而,有些时候,这种“简单的方式”并不能满足任务的需求,因为有些应用程序需要直接访问网络中的数据包。

也就是说,那些应用程序需要访问原始数据包,即没有被操作系统利用网络协议处理过的数据包。

WinPcap产生的目的,就是为Win32应用程序提供这种访问方式;WinPcap提供了以下功能1.捕获原始数据包,无论它是发往某台机器的,还是在其他设备(共享媒介)上进行交换的2.在数据包发送给某应用程序前,根据用户指定的规则过滤数据包3.将原始数据包通过网络发送出去4.收集并统计网络流量信息章名 3以上这些功能需要借助安装在Win32内核中的网络设备驱动程序才能实现,再加上几个动态链接库DLL。

所有这些功能都能通过一个强大的编程接口来表现出来,易于开发,并能在不同的操作系统上使用。

这本手册的主要目标是在一些程序范例的帮助下,叙述这些编程接口的使用。

Windows网络编程实验六 基于WinPcap的ARP欺骗实验

Windows网络编程实验六  基于WinPcap的ARP欺骗实验

网络程序设计实验报告实验名称:基于WinPcap的ARP欺骗实验_实验类型:_______设计型实验__ ____指导教师:__ __ ___专业班级:_____ _______________姓名:_____ _ _____________学号:_______ _____________电子邮件:___ _________实验地点:_____ ______________实验日期:年月日实验成绩:__________________________一、实验目的掌握WinPcaP的安装和配置;掌握ARP协议工作原理和格式;掌握WinPcap发包程序的编写;掌握防范ARP地址欺骗的方法和措施;了解常用抓包软件,Wireshark、Sniffer Pro等网络包分析软件的使用二、实验设计1.背景知识ARP原理ARP协议:ARP,全称Address Resolution Protocol,中文名为地址解析协议,它工作在数据链路层,在本层和硬件接口联系,同时对上层提供服务。

IP数据包常通过以太网发送,以太网设备并不识别32位IP地址,它们是以48位以太网地址传输以太网数据包。

因此,必须把IP目的地址转换成以太网目的地址。

这个过程称为地址解析,用于将IP地址解析成硬件地址的协议就被称为地址解析协议(ARP协议)。

即ARP协议用于将网络中的IP地址解析为的硬件地址(MAC地址),以保证通信的顺利进行,这个过程是动态、自动完成且对用户是透明的。

(1).ARP报头结构ARP报头结构,如上图所示。

硬件类型字段:指明了发送方想知道的硬件接口类型,以太网的值为1;协议类型字段:指明了发送方提供的高层协议类型,IP为0800(16进制);硬件地址长度和协议长度:指明了硬件地址和高层协议地址的长度,这样ARP报文就可以在任意硬件和任意协议的网络中使用;操作字段:用来表示这个报文的类型,ARP请求为1,ARP响应为2,RARP请求为3,RARP响应为4;发送方的硬件地址(0-3字节):源主机硬件地址的前3个字节;发送方的硬件地址(4-5字节):源主机硬件地址的后3个字节;发送方IP(0-1字节):源主机硬件地址的前2个字节;发送方IP(2-3字节):源主机硬件地址的后2个字节;目的硬件地址(0-1字节):目的主机硬件地址的前2个字节;目的硬件地址(2-5字节):目的主机硬件地址的后4个字节;目的IP(0-3字节):目的主机的IP地址。

基于Winpcap的网络包捕获和分析_通信工程

基于Winpcap的网络包捕获和分析_通信工程

基于Winpcap的网络包捕获和分析_通信工程Winpcap是一种Windows平台下的网络包捕获库,它能够拦截网络传输的数据包,分析其内容并提供给程序使用。

在通信工程领域,Winpcap常用于网络协议分析、网络安全检测等方面。

Winpcap的工作原理是通过抓取操作系统内核与网卡之间的输入/输出数据包,从而捕获并分析网络包。

Winpcap将网络接口抽象成一个数据源(即抓包器),并提供一系列API供应用程序进行操作。

这些API包括:1. pcap_open_live():打开网络接口并设置过滤器。

2. pcap_setfilter():设置抓包过滤规则。

3. pcap_next_ex():从网络接口中捕获下一个数据包。

4. pcap_sendpacket():发送数据包到网络。

5. pcap_stats():返回接口的统计信息。

通过调用上述API,可以在应用程序中达到获取、分析网络包的目的,从而实现网络协议的协议分析、网络安全检测等通信工程任务。

在使用Winpcap时需要注意,由于其需要操作系统内核与网卡之间的数据包,因此在使用时需要获得管理员权限。

在基于Winpcap的网络包捕获和分析中,通常需要进行以下步骤:1. 打开网络接口并设置过滤器,过滤掉不必要的数据包。

2. 捕获数据包。

3. 解析数据包的协议头,分离出数据部分。

4. 对数据部分进行处理,如提取HTTP请求、检测网络攻击等。

5. 将处理结果保存或发送到其他模块进行处理。

Winpcap的优势在于其能够让用户获得更加细致的网络数据,通过协议分析和安全检测等手段更好地保障网络安全。

同时,由于其跨平台特性,可应用于多种不同的通信工程场景中。

winpcap计算机网络实验

winpcap计算机网络实验

实验一 wireshark抓包工具使用[实验目的]学习wireshark抓包工具的使用了解wireshark抓包工具的功能通过学习,进一步理解协议及网络体系结构思想[实验原理]Wireshark是网络包分析工具。

网络包分析工具的主要作用是尝试捕获网络包,并尝试显示包的尽可能详细的情况。

主要应用:网络管理员用来解决网络问题网络安全工程师用来检测安全隐患开发人员用来测试协议执行情况用来学习网络协议[实验内容]下载WIRESHARK,学习工具的使用和功能。

[习题与思考题]1、网络工程师能通过WIRESHARK做哪些工作?书名2实验二 WINPCWP编程[实验目的]了解WINPCAP的架构学习WINPCAP编程[实验原理]WinPcap是一个基于Win32平台的,用于捕获网络数据包并进行分析的开源库.大多数网络应用程序通过被广泛使用的操作系统元件来访问网络,比如sockets。

这是一种简单的实现方式,因为操作系统已经妥善处理了底层具体实现细节(比如协议处理,封装数据包等等),并且提供了一个与读写文件类似的,令人熟悉的接口。

然而,有些时候,这种“简单的方式”并不能满足任务的需求,因为有些应用程序需要直接访问网络中的数据包。

也就是说,那些应用程序需要访问原始数据包,即没有被操作系统利用网络协议处理过的数据包。

WinPcap产生的目的,就是为Win32应用程序提供这种访问方式;WinPcap提供了以下功能1.捕获原始数据包,无论它是发往某台机器的,还是在其他设备(共享媒介)上进行交换的2.在数据包发送给某应用程序前,根据用户指定的规则过滤数据包3.将原始数据包通过网络发送出去4.收集并统计网络流量信息章名3以上这些功能需要借助安装在Win32内核中的网络设备驱动程序才能实现,再加上几个动态链接库DLL。

所有这些功能都能通过一个强大的编程接口来表现出来,易于开发,并能在不同的操作系统上使用。

这本手册的主要目标是在一些程序范例的帮助下,叙述这些编程接口的使用。

基于WinPcap的程序开发

基于WinPcap的程序开发

基于WinPcap的程序开发一、WinPcap介绍1、WinPcap简介大多数Unix操作系统提供了一套允许应用程序直接与网络相互联系的系统调用。

这些指令对于那些需要通过网络捕获连续的包数据而不用内核进行过多的干预的包捕获应用程序非常有用。

在Windows 环境下,WinPcap就是这样一类工具。

WinPcap是一个在Windows操作系统下的免费、公开的用于直接访问网络的开发工具包(编程API)。

大多数Windows网络应用程序都是通过Winsock API(Windows套接口)这类高级编程接口访问网络的。

这种方法允许在网络上进行简单的数据传送,因为操作系统的TCP/IP协议栈实现软件会处理底层细节(协议操作、流程重组等等),并提供一个类似于读写文件的函数接口。

然而,有时候“简便方法”并不能满足实际需要。

有些程序希望绕过TCP/IP协议栈,直接处理底层网络中的通信数据,它们需要对网络进行底层进行直接访问,即在没有类似协议栈(TCP/IP协议栈)的实体介入条件下对网络进行原始访问。

基于Winsock API编程,应用程序是通过调用操作系统提供的编程接口访问TCP/IP协议栈实现网络通信的。

基于WinPcap编程,网络程序实际上是绕开操作系统的TCP/IP协议栈直接通过底层网络发送数据,因此,网络程序可以实现一些更低级、更灵活的功能。

2、WinPcap的目的和用途开发WinPcap的目的是为Win32应用程序提供一种直接访问底层网络的能力。

通过WinPcap,网络应用程序可以实现如下功能:1)捕获原始数据包,包括发送到本主机以及在共享网络上的数据包。

2)数据过滤。

在将数据包发送给应用程序之前按照用户的规定对捕获的数据包进行过滤。

3)发送原始数据包。

向网络发送原始数据包。

4)数据包统计。

对网络通信进行统计。

上述功能都通过一个设备驱动(这个驱动程序安装在Win32内核的网络部分)和一组动态连接库(DLL)获得。

基于Winpcap 编程实现抓包实验

基于Winpcap 编程实现抓包实验

上海电力学院计算机网络安全(1)课程实验报告实验名称:winpcap编程实验基于Winpcap 编程实现抓包实验一. 本设计要达到的目标基于winpcap编程实现对网络数据的捕获,并分析数据类型,对于IP,ICMP,ARP,UDP 等,能够自动识别其协议类型并分析帧的构成。

二.实现步骤(1)需要通过资料来了解winpcap抓包的工作原理,熟悉其运行过程Winpcap的内部结构Wincap有三部分组成:一个数据包监听设备驱动程序,一个低级的动态连接库和一个高级的静态连接库。

底层动态链接库运行在用户层,它将应用程序和数据包监听设备驱动程序隔离开来,使得应用程序可以不加修改地在不同的WINDOWS系统上运行。

高级的静态链接库和应用程序编译在一起,它使用低级动态链接库提供的服务,向应用程序提供完善的监听接口。

抓包是WinPcap的基本功能,也是NPF最重要的操作。

在抓包的时候,驱动(例如NIC Driver)使用一个网络接口监视着数据包,并将这些数据包完整无缺地投递给用户级应用程序。

(2)进一步了解winpcap编程所需要的编译环境,下载WpdPack,了解编译环境所需要的库文件.在编译时需要把wpdpack中的include与lib添加进vc的库文件里。

(3)明确整个编程的步骤与具体函数。

刚开始要定义,在主函数中获取设备接口信息,获得网络地址与掩码地址,打开网络接口,还要设置过滤规则。

使用loop函数来回调循环捕获数据包,以便一层一层解析。

(4)还要定义几个以太网,ARP,IP,UDP,TCP,ICMP协议的格式。

需要注意在存储空间中,在存储空间中才能更好的逐层分析,不然很容易出错(5)定义分析协议的函数,定义方式与回调函数相同. 常用的函数有:用于获取本机设备列表的pcap_findalldevs_ex函数用于打开设备的pcap_open函数,可以指定为混杂模式打开用于编译数据包过滤器的pcap_compile 函数用于设置数据包过滤器的pcap_setfilter 函数用于从设备读取数据包的pcap_netx_ex 函数用于关闭设备的pcap_close 函数(参数为pcap_open 返回值)用于释放设备列表的pcap_freealldevs 函数(对应pcap_findalldevs_ex)三.系统流程图主函数以太网协议分析函数分析ARP协议函数分析Ip协议函数分析ICMP协议函数判断下层函数分析TCP协议函数分析UDP协议函数16进制数据四.关键代码及其分析主函数void main(){pcap_t *pcap_handle; /* Winpcap句柄 */char error_content[PCAP_ERRBUF_SIZE]; /* 存储错误信息 */char *net_interface; /* 网络接口 */bpf_program bpf_filter; /* BPF过滤规则 */char bpf_filter_string[] = ""; /* 过滤规则字符串 */ bpf_u_int32 net_mask; /* 掩码 */bpf_u_int32 net_ip; /* 网路地址 */net_interface = pcap_lookupdev(error_content); /* 获得可用的网络接口 */ pcap_lookupnet(net_interface, &net_ip, &net_mask, error_content);/* 获得网络地址和掩码地址 */pcap_handle = pcap_open_live(net_interface, BUFSIZ, 1, 1, error_content);/* 打开网路接口 */pcap_compile(pcap_handle, &bpf_filter, bpf_filter_string, 0, net_ip); /*编译BPF过滤规则 */pcap_setfilter(pcap_handle, &bpf_filter); /* 设置过滤规则 */对IP协议的定义class ip_header{ public:#if defined(WORDS_BIGENDIAN)u_int8_t ip_version: 4, /* 版本 */ip_header_length: 4; /* 首部长度 */#elseu_int8_t ip_header_length: 4, ip_version: 4;#endifu_int8_t ip_tos; /* 服务质量 */u_int16_t ip_length; /* 长度 */u_int16_t ip_id; /* 标识 */u_int16_t ip_off; /* 偏移 */u_int8_t ip_ttl; /* 生存时间 */u_int8_t ip_protocol; /* 协议类型 */u_int16_t ip_checksum; /* 校验和 */in_addr ip_souce_address; /* 源IP地址 */in_addr ip_destination_address; /* 目的IP地址 */pcap_loop(pcap_handle, n, ethernet_protocol_packet_callback, NULL); /* 注册回调函数,循环捕获网络数据包,利用回调函数来处理每个数据包 */分析UDP协议的函数代码void udp_protocol_packet_callback(u_char *argument, const pcap_pkthdr *packet_header, const u_char *packet_content){class udp_header *udp_protocol; /* UDP协议变量 */u_short source_port; /* 源端口 */u_short destination_port; /* 目的端口号 */u_short length; //长度udp_protocol = (class udp_header*)(packet_content + 14+20);/* 获得UDP协议内容 */source_port = ntohs(udp_protocol->udp_source_port); /* 获得源端口 */ destination_port = ntohs(udp_protocol->udp_destination_port); /* 获得目的端口 */length = ntohs(udp_protocol->udp_length); /* 获得长度 */cout<<"---------- UDP协议 ----------"<<endl;cout<<"源端口号:"<<dec<<source_port<<endl;cout<<"目的端口号:"<<dec<<destination_port<<endl;switch (destination_port){case 138:cout<<"上层协议为NETBIOS数据报服务"<<endl;break;case 137:cout<<"上层协议为NETBIOS名字服务"<<endl;break;case 139:cout<<"上层协议为NETBIOS会话服务"<<endl;break;case 53:cout<<"上层协议为域名服务"<<endl;break;default:break;}cout<<"长度:"<<length<<endl;cout<<"校验和:"<<setw(4)<<setfill('0')<<hex<<ntohs(udp_protocol->udp_checksum)<<endl;}五.参考文献(1) Winpcap中文文档(2) 网络资料/view/d64047d676eeaeaad1f330c7.html?from=search/winpcap-sniffer.html完整源程序#include "pcap.h"#include <iostream>#include <iomanip>#include<string>using namespace std;/*以下是以太网协议格式的定义*/class ether_header{public:u_int8_t ether_dhost[6]; /* 目的以太网地址 */u_int8_t ether_shost[6]; /* 源以太网地址 */u_int16_t ether_type; /* 以太网类型 */};/* 下面是ARP协议格式的定义*/class arp_header{public:u_int16_t arp_hardware_type; /* 硬件类型 */u_int16_t arp_protocol_type; /* 协议类型 */u_int8_t arp_hardware_length; /* 硬件地址长度 */u_int8_t arp_protocol_length; /* 协议地址长度 */u_int16_t arp_operation_code; /* 操作码 */u_int8_t arp_source_ethernet_address[6]; /* 源以太网地址 */u_int8_t arp_source_ip_address[4]; /* 源IP地址 */u_int8_t arp_destination_ethernet_address[6]; /* 目的以太网地址 */ u_int8_t arp_destination_ip_address[4]; /* 目的IP地址 */};/*下面是IP协议格式的定义 */class ip_header{ public:#if defined(WORDS_BIGENDIAN)u_int8_t ip_version: 4, /* 版本 */ip_header_length: 4; /* 首部长度 */#elseu_int8_t ip_header_length: 4, ip_version: 4;#endifu_int8_t ip_tos; /* 服务质量 */u_int16_t ip_length; /* 长度 */u_int16_t ip_id; /* 标识 */u_int16_t ip_off; /* 偏移 */u_int8_t ip_ttl; /* 生存时间 */u_int8_t ip_protocol; /* 协议类型 */u_int16_t ip_checksum; /* 校验和 */in_addr ip_souce_address; /* 源IP地址 */in_addr ip_destination_address; /* 目的IP地址 */};/*下面是UDP协议格式定义*/class udp_header{ public:u_int16_t udp_source_port; /* 源端口号 */u_int16_t udp_destination_port; /* 目的端口号 */u_int16_t udp_length; /* 长度 */u_int16_t udp_checksum; /* 校验和 */};/* 下面是TCP协议格式的定义*/class tcp_header{ public:u_int16_t tcp_source_port; /* 源端口号 */u_int16_t tcp_destination_port; /* 目的端口号 */u_int32_t tcp_sequence_lliiuuwweennttaaoo; /* 序列号 */u_int32_t tcp_acknowledgement; /* 确认序列号 */#ifdef WORDS_BIGENDIANu_int8_t tcp_offset: 4, /* 偏移 */tcp_reserved: 4; /* 未用 */#elseu_int8_t tcp_reserved: 4, /* 未用 */tcp_offset: 4; /* 偏移 */#endifu_int8_t tcp_flags; /* 标记 */u_int16_t tcp_windows; /* 窗口大小 */u_int16_t tcp_checksum; /* 校验和 */u_int16_t tcp_urgent_pointer; /* 紧急指针 */};/* 下面是ICMP协议格式的定义*/class icmp_header{ public:u_int8_t icmp_type; /* ICMP类型 */u_int8_t icmp_code; /* ICMP代码 */u_int16_t icmp_checksum; /* 校验和 */u_int16_t icmp_id; /* 标识符 */u_int16_t icmp_sequence; /* 序列码 */};/* 下面是分析TCP协议的函数,其定义方式与回调函数相同 */void tcp_protocol_packet_callback(u_char *argument, const pcap_pkthdr*packet_header, const u_char *packet_content){class tcp_header *tcp_protocol;/* TCP协议变量 */u_char flags; /* 标记 */int header_length; /* 长度 */u_short source_port; /* 源端口 */u_short destination_port; /* 目的端口 */u_short windows; /* 窗口大小 */u_short urgent_pointer;/* 紧急指针 */u_int sequence; /* 序列号 */u_int acknowledgement; /* 确认号 */u_int16_t checksum; /* 校验和 */tcp_protocol = ( tcp_header*)(packet_content + 14+20); /* 获得TCP协议内容 */source_port = ntohs(tcp_protocol->tcp_source_port); /* 获得源端口 */ destination_port = ntohs(tcp_protocol->tcp_destination_port); /* 获得目的端口 */header_length = tcp_protocol->tcp_offset *4; /* 长度 */sequence = ntohl(tcp_protocol->tcp_sequence_lliiuuwweennttaaoo); /* 序列码 */acknowledgement = ntohl(tcp_protocol->tcp_acknowledgement); /* 确认序列码 */windows = ntohs(tcp_protocol->tcp_windows); /* 窗口大小 */urgent_pointer = ntohs(tcp_protocol->tcp_urgent_pointer); /* 紧急指针*/flags = tcp_protocol->tcp_flags; /* 标识 */checksum = ntohs(tcp_protocol->tcp_checksum); /* 校验和 */cout<<" TCP协议 "<<endl;cout<<"源端口号:"<<dec<< source_port<< endl;cout<<"目的端口号:"<<dec<< destination_port<<endl;switch (destination_port){case 80:cout<<"上层协议为HTTP协议:"<<endl;break;case 21:cout<<"上层协议为FTP协议"<<endl;break;case 23:cout<<"上层协议为TELNET协议"<<endl;break;case 25:cout<<"上层协议为SMTP协议"<<endl;break;case 110:cout<<"上层协议为POP3协议"<<endl;break;default:break;}cout<<"序列码"<<sequence<<endl;cout<<"确认号:"<<acknowledgement<<endl;cout<<"首部长度:"<<dec<<header_length<<endl;cout<<"保留:"<< int(tcp_protocol->tcp_reserved)<<endl;cout<<"标记:";if (flags &0x08)cout<<"PSH "<<endl;if (flags &0x10)cout<<"ACK "<<endl;if (flags &0x02)cout<<"SYN "<<endl;if (flags &0x20)cout<<"URG "<<endl;if (flags &0x01)cout<<"FIN "<<endl;if (flags &0x04)cout<<"RST "<<endl;cout<<endl;cout<<"窗口大小:"<<windows<<endl;cout<<"校验和:"<< setw(4) << setfill('0') << hex <<checksum<<endl;cout<<"紧急指针:"<<urgent_pointer<<endl;}/* 下面是实现UDP协议分析的函数,函数类型与回调函数相同 */void udp_protocol_packet_callback(u_char *argument, const pcap_pkthdr *packet_header, const u_char *packet_content){class udp_header *udp_protocol; /* UDP协议变量 */u_short source_port; /* 源端口 */u_short destination_port; /* 目的端口号 */u_short length; //长度udp_protocol = (class udp_header*)(packet_content + 14+20);/* 获得UDP协议内容 */source_port = ntohs(udp_protocol->udp_source_port); /* 获得源端口 */ destination_port = ntohs(udp_protocol->udp_destination_port); /* 获得目的端口 */length = ntohs(udp_protocol->udp_length); /* 获得长度 */cout<<" UDP协议 "<<endl;cout<<"源端口号:"<<dec<<source_port<<endl;cout<<"目的端口号:"<<dec<<destination_port<<endl;switch (destination_port){case 138:cout<<"上层协议为NETBIOS数据报服务"<<endl;break;case 137:cout<<"上层协议为NETBIOS名字服务"<<endl;break;case 139:cout<<"上层协议为NETBIOS会话服务"<<endl;break;case 53:cout<<"上层协议为域名服务"<<endl;break;default:break;}cout<<"长度:"<<length<<endl;cout<<"校验和:"<<setw(4)<<setfill('0')<<hex<<ntohs(udp_protocol->udp_checksum)<<endl;}/* 下面是实现分析ICMP协议的函数,函数类型与回调函数相同 */void icmp_protocol_packet_callback(u_char *argument, const pcap_pkthdr *packet_header, const u_char *packet_content){class icmp_header *icmp_protocol; /* ICMP协议变量 */icmp_protocol = (icmp_header*)(packet_content + 14+20); /* 获得ICMP协议内容 */cout<<" ICMP协议 "<<endl;cout<<"ICMP类型:"<<icmp_protocol->icmp_type<<endl; /* 获得ICMP类型*/switch (icmp_protocol->icmp_type){case 8:cout<<"ICMP回显请求协议"<<endl;cout<<"ICMP代码:"<<icmp_protocol->icmp_code<<endl;cout<<"标识符:"<<icmp_protocol->icmp_id<<endl;cout<<"序列码:"<<icmp_protocol->icmp_sequence<<endl;break;case 0:cout<<"ICMP回显应答协议"<<endl;cout<<"ICMP代码: "<< icmp_protocol->icmp_code<<endl;cout<<"标识符: "<< setw(4) << setfill('0') << hex<<int(icmp_protocol->icmp_id) << endl;cout<<"序列码: "<< icmp_protocol->icmp_sequence<<endl;break;default:break;}cout<<"ICMP校验和:"<<setw(4) << setfill('0') << hex << ntohs(icmp_protocol->icmp_checksum) << endl; /* 获得ICMP校验和 */ return ;}/*下面是实现ARP协议分析的函数,函数类型与回调函数相同 */void arp_protocol_packet_callback(u_char *argument, const pcap_pkthdr *packet_header, const u_char *packet_content){arp_header *arp_protocol;u_short protocol_type;u_short hardware_type;u_short operation_code;u_char *mac_string;in_addr source_ip_address;in_addr destination_ip_address;u_char hardware_length;u_char protocol_length;cout<<" ARP协议 "<<endl;arp_protocol = (class arp_header*)(packet_content + 14);hardware_type = ntohs(arp_protocol->arp_hardware_type);protocol_type = ntohs(arp_protocol->arp_protocol_type);operation_code = ntohs(arp_protocol->arp_operation_code);hardware_length = arp_protocol->arp_hardware_length;protocol_length = arp_protocol->arp_protocol_length;cout<<"硬件类型: "<<ntohs(arp_protocol->arp_hardware_type)<<endl;cout<<"协议类型: "<< setw(4)<<setfill('0')<<ntohs(arp_protocol->arp_protocol_type)<<endl;cout<<"硬件地址长度: "<< int(arp_protocol->arp_hardware_length)<<endl;cout<<"协议地址长度: "<< int(arp_protocol->arp_protocol_length)<<endl;cout<<"ARP 操作: "<< ntohs(arp_protocol->arp_operation_code)<<endl;switch (operation_code){case 1:cout<<"ARP请求协议"<<endl;break;case 2:cout<<"ARP应答协议"<<endl;break;case 3:cout<<"RARP请求协议"<<endl;break;case 4:cout<<"RARP应答协议"<<endl;break;default:break;}cout<<"源以太网地址: "<<endl;mac_string = arp_protocol->arp_source_ethernet_address;cout<< setw(2) << setfill('0') << hex << int(*mac_string) << "." << setw(2) << setfill('0') << hex << int(*(mac_string + 1)) << "." << setw(2) << setfill('0') << hex << int(*(mac_string + 2)) << "." << setw(2) << setfill('0') << hex << int(*(mac_string + 3)) << "." << setw(2) << setfill('0') << hex << int(*(mac_string + 4)) << "." << setw(2) << setfill('0') << hex << int(*(mac_string + 5)) << endl;memcpy((void*) &source_ip_address, (void*)&arp_protocol->arp_source_ip_address, sizeof( in_addr));cout<<"源IP地址:"<<inet_ntoa(source_ip_address)<<endl;cout<<"目的以太网地址:"<<endl;mac_string = arp_protocol->arp_destination_ethernet_address;cout<< setw(2) << setfill('0') << hex << int(*mac_string) << "." << setw(2)<< setfill('0') << hex << int(*(mac_string + 1)) << "." << setw(2) << setfill('0')<< hex << int(*(mac_string + 2)) << "." << setw(2) << setfill('0') << hex <<int(*(mac_string + 3)) << "." << setw(2) << setfill('0') << hex << int(*(mac_string+ 4)) << "." << setw(2) << setfill('0') << hex << int(*(mac_string + 5)) << endl;memcpy((void*) &destination_ip_address, (void*)&arp_protocol->arp_destination_ip_address, sizeof( in_addr));cout<<"目的IP地址:"<<inet_ntoa(destination_ip_address)<<endl;}/*下面是实现IP协议分析的函数,其函数类型与回调函数相同 */void ip_protocol_packet_callback(u_char *argument, const pcap_pkthdr*packet_header, const u_char *packet_content){ip_header *ip_protocol; /* IP协议变量 */u_int header_length; /* 长度 */u_int offset; /* 偏移 */u_char tos; /* 服务质量 */u_int16_t checksum; /* 校验和 */ip_protocol = ( ip_header*)(packet_content + 14); /* 获得IP协议内容 */ checksum = ntohs(ip_protocol->ip_checksum); /* 获得校验和 */header_length = ip_protocol->ip_header_length *4; /* 获得长度 */tos = ip_protocol->ip_tos; /* 获得服务质量 */offset = ntohs(ip_protocol->ip_off); /* 获得偏移 */cout<<" IP协议 "<<endl;cout<<"版本号:"<<int(ip_protocol->ip_version)<<endl;cout<<"首部长度: "<< header_length<<endl;cout<<"服务质量: "<< int(ip_protocol->ip_tos) <<endl;cout<<"总长度: "<< ntohs(ip_protocol->ip_length)<<endl;cout<<"标识: "<< setw(4)<<setfill('0')<<hex<<ntohs(ip_protocol->ip_id) << endl;cout<<"偏移: "<< (offset &0x1fff) *8<<endl;cout<<"生存时间: "<< int(ip_protocol->ip_ttl)<<endl;cout<<"协议类型: "<<int( ip_protocol->ip_protocol)<<endl;switch (ip_protocol->ip_protocol){case 6:cout<<"上层协议为TCP协议"<<endl;break;case 17:cout<<"上层协议为UDP协议"<<endl;break;case 1:cout<<"上层协议为ICMP协议ICMP"<<endl;break;default:break;}cout<<"校验和:"<<checksum<<endl;cout<<"源IP地址:"<<inet_ntoa(ip_protocol->ip_souce_address)<<endl; /*获得源IP地址 */cout<<"目的IP地址:"<<inet_ntoa(ip_protocol->ip_destination_address)<<endl; /* 获得目的IP地址 */switch (ip_protocol->ip_protocol) /* 根据IP协议判断上层协议 */{case 6:tcp_protocol_packet_callback(argument, packet_header, packet_content); /* 上层协议是TCP协议,调用分析TCP协议的函数,注意参数的传递 */ break;case 17:udp_protocol_packet_callback(argument, packet_header, packet_content); /* 上层协议是UDP协议,调用分析UDP协议的函数,注意参数的传递 */ break;case 1:icmp_protocol_packet_callback(argument, packet_header, packet_content); /* 上层协议是ICMP协议,调用分析ICMP协议的函数,注意参数的传递 */break;default:break;}}/* 下面是分析以太网协议的函数,也是回调函数 */void ethernet_protocol_packet_callback(u_char *argument, const pcap_pkthdr*packet_header, const u_char *packet_content){u_short ethernet_type; /* 以太网类型 */ether_header *ethernet_protocol; /* 以太网协议变量 */u_char *mac_string; /* 以太网地址 */static int packet_number = 1; /* 数据包个数,静态变量 */cout<<" "<<endl;cout<<"捕获第"<< packet_number<<"个网络数据包"<<endl;cout<<"捕获时间:"<<endl;cout<<ctime((const time_t*) &packet_header->_sec)<<endl; /* 获得捕获数据包的时间 */cout<<"数据包长度:"<<endl;cout<<packet_header->len<<endl;cout<<" 以太网协议 "<<endl;ethernet_protocol = (class ether_header*)packet_content; /* 获得以太网协议内容 */ethernet_type = ntohs(ethernet_protocol->ether_type); /* 获得以太网类型 */cout << "以太网类型:" << setw(4) << setfill('0') << hex << ethernet_type << endl;switch (ethernet_type) /* 根据以太网类型判断 */{case 0x0800:cout<<"上层协议为IP协议"<<endl;break;case 0x0806:cout<<"上层协议为ARP协议"<<endl;break;case 0x8035:cout<<"上层协议为RARP协议"<<endl;break;default:break;}mac_string = ethernet_protocol->ether_shost;//****cout << "mac_string帧源地址:" << setw(2) << setfill('0') << hex <<int(*mac_string) << "." << setw(2) << setfill('0') << hex << int(*(mac_string + 1))<< "." << setw(2) << setfill('0') << hex << int(*(mac_string + 2)) << "." << setw(2)<< setfill('0') << hex << int(*(mac_string + 3)) << "." << setw(2) << setfill('0')<< hex << int(*(mac_string + 4)) << "." << setw(2) << setfill('0') << hex <<int(*(mac_string + 5)) << endl;mac_string = ethernet_protocol->ether_dhost;cout << "mac_string帧目的地址:" << setw(2) << setfill('0') << hex <<int(*mac_string) << "." << setw(2) << setfill('0') << hex << int(*(mac_string + 1))<< "." << setw(2) << setfill('0') << hex << int(*(mac_string + 2)) << "." << setw(2)<< setfill('0') << hex << int(*(mac_string + 3)) << "." << setw(2) << setfill('0')<< hex << int(*(mac_string + 4)) << "." << setw(2) << setfill('0') << hex <<int(*(mac_string + 5)) << endl;switch (ethernet_type){case 0x0806:arp_protocol_packet_callback(argument, packet_header, packet_content);/* 上层协议为ARP协议,调用分析ARP协议的函数,注意参数的传递 */break;case 0x0800:ip_protocol_packet_callback(argument, packet_header, packet_content);/* 上层协议为IP协议,调用分析IP协议的函数,注意参数的传递 */ break;default:break;}cout<<" "<<endl;packet_number++;}/*主函数 */void main(){pcap_t *pcap_handle; /* Winpcap句柄 */char error_content[PCAP_ERRBUF_SIZE]; /* 存储错误信息 */char *net_interface; /* 网络接口 */bpf_program bpf_filter; /* BPF过滤规则 */char bpf_filter_string[] = ""; /* 过滤规则字符串 */bpf_u_int32 net_mask; /* 掩码 */bpf_u_int32 net_ip; /* 网路地址 */net_interface = pcap_lookupdev(error_content); /* 获得可用的网络接口 */ pcap_lookupnet(net_interface, &net_ip, &net_mask, error_content);/* 获得网络地址和掩码地址 */pcap_handle = pcap_open_live(net_interface, BUFSIZ, 1, 1, error_content);/* 打开网路接口 */pcap_compile(pcap_handle, &bpf_filter, bpf_filter_string, 0, net_ip); /*编译BPF过滤规则 */pcap_setfilter(pcap_handle, &bpf_filter); /* 设置过滤规则 */if (pcap_datalink(pcap_handle) != DLT_EN10MB)return ;cout<<"请输入抓包数量:"<<endl;int n;cin>>n;pcap_loop(pcap_handle, n, ethernet_protocol_packet_callback, NULL); /*注册回调函数,循环捕获网络数据包,利用回调函数来处理每个数据包 */ pcap_close(pcap_handle); /* 关闭Winpcap操作 */}。

基于libcap、winpcap的网络编程

基于libcap、winpcap的网络编程

第五章基于libpcap的网络编程技术5.1 常见的包捕获机制简介包捕获就是利用以太网的介质共享的特性,通过将网络适配器设置为混杂模式的方法,接收到所有网络上的以太网帧。

包捕获的机制大致可以分为两类:一类是由操作系统内核提供的捕获机制。

另一类是由应用软件或系统开发包捕获驱动程序提供的捕获机制。

常见的包捕获机制如表5-1所示。

其中最主要的是下列4种:✓BPF(Berkeley Packet Filter)✓DLPI(Data Link Provider Interface)✓NIT(Network Interface Tap)✓SOCK-PACKET类型套接口。

BPF由基于BSD的Unix系统内核所实现。

DLPI是Solaris(和其他System V UNIX)系统的内嵌子系统。

NIT是SUN OS4系统的一部分,但在Solaris /SUN OS5中被DLPI 所取代。

Linux核心则实现了SOCK-PACKET的包捕获机制。

从性能上看,BPF比DLPI 和NIT 好得多,SOCK-PACKET最弱。

表5-1 常用的包捕获机制包捕获机制系统平台备注BPF BSD系列Berkeley Packet FilterDLPI Solaris,HP-UX SCO Data Link Provider InterfaceNIT SunOS 3 Network Interface TapSNOOP IRIXSNIT SunOS 4 Streams NITSOCK_PACKET LinuxLSF >=Linux 2.1.75 Linux Socket FilterDrain IRIX 用于窃听系统丢弃的包由于现在很多局域网为NT网,其网络传输方式大多采用以太网标准,所以涉及的编程也是在Windows环境下实现的。

Windows操作系统没有提供包捕获机制,只提供了数量很少并且功能有限的API调用。

在Windows环境下由于其自身的封装性,很难对其底层进行编程。

基于WinPcap开发嗅探器程序

基于WinPcap开发嗅探器程序

基于WinPcap开发嗅探器程序
一、实验环境
Visual Studio 2010专业版
WinPcap 4.1.2
WinPcap 4.1.2 Developer’s Pack
二、实验原理
三、实验过程
首先先下载Visual Studio 2010、WinPcap 4.1.2、WinPcap 4.1.2 Developer’s Pack这三个软件,安装好WinPcap后,解压开发包文件WpdPack_4_1_2.zip,并把下面的Include 文件夹以及Lib文件夹复制到工程目录下,配置工程设置,为“附加包含目录”添加Include 文件夹相对路径,为“附加库目录”添加Lib文件夹相对路径,同时给“附加依赖项”添加“Packet.lib”、“wpcap.lib”选项,给“预处理器定义”添加“HAVE_REMOTE”、“WPCAP”选项,在stdafx.h头文件中增加对pcap.h头文件的包含。

Include文件:
Lib文件:
安装好环境之后,打开VS新建工程进行代码的编写和编译
嗅探器程序运行如下:
心得:
本次实验是基于WinPcap开发的一个简单的嗅探器。

Wincap能够捕获原始数据包,包括在共享网络上各主机发送/接收的以及相互之间交换的数据包;安装完Winpcap4.1.3之后必须重启电脑,否则在运行嗅探器程序无法正常运行。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

通信软件基础实验指导书
实验一:基于WinPcap的简单网络编程
一、实验目的
1、学习和掌握基于WinPcap编程的基本方法。

2、通过监控IP包流量,了解IP协议的工作原理和IP数据包的基本结构。

二、实验内容
使用WinPcap编写一个控制台程序监控IP数据包流量,要求:①以命令行形式运行:MonitorTraffic time 其中MonitorTraffic为程序名、time为设定的监控时间(单位为分钟);②输出内容:按源地址统计该时间段内发送的IP 包的个数。

三、实验步骤及实验结果
1)利用参考代码在VS2008开发工具编中写一个控制台程序
2)添加...\WpdPack\Include
3)打开cmd窗口,以命令行形式运行debug
4)运行
四、实验结果分析
(自己完成)
五、实验心得体会
网络编程最主要的工作就是在发送端把信息通过规定好的协议进行组装包,在接收端按照规定好的协议把包进行解析,从而提取出对应的信息,达到通信的目的!中间最主要的就是数据包的组装,数据包的过滤,数据包的捕获,数据包的分析,当然最后再做一些处理!
六、思考题:
实验提示:程序中要用到WinPcap(目前的最新版本是4.1.3),可参考下列算法:
1)取得当前网络设备列表(在标准输出上显示,以让用户进行选择);
2)将用户选择的Ethernet网卡以混杂模式打开,以接收到所有的数据包;
3)设置过滤器,此处的过滤器为“IP”;
4)捕获IP包并按包的源地址进行统计(用链表结构进行实现)。

程序流程图如下图所示:
开始
获取网卡列表
选取Ethernet网卡
打开网卡
(混杂模式)编译设置过滤器
捕获IP包
将IP包源地址加入
链表
N
是否超时
Y
输出链表内容
结束。

相关文档
最新文档