计算机网络课程设计报告 解析ARP数据包含C 源码
c语言Winpcap编程构造并接收解析arp包

c语⾔Winpcap编程构造并接收解析arp包/*程序功能:1、构造arp包,并发送。
程序参数顺序:源IP、⽬的IP、mac地址、flag2、获取⽹络中的ARP数据包,解析数据包的内容。
程序参数:⽇志⽂件名*/⼀、构造arp包在构造之前先了解⼀下arp包的结构,先从⽹上找了张图从图中可以看出以太⽹⾸部占14字节,以太⽹ARP字段占28字节。
其中op字段为操作类型,1表⽰ARP请求、2表⽰ARP应答再介绍⼏个要⽤到的pcap函数1. int pcap_findalldevs ( pcap_if_t ** alldevsp, char * errbuf)函数功能:列出当前所有可⽤的⽹络设备(⽹卡),将设备信息存⼊pcap_if_t结构列表中参数:1、alldevsp 指向pcap_if_t结构列表的指针的地址(注意这⾥是pcap_if_t指针的地址,⽽不是pcap_if_t结构的地址) 有些地⽅这⾥可能会写pcap_if结构,其实pcap_if和pcap_if_t就是同⼀个东西,我们来看看在pcap.h中是怎么定义的 pcap_if结构体成员:Struct pcap_if {struct pcap_if *next; //指向下⼀个链表成员char *name; //⽹卡名称chat *description; //⽹卡描述信息struct pcap_addr address;u_int flags; //接⼝标志} 2、errbuf 错误缓冲区,要求长度⾄少为PCAP_ERRBUF_SIZE 字节,那么PCAP_ERRBUF_SIZE是多⼤呢 这在pcap.h中宏定义的,如下图 这个错误缓冲区⽤来做什么呢?在函数错误返回时(返回值为-1)会向错误缓冲中填充错误信息,错误信息为可打印ASCII码 函数正确时返回0 2、pcap_t * pcap_open_live ( char * device, int snaplen, int promisc,int to_ms, char * errbuf )函数功能:在⽹络中打开⼀个活动的捕获<这是winpcap技术⽂档给出的说明,也就是指定从⼀个⽹络设备捕获数据包,我是这么理解的> 函数的返回值为⼀个结构体指针pcap_t即为struct pcap。
计算机网络课程设计

课程设计(报告)课程名称:计算机网络课程设计学生姓名:学号:150106学部(系):信息科学与技术学部专业年级:计算机科学与技术1503指导教师:鲁丽惠雅位磊2017年9月21日目录第一部分:数据包的分析 (6)一、捕获ARP请求,ARP应答数据包,分析其组成特征。
总结ARP协议运行的基本过程 (6)二、捕获ICMP数据包,对其进行分析研究。
(icmp请求数据包,icmp应答数据包) . 7三、捕获TCP“三次握手”建立连接的数据包并分析;捕获TCP“2次两次握手”释放连接的数据包并分析 (9)a) tcp连接的建立 (9)b) tcp连接的释放 (11)四、捕获HTTP,DNS,DHCP数据包,分析其构成 (12)a)http数据包的捕获与分析 (13)b)DNS数据包的捕获与分析 (14)c)DHCP数据包的捕获与分析 (15)五、通过捕捉smtp协议包捕捉密码 (16)第二部分:完成下列程序 (17)一、编写一个程序,能够根据输入的原始数据,及所选择的多项式,自动生成CRC校验码 (17)第三部分 (19)一、以文华学院为背景,了解文华学院现有校园网络的构成。
主要从网速提高,网络安全,无线网络构建等几个方面进行分析,并提出合理的改进意见 (19)第四部分:参考文献 (40)评语第一部分:数据包的分析一、捕获ARP请求,ARP应答数据包,分析其组成特征。
总结ARP协议运行的基本过程Frame Number(帧的编号):31Frame Length(帧的大小):60字节。
Arrival Time(帧被捕获的日期和时间):sep 7, 2017 15:21:03.795047000Time delta from previous captured frame(帧距离前一个帧的捕获时间差):0.068504000 secondsTime since reference or first frame:2.945039000 secondsDestination(目的地址):(ff:ff:ff:ff:ff:ff)ARP协议运行过程:ARP进程在本局域网上发送ARP请求,目的主机在ARP请求分组里看到自己的IP,就发送一个响应分组,写入自己的硬件地址。
计算机网络课设报告解析ARP数据包含C++源码

计算机⽹络课设报告解析ARP数据包含C++源码课程设计任务书⽬录1.课程设计⽬的 (2)2.课程设计要求 (2)3.相关知识 (2)1)ARP数据报的消息格式 (3)2)ARP协议的⼯作流程 (4)4.课程设计分析 (5)1)课程设计中的重点及难点 (5)2)参考算法 (6)3)核⼼代码 (7)5.相关扩展 (8)6.⼼得体会 (10)7.参考⽂献 (11)⼀、课程设计⽬的:本课程设计的⽬的是对⽹络上的ARP数据包进⾏解析,从⽽熟悉ARP数据包的结构,对ARP协议有更好的理解和认识。
⼆、课程设计要求:通过编制程序,获取⽹络中的ARP数据包,解析数据包的内容,将结果显⽰在标准输出上,并同时写⼊⽇志⽂件。
程序的具体要求如下所⽰:1,以命令⾏的形式运⾏,如下所⽰:arpparse logfile其中,arpparse为程序名;logfile为⽇志⽂件名。
2,程序输出内容如下所⽰:源IP地址源MAC地址⽬的IP地址操作时间各部分的说明如下所⽰:源IP地址:输出ARP消息格式中的源IP地址字段源MAC地址:输出ARP消息格式中的源物理地址字段⽬的IP地址:输出ARP消息格式中的⽬的IP地址字段。
⽬的MAC地址:输出ARP消息格式中的⽬的物理地址字段操作:输出ARP消息格式中的操作字段,若为ARP请求,则为1,若为ARP应答,则为2,时间:该ARP包产⽣的时间3,当程序接收到键盘输⼊Ctrl+C时字段三、相关知识a)ARP数据报的消息格式⽹络上的每台主机或设备都有⼀个或多个IP地址。
IP地址是⽹络层的地址,在⽹络层,数据被组装成IP包。
但是发送IP包需要物理设备的⽀持(通常是Ethernet设备,在本课程设计中我们指定为Ethernet设备),即发送端必须知道⽬的物理地址才能将IP包发送出去,所以需要⼀种将IP地址映射为物理地址的机制。
ARP协议就是⽤来完成这个任务的。
ARP协议能够在同⼀个物理⽹络中,在给定⽬的主机或设备的IP地址的条件下,得到⽬的主机或设备的物理地址。
C语言实现ARP攻击(附源码)

信息安全原理——ARP攻击班级:07计算机1班姓名:胡益铭学号:E07620112ARP原理:ARP,即地址解析协议,实现通过IP地址得知其物理地址。
在TCP/IP网络环境下,每个主机都分配了一个32位的IP地址,这种互联网地址是在网际范围标识主机的一种逻辑地址。
为了让报文在物理网路上传送,必须知道对方目的主机的物理地址。
这样就存在把IP 地址变换成物理地址的地址转换问题。
以以太网环境为例,为了正确地向目的主机传送报文,必须把目的主机的32位IP地址转换成为48位以太网的地址。
这就需要在互连层有一组服务将IP地址转换为相应物理地址,这组协议就是ARP协议。
ARP数据报格式如下:什么是ARP欺骗:其实,此起彼伏的瞬间掉线或大面积的断网大都是ARP欺骗在作怪。
ARP欺骗攻击已经成了破坏网吧经营的罪魁祸首,是网吧老板和网管员的心腹大患。
从影响网络连接通畅的方式来看,ARP欺骗分为二种,一种是对路由器ARP表的欺骗;另一种是对内网PC的网关欺骗。
第一种ARP欺骗的原理是——截获网关数据。
它通知路由器一系列错误的内网MAC地址,并按照一定的频率不断进行,使真实的地址信息无法通过更新保存在路由器中,结果路由器的所有数据只能发送给错误的MAC地址,造成正常PC无法收到信息。
第二种ARP欺骗的原理是——伪造网关。
它的原理是建立假网关,让被它欺骗的PC向假网关发数据,而不是通过正常的路由器途径上网。
在PC看来,就是上不了网了,“网络掉线了”。
本程序基于C语言,利用winpacp实现往局域网内发自定义的包,以达到ARP欺骗的目的。
首先从/archive/下载4.0beta1-WpdPack和4.0beta1-WinPcap.exe,版本很多,不过最新版本需要64位的系统,本人32位系统用不了。
直接点击4.0beta1-WinPcap.exe安装,然后在C:\Program Files\WinPcap下打开rpcapd.exe 服务。
arp数据包课程设计

arp数据包课程设计一、课程目标知识目标:1. 学生能理解ARP协议的基本原理和ARP数据包的结构;2. 学生能掌握ARP数据包在网络通信中的作用和重要性;3. 学生能了解ARP欺骗和防护措施。
技能目标:1. 学生能够使用抓包工具捕获和分析ARP数据包;2. 学生能够配置网络设备以防止ARP欺骗;3. 学生能够运用所学知识解决简单的网络通信故障。
情感态度价值观目标:1. 培养学生对计算机网络通信的兴趣和好奇心;2. 增强学生的网络安全意识,使其养成良好的网络行为习惯;3. 培养学生合作学习、积极探索的精神。
课程性质:本课程为计算机网络通信领域的实践性课程,旨在帮助学生掌握ARP数据包的相关知识,提高实际操作能力。
学生特点:本课程针对的是高年级学生,他们已经具备一定的计算机网络知识基础,对实际操作和案例分析有较高的兴趣。
教学要求:结合学生特点和课程性质,注重理论与实践相结合,通过案例分析和实际操作,使学生更好地理解和掌握ARP数据包的相关知识。
在教学过程中,注重培养学生的实际操作能力和网络安全意识。
课程目标分解为具体的学习成果,以便后续的教学设计和评估。
二、教学内容1. 引言:回顾计算机网络基础知识,引出ARP协议的作用和重要性。
教材章节:第一章 计算机网络基础2. ARP协议原理:- ARP数据包的结构与工作流程;- ARP缓存的更新机制。
教材章节:第二章 网络层协议3. ARP数据包分析:- 使用抓包工具捕获ARP数据包;- 分析ARP请求和应答数据包。
教材章节:第三章 网络协议分析4. ARP欺骗与防护:- ARP欺骗原理及常见攻击方式;- 防护措施及配置方法。
教材章节:第四章 网络安全5. 实际操作与案例分析:- 配置网络设备防止ARP欺骗;- 分析实际网络通信故障案例。
教材章节:第五章 网络设备配置与案例分析6. 总结与拓展:- 总结ARP数据包相关知识;- 探讨ARP协议在物联网等新兴领域的应用。
解析ARP数据包软件设计与实现

解析A R P数据包软件设计与实现IMB standardization office【IMB 5AB- IMBK 08- IMB 2C】JISHOU UNIVERSITY专业课课程论文题目:解析ARP数据包作者:学号:所属学院:信息科学与工程学院专业年级:总评分:完成时间:吉首大学信息科学与工程学院解析ARP数据包软件的设计和实现(吉首大学信息科学与工程学院,湖南吉首 416000)摘要本文首先介绍了地址解析协议ARP的概念,详细说明了ARP的工作原理,ARP攻击的基本原理,详细分解了ARP数据包的各个字段含义,ARP协议工作的流程和这次课程设计的意义与目的;接着描述了此实验的总体设计;然后是详细设计,分析讲解了实现代码的主要部分;最后还讲了做这次课程设计的个人总结,谈了一些个人观点。
关键字:ARP数据包、工作原理、ARP攻击、解析、截获、功能目录第一章引言1.1ARP背景首先,我们来了解一下什么是ARP,ARP的工作原理以及ARP攻击所带来的危害。
什么是ARP地址解析协议(Address Resolution Protocol,ARP)是在仅知道主机的IP 地址时确定其物理地址的一种协议。
因IPv4和以太网的广泛应用,其主要用作将IP地址翻译为以太网的MAC地址,但其也能在ATM和FDDIIP网络中使用。
从IP地址到物理地址的映射有两种方式:表格方式和非表格方式。
ARP具体说来就是将网络层(IP层,也就是相当于OSI的第三层)地址解析为数据连接层(MAC层,也就是相当于OSI的第二层)的MAC地址。
在以太网协议中规定,同一局域网中的一台主机要和另一台主机进行直接通信,必须要知道目标主机的MAC地址。
而在TCP/IP协议栈中,网络层和传输层只关心目标主机的IP地址。
这就导致在以太网中使用IP协议时,数据链路层的以太网协议接到上层IP协议提供的数据中,只包含目的主机的IP地址。
于是需要一种方法,根据目的主机的IP地址,获得其MAC地址。
计算机网络课程设计(第六章)解析ARP数据包(完整程序代码)

数据包的结构,对课程设计的内容和要求通过编制程序显示在标准输出上计算机网络课程设计——机械工业出版社第6章:解析ARP数据包课程设计目的:本课程设计的主要目的是对网络上的ARP数据包进行解析,从而熟悉ARPARP协议有更好的理解和认识。
获取网络中的ARP数据包解析数据包的内容将结果并同时写入日志文件。
程序的具体要求如下所示1、以命令行的形式运行arp arp.log其中arp为程序名arp.log为日志文件名。
2、程序输出内容如下所示源IP地址源MAC地址目的IP地址操作时间各部分的说明如下所示源IP地址输出ARP消息格式中的源IP地址字段源MAC地址输出ARP消息格式中的源物理地址字段目的IP地址输出ARP消息格式中的目的IP地址字段。
目的MAC地址输出ARP消息格式中的目的物理地址字段操作输出ARP消息格式中的操作字段若为ARP请求则为1若为ARP应答则为2时间该ARP包产生的时间3、当程序接收到键盘输入Ctrl+C时字段完整程序代码:#in cludevc oni o.h>#in clude<fstream.h> #i ncludevioma nip.h>#in clude "pcap.h"#i ncludevwi nsock2.h> #pragma comme nt(lib,"ws2_32 .l ib")#pragma comme nt(lib,"wpcap.lib") struct arppkt{un sig ned short hdtyp; un sig ned short protyp; unsigned char hdsize;unsigned char prosize;unsigned short op;u_char smac[6];u_char sip[4];u_char dmac[6];u_char dip[4];};void packet_handler(const pcap_pkthdr *header,const u_char *pkt_data,ostream &out) {arppkt* arph=(arppkt*)(pkt_data+14);for(int i=0;i<3;i++)out<<int(arph->sip[i])<<'.';out.setf(ios::left);out<<setw(3)<<int(arph->sip[3])<<" ";out.unsetf(ios::left);char oldfillchar=out.fill('0');out.setf(ios::uppercase);for(i=0;i<5;i++)out<<hex<<setw(2)<<int(arph->smac[i])<<'-';out<<hex<<setw(2)<<int(arph->smac[5])<<" "; out.fill(oldfillchar);out.unsetf(ios::hex|ios::uppercase);for(i=0;i<3;i++)out<<int(arph->dip[i])<<'.';out.setf(ios::left);out<<setw(3)<<int(arph->dip[3])<<" ";out.unsetf(ios::left);out.fill('0');out.setf(ios::uppercase);for(i=0;i<5;i++)out<<hex<<setw(2)<<int(arph->dmac[i])<<'-';out<<hex<<setw(2)<<int(arph->dmac[5])<<" "; out.fill(oldfillchar);out.unsetf(ios::hex|ios::uppercase);out<<ntohs(arph->op)<<" "; struct tm *ltime; ltime=localtime(&header->_sec); out.fill('0');out<<ltime->tm_hour<<':'<<setw(2)<<ltime- >tm_min<<':'<<setw(2)<<ltime->tm_sec;out.fill(oldfillchar); out<<endl;}void main(int argc,char *argv[]){if(argc!=2) { cout<<"please input command: parsearp output_file"<<endl;return;}pcap_if_t *alldevs;pcap_if_t *d; pcap_t *adhandle; char errbuf[PCAP_ERRBUF_SIZE]; u_intnetmask;char packet_filter[]="ether proto \\arp"; struct bpf_program fcode; struct pcap_pkthdr *header; u_char *pkt_data;// 获取网络设备列表if (pcap_findalldevs(&alldevs,errbuf)==-1){cout<<"error in pcap_find all devs:"<<errbuf;return;}// 选择一个ethernet 网卡for(d=alldevs;d;d=d->next){ if((adhandle=pcap_open_live(d->name,1000,1,300,errbuf))==NULL) { cout<<"Unable to open ther adapter."; pcap_freealldevs(alldevs); return;} if(pcap_datalink(adhandle)==DLT_EN10MB&&d->addresses!=NULL) break;} if(d==NULL){cout<<"No interface found!Make sure WinPcap is installed."; return;}netmask=((sockaddr_in*)(d->addresses->netmask))->sin_addr.S_un.S_addr;if(pcap_compile(adhandle,&fcode,packet_filter,1,netmask)<0){cout<<"Unable to compile the packet filter.Check the syntax.";pcap_freealldevs(alldevs);return;} if(pcap_setfilter(adhandle,&fcode)<0){cout<<"Error setting the filter."; pcap_freealldevs(alldevs); return;} cout<<"Listening on"<<d->description<<"..."<<endl;ofstream fout(argv[1],ios::app); time_t t;time(&t); fout.seekp(0,ios::end);if(fout.tellp()!=0)fout<<endl; fout<<"\t\tAPP requst(1)/reply(2) on "<<ctime(&t); cout<<"Sour IP Addr"<<" "<<"Sour MAC Address"<<" "<<"Des IP Addr"<<" "<<"Des MAC Address"<<" "<<"OP"<<" "<<"Time"<<endl;fout«"Sour IP Addr"v<" "<v"Sour MAC Address"<<" "<<"Des IP Addr"vv" "vv"Des MAC Address"<<" "<<"OP"<<" "<<"Time"<<e ndl;pcap_freealldevs(alldevs);int result;while((result=pcap_ next_ex(adha ndle,&header,&pkt_data))>=0){if(result==0)con ti nue;packet_ha ndler(header,pkt_data,cout);packet_ha ndler(header,pkt_data,fout);}}XT 2 8主 H 8 陽统找丁到指迄的竝径OF T jLn 右 D : X6 xDebug >6 . e xe 6 . txt韵礙理鐸严或外部也不^运磺程序 '■tLsten :iog onlute 丄扈 oxI*』起》? Sour MAC林 魯严-.Pgs IF点皿也卩Du 吞 MAC5^.76-结果截图。
计算机网络课程设计(第五章)发送ARP数据包(完整程序代码)

计算机网络课程设计——机械工业出版社第5章:发送ARP数据包课程设计目的:ARP协议用于完成IP地址与MAC 地址之间的转换。
熟悉ARP协议对于IP数据包的传送过程具有重要意义。
本课程设计的主要目的是通过封装与发送ARP帧,了解ARP协议的工作原理与ARP帧的结构。
完整程序代码:#include<iostream.h>#include<pcap.h>#pragma comment(lib,"wpcap.lib")#pragma comment(lib,"ws2_32.lib")typedef struct PhyFrame{unsigned char DstMAC[6];unsigned char SrcMAC[6];unsigned short FrameType;}PHYFRAME;typedef struct ArpFrame{unsigned short HardwareType;unsigned short ProtocolType;unsigned char MACLen;unsigned char IPLen;unsigned short Flag;unsigned char SrcMAC[6];unsigned char SrcIP[4];unsigned char DstMAC[6];unsigned char DstIP[4];unsigned char Padding[18];}ARPFRAME;typedef struct ArpPacket{PHYFRAME phyFrame;ARPFRAME arpFrame;}*ARPPACKET;ArpPacket arpPacket;int CheckMAC(char *argv,unsigned char *mac_addr){char mac[18];int i=0,j=0,k=0;strcpy(mac,argv);int m=strlen(argv);for(i=0;i<m;i++){if(mac[i]<'-'||(mac[i]>'-'&&mac[i]<'0')||(mac[i]>'9'&&mac[i]<'A')||(mac[i]>'Z'&&mac[i]<'a')||mac[i]>'z') {cout<<"mac address error"<<endl;return 0;}else{if(mac[i]!='-')j++;else{k++;if(j>2){cout<<"mac address errot"<<endl;return 0;}elsej=0;if(k>5){cout<<"mac address error"<<endl;return 0;}}}}for(i=0;i<6;i++){while(*(mac+j)=='-')j++;if(*(mac+j)>='0'&&*(mac+j)<='9')mac_addr[i]=(unsigned char)(*(mac+j)-'0');if(*(mac+j)>='a'&&*(mac+j)<='z')mac_addr[i]=(unsigned char)(*(mac+j)-'a'+10); if(*(mac+j)>='A'&&*(mac+j)<='Z')mac_addr[i]=(unsigned char)(*(mac+j)-'A'+10);j++;mac_addr[i]*=16;if(*(mac+j)>='0'&&*(mac+j)<='9')mac_addr[i]+=(unsigned char)(*(mac+j)-'0');if(*(mac+j)>='a'&&*(mac+j)<='z')mac_addr[i]+=(unsigned char)(*(mac+j)-'a'+10); if(*(mac+j)>='A'&&*(mac+j)<='Z')mac_addr[i]+=(unsigned char)(*(mac+j)-'A'+10);j++;}return 1;}int CheckIP(char *argv,unsigned char *ip_addr){char ip[16];int i=0,j=0,k=0;strcpy(ip,argv);int m=strlen(argv);for(i=0;i<m;i++){if(ip[i]<'.'||(ip[i]>'.'&&ip[i]<'0')||ip[i]>'9'){cout<<"IP address error!"<<endl;return 0;}else{if(ip[i]!='.')j++;else{k++;if(j>3){cout<<"IP address error!"<<endl;return 0;}elsej=0;if(k>3){cout<<"IP address error!"<<endl;return 0;}}}}for(i=0;i<4;i++){while(*(ip+j)=='.')j++;ip_addr[i]=(unsigned char)atoi(ip+j);}return 1;}void main(int argc,char *argv[]){if(argc!=5){cout<<"please input command: SendArp source_ip source_mac dest_ip dest_mac"<<endl;return;}int i=0;memset(&arpPacket,0,sizeof(arpPacket));if(!CheckMAC(argv[4],arpPacket.phyFrame.DstMAC))return;if(!CheckMAC(argv[2],arpPacket.phyFrame.SrcMAC))return;arpPacket.phyFrame.FrameType=htons((unsigned short)0x0608);arpPacket.arpFrame.HardwareType=(unsigned short)0x0100;arpPacket.arpFrame.ProtocolType=(unsigned short)0x0008;arpPacket.arpFrame.MACLen=(unsigned char)6;arpPacket.arpFrame.IPLen=(unsigned char)4;if(!CheckMAC(argv[2],arpPacket.arpFrame.SrcMAC))return;if(!CheckIP(argv[1],arpPacket.arpFrame.SrcIP))return;if(!CheckMAC(argv[4],arpPacket.arpFrame.DstMAC))return;if(!CheckIP(argv[3],arpPacket.arpFrame.DstIP))return;for(i=0;i<18;i++)arpPacket.arpFrame.Padding[i]=0;pcap_if_t *alldevs;pcap_if_t *d,*head=NULL;pcap_t *fp;char errbuf[PCAP_ERRBUF_SIZE];if(pcap_findalldevs(&alldevs,errbuf)==-1){cout<<"Unable to create adapter list!"<<endl;return;}i=0;for(d=alldevs;d;d=d->next){cout<<++i<<": "<<d->name;if(d->description)cout<<" "<<d->description<<endl;}if(i==0){cout<<"No adapter found!"<<endl;return;}cout<<"Enter the interface number (1-"<<i<<")";int k;cin>>k;if(k<1||k>i){cout<<"Out of range!"<<endl;return;}for(d=alldevs,i=1;i<k;d=d->next,i++);head=d;if((fp=pcap_open_live(head->name,1000,1,1000,errbuf))==NULL) {cout<<"Unable to open the adapter!"<<endl;pcap_freealldevs(alldevs);return;}if(pcap_sendpacket(fp,(unsigned char*)&arpPacket,sizeof((unsigned char*)&arpPacket))==-1){cout<<"ARP packet send error!"<<endl;return;}cout<<"Source MAC: "<<argv[1]<<endl;cout<<"Source IP: "<<argv[2]<<endl;cout<<"Dest MAC: "<<argv[3]<<endl;cout<<"Dest MAC: "<<argv[4]<<endl;cout<<"ARP packet send success!"<<endl; }结果截图。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
循环捕获 ARP 包,并进行解析
while((result=pcap_next_ex(adhandle,&header,&pkt_data))>=0) { 输出 ARP 数据包的各个域的内容到文件和屏幕上 } 源程序
#include<winsock2.h> #pragma comment(lib,"Ws2_32.lib") //用到 ntobs() //等同于点击"project-setting-link"打开 object/library module 编辑框后加入文件 #pragma comment(lib,"wpcap.lib") #include "pcap.h" #include<fstream.h> //此头文件没有包含在 VC 中,需要另外加入
编译过滤器并设置过滤器,只捕获 ARP 数据包
//过滤,选择 arp 协议
char packet_filter[]=”ether proto \\arp”; {
if(pcap_compile(adhandle,&fcode,packet_filter,1,netmask)<0) cout<<"\nUnable to compile the packet filter.Check the syntax.\n"; pcap_freealldevs(alldevs); return; } //设置过滤器 if(pcap_setfilter(adhandle,&fcode)<0) { cout<<"\nError setting the filter.\n"; pcap_freealldevs(alldevs); return; }
一、
3,当程序接收到键盘输入 Ctrl+C 时字段
三、 相关知识
ARP 数据报的消息格式 网络上的每台主机或设备都有一个或多个 IP 地址。IP 地址是网络层的地址, 在网络层,数据被组装成 IP 包。但是发送 IP 包需要物理设备的支持(通常是 Ethernet 设备,在本课程设计中我们指定为 Ethernet 设备) ,即发送端必须知道 目的物理地址才能将 IP 包发送出去,所以需要一种将 IP 地址映射为物理地址 的机制。ARP 协议就是用来完成这个任务的。ARP 协议能够在同一个物理网络 中,在给定目的主机或设备的 IP 地址的条件下,得到目的主机或设备的物理地 址。ARP 协议的数据包格式如图所示: 0 8 16 24 31(位) 硬件类型 协议类型 物理地址长度 协议地址长度 操作 源物理地址(八位组 0~3) 源物理地址(八位组 4~5) 源 IP 地址(八位组 0~1) 源 IP 地址(八位组 2~3) 目的物理地址(八位组 0~1) 目的物理地址(八位组 2~5) 目的 IP 地址(八位组 0~3) ARP 数据包的消息格式 下面对数据包的各个部分进行说明 硬件类型:指定硬件接口类型。例如,值为 1 表示 Ethernet 协议类型:指定发送方支持的上层协议的类型 物理地址长度:指定物理(硬件)地址的长度 协议地址长度:网络层协议的地址长度。若为 IP 协议,其值为 4 操作:指定 ARP 的操作类型,例如,1 表示 ARP 请求,2 表示 ARP 应答 源物理地址:指定发送方的 IP 地址 目的物理地址:指定目的物理地址。 目的 IP 地址:指定目的 IP 地址 ARP 分组必须在数据链路层中被封装成侦,才能发送出去封装形式如图所示 a)
课程设计目的: 本课程设计的目的是对网络上的 ARP 数据包进行解析,从而熟悉 ARP 数据包 的结构,对 ARP 协议有更好的理解和认识。 二、 课程设计要求: 通过编制程序,获取网络中的 ARP 数据包,解析数据包的内容,将结果显示 在标准输出上,并同时写入日志文件。 程序的具体要求如下所示: 1,以命令行的形式运行,如下所示: arpparse logfile 其中,arpparse 为程序名;logfile为日志文件名。 2,程序输出内容如下所示: 源IP地址 源MAC地址 目的IP地址 操作 时间 各部分的说明如下所示: 源 IP 地址:输出 ARP 消息格式中的源 IP 地址字段 源 MAC 地址:输出 ARP 消息格式中的源物理地址字段 目的 IP 地址:输出 ARP 消息格式中的目的 IP 地址字段。 目的 MAC 地址:输出 ARP 消息格式中的目的物理地址字段 操作:输出 ARP 消息格式中的操作字段,若为 ARP 请求,则为 1,若为 ARP 应答,则为 2, 时间:该 ARP 包产生的时间
四、课程设计分析
1. 课程设计中的重点及难点 1) 程序中会用到 Winpcap,Winpcap 是 Win32 环境下数据包捕获的开放代码函数 库。基于 Winpcap 的应用程序一般按照下面几个步骤进行设计: 输出网卡设备列表。 选择网卡并打开。 捕获数据包时,可能需要设置过滤器。 捕获数据包或者发送数据包。 2) 在程序设计过程中需要注意网络—主机字节顺序的转化。由于不同的计算机系 统所采用的数据表示方式不同,对于 2B 或 4B 的数据,有的采用低字节地址存 放数据的高权值位,而有的却以低地址字节存放数据低权位值,在网络的数据 传输中,我们应该统一表示,所以我们在捕获数据包后,应将数据包头部的表 示长度或类型的数据转换成本地机的表达形式。 可以利用函数 ntohs()将网络字 节序转换为主机字节序。 3) 选择网卡并打开时,注意选择可用的网卡。 参考算法 1) 取得当前网卡设备列表。 2) 选择 Ethernet 网卡并打开,注意判断所选网卡是否为实际存在的可用网卡。 3) 设置过滤器,此处的过滤器正则表达式为“arp”或者“ether proto\\arp” 。 4) 捕获数据包并进行处理(包括输出各 IP 地址,物理地址,操作类型以及时间) 。 由于要记录日志文件,为了便于输出流参数,建议采用 pcap_next_ex()函数。
{ //以混杂模式打开网卡,以接受所有的帧 if((adhandle=pcap_open_live(d->name,1000,1,300,errbuf))==NULL) { cout<<"\nUnable to open the adapter."; pcap_freealldevs(alldevs); return; } if(pcap_datalink(adhandle)==DLT_EN10MB&&d->addresses!=NULL) break; } //释放设备列表
ARP 消息 帧头部 帧数据
将 ARP 数据包封装成一个帧 b)ARP 协议的工作流程。 1) 在发送一个 ARP 分组之前,源主机首先根据目的 IP 地址,在本地 ARP 高速缓存表 中查找与之对应的目的物理地址。 如果找到对应的物理地址, 就不用进行地址解析, 否则需要进行地址解析。 2) 实现地址解析的第一步是产生 ARP 请求分组。 在相应的字段写入本地主机的源物理 地址、源 IP 地址,在目的物理地址字段写入 0,并在操作字段写入 1。 3) 将 ARP 分组发送到本地的数据链路层,并封装成帧。以源物理地址作为源地址,以
课程设计任务书
学院 学生姓名 设计题目 计算机科学与技术学院 专业 学号 通信工程
解析 ARP 数据包
内容及要求:
1. 2. 3. 本课程以教师讲授和学生自学同步的方式进行,学校可提供上机操作,提高实际操 作,设计能力。主要功能为设计程序,实现程序 在完成基本技巧的讲解后,学号尾号相同的同学自行分成一组,布置不同的题目。 学生独立完成 教师面对面当场检查学生掌握程序情况, 根据学生的学习情况及题目的完成情况评 定成绩。
2.
流程图如图所示:
开始
获取网卡列表
选 取 Ethernet 网 打开网卡(混杂模式)
编译设置过滤器Βιβλιοθήκη 捕获 ARP 包并将其 相应内容输出
3. 核心代码 ARP 数据包结构
struct arppkt{ unsigned short hdtyp; unsigned short protyp; unsigned char hdsize; unsigned short op; u_char smac[6]; u_char sip[4]; u_char dmac[6]; u_char dip[4]; }; //硬件类型。值 0001 表示其为 Ethernet //协议类型。值 0800 表示上层协议为 IP //硬件地址长度。值为 06 //操作值为 0001/0002,分别表示 ARP 请求/应答 //源 MAC 地址,6B //源 IP 地址,4B //目的 MAC 地址 //目的 IP 地址
unsigned char prosize; //协议地址长度。值为 04
获取网络设备列表,并以混杂模式打开网络设备
//获取网络设备列表 if(pcap_findalldevs(&alldevs,errbuf)==-1) { cout<<"Error in pcap_findalldevs:"<<errbuf; return; } //选择 Ethernet 卡 for(d=alldevs;d;d=d->next)
进度安排:
第一阶段:在学校计算机房掌握 Visual C++6.0 的基本使用。 第二阶段:学生自己解决上机,安装软件,自己在杂志,专业资料上参考,完成 调试运行并打印出来,添加封面,完成课程设计。
指导教师(签字) :
学院院长(签字) :
年
月
日
年
月
日
目录
1. 课程设计目的………………………………………2 2. 课程设计要求………………………………………2 3. 相关知识………………………………………………2 1) ARP 数据报的消息格式……………………3 2) ARP 协议的工作流程………………………..4 4. 课程设计分析……………………………………….5 1) 课程设计中的重点及难点………………..5 2) 参考算法………….……………………………….6 3) 核心代码…………………………………………..7 5. 相关扩展………………………………………………8 6. 心得体会………………………………………………10 7. 参考文献………………………………………………11