网络协议分析获取并解析ARP_第1页
网络协议分析获取并解析ARP_第2页
网络协议分析获取并解析ARP_第3页
网络协议分析获取并解析ARP_第4页
网络协议分析获取并解析ARP_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、成绩:网络协议分析报告题目:获取并解析网络中的ARP数据包学院:计算机科学与技术学院专业:计算机科学与技术班级:0411203学号:2012211699姓名:李传根1、 要求及功能 编程序,获取网络中的ARP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。运行格式:程序名 日志文件2、 原理及方法 2.0什么是ARP地址解析协议(Address Resolution Protocol,ARP)是在仅知道主机的IP地址时确定其物理地址的一种协议。因IPv4和以太网的广泛应用,其主要用作将IP地址翻译为以太网的MAC地址,但其也能在ATM和FDDIIP网络中使用。从IP地址到

2、物理地址的映射有两种方式:表格方式和非表格方式。ARP具体说来就是将网络层(IP层,也就是相当于OSI的第三层)地址解析为数据连接层(MAC层,也就是相当于OSI的第二层)的MAC地址。在以太网协议中规定,同一局域网中的一台主机要和另一台主机进行直接通信,必须要知道目标主机的MAC地址。而在TCP/IP协议栈中,网络层和传输层只关心目标主机的IP地址。这就导致在以太网中使用IP协议时,数据链路层的以太网协议接到上层IP协议提供的数据中,只包含目的主机的IP地址。于是需要一种方法,根据目的主机的IP地址,获得其MAC地址。这就是ARP协议要做的事情。所谓地址解析(address resoluti

3、on)就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。 另外,当发送主机和目的主机不在同一个局域网中时,即便知道目的主机的MAC地址,两者也不能直接通信,必须经过路由转发才可以。所以此时,发送主机通过ARP协议获得的将不是目的主机的真实MAC地址,而是一台可以通往局域网外的路由器的某个端口的MAC地址。于是此后发送主机发往目的主机的所有帧,都将发往该路由器,通过它向外发送。这种情况称为ARP代理(ARP Proxy)。2.1、ARP协议及工作原理ARP协议是“Address Resolution Protocol”(地址解析协议)的缩写。在局域网中,网络中实际传输的是“帧”,帧里面

4、是有目标主机的MAC地址的。在以太网中,一个主机要和另一个主机进行直接通信,必须要知道目标主机的MAC地址。但这个目标MAC地址是如何获得的呢?它就是通过地址解析协议获得的。所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。ARP的基本运行过程:1、 主机A希望发送数据分组给主机B,但不知道B的物理地址。2、 A发送广播报文,要求B主机用用他的物理地址来响应。3、 网站上所有的主机都接收到这个分组。4、 B识别自己的IP地址,发送响应报文,告诉A自己的物理地址。2.2、AR

5、P 的分组格式物理帧头(14B)ARP帧结构(28B)填充数据(18B)CRC(4B)图一 ARP分组格式目的MAC(6B)源MAC(6B)类型(2B) 图二 物理帧头0 8 16 24 32硬件类型(Ethernet:0x1)上层协议类型(IP:0x0800)硬件地址长度(0x6)IP地址长度(0x4)操作(请求:0x1;应答:0x2)源MAC地址源MAC地址源IP地址源IP地址目的MAC地址目的MAC地址目的IP地址图三 ARP帧结构2.3工作原理源主机在传输数据前,首先要对数据进行封装,在该过程中会把目的主机的IP地址和MAC地址封装进去。在通信的初始阶段,我们能够知道目的主机的IP地址

6、,而MAC地址是不知道的。这时如果目的主机和源主机在同一网络内,源主机会以第二层广播的方式发送ARP请求报文。ARP请求报文中含有源主机的IP地址和MAC地址,以及目的主机的IP地址。当报文通过广播的方式到达目的主机时,目的主机会响应请求报文,并返回ARP响应报文,从而源主机就可以获得目的主机的MAC地址,同样目的主机也可以获得源主机的MAC地址。如果目的主机和源主机地址不在同一个网络中,源主机发送的IP数据包会送到交换机的默认网关,而默认网关的MAC地址同样可以通过ARP协议获取。经过ARP协议解析IP地址之后,主机会在缓存中保存IP地址和MAC地址的映射条目,此后再进行数据交换只要从缓存中

7、读取映射条目即可。2.4 ARP包的填充将命令行的参数作适当的转换后填到ARP分组结构的个字段中即可。要注意的是,填充请求包时,因为包要在Ethernet上广播,所以,物理帧头的“目的MAC”字段要填充为FFFFFFFFFFFF;而ARP帧结构中的目的MAC可填充任意值,因为它此时不起作用。“填充数据”字段要填充为0。3、 源程序核心函数说明#include<conio.h>#include<fstream.h>#include<iomanip.h>#include"pcap.h"#include<winsock2.h>#pr

8、agma comment(lib,"ws2_32.lib")#pragma comment(lib,"wpcap.lib")/定义ARP包数据struct arppktunsigned short hdtyp; /硬件类型unsigned short protyp; /协议类型unsigned char hdsize; /硬件地址长度unsigned char prosize; /协议地址长度unsigned short op; /(操作类型)操作值: ARP/RARPu_char smac6; /源MAC地址u_char sip4; /源IP地址u_c

9、har dmac6; /目的MAC地址u_char dip4; /目的IP地址;void packet_handler(const pcap_pkthdr *header,const u_char *pkt_data,ostream& out) /从ARP包中找到头部位置 arppkt* arph = (arppkt *)(pkt_data +14);/输出源IP地址 for(int i=0;i<3;i+) out<<int(arph->sipi)<<'.' out.setf(ios:left); out<<setw(3)

10、<<int(arph->sip3)<<" " out.unsetf(ios:left);/输出源MAC地址char oldfillchar=out.fill('0');out.setf(ios:uppercase); for(i=0;i<5;i+) out<<hex<<setw(2)<<int(arph->smaci)<<'-' out<<hex<<setw(2)<<int(arph->smac5)<<

11、;" " out.fill(oldfillchar); out.unsetf(ios:hex|ios:uppercase);/输出目的IP地址 for(i=0;i<3;i+) out<<int(arph->dip3)<<'.'out.unsetf(ios:left);out<<setw(3)<<int(arph->dip3)<<' 'out.unsetf(ios:left);/输出目的MAC地址out.fill('0');out.setf(ios:u

12、ppercase);for(i=0;i<5;i+) out<<hex<<setw(2)<<int(arph->dmaci)<<'-'out<<hex<<setw(2)<<int(arph->dmac5)<<" "out.fill(oldfillchar);out.unsetf(ios:hex|ios:uppercase);/输出操作类型out<<ntohs(arph->op)<<" "/输出操作时

13、间struct tm *ltime;ltime=localtime(&header->ts.tv_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 )/命令

14、行参数/检查输入命令格式if(argc!=2)cout<<"Please input command: ParseArp output_file"<<endl;return;/初始化网络设备相关参数pcap_if_t *alldevs;pcap_if_t *d;pcap_t *adhandle;char errbufPCAP_ERRBUF_SIZE;u_int netmask;char packet_filter="ether proto arp"struct bpf_program fcode;struct pcap_pkthd

15、r *header;const u_char *pkt_data;/获取网络设备列表if(pcap_findalldevs(&alldevs,errbuf)=-1)cout<<"Error in pcap_findalldevs:"<<errbuf;return;/选取一个Ethernet网卡for(d=alldevs;d;d=d->next) /网卡设为混杂模式,接收所有帧if(adhandle=pcap_open_live(d->name,1000,1,300,errbuf)=NULL)cout<<"nU

16、nable to open the adapter."pcap_freealldevs(alldevs);return;/检查数据链路是否为Ethernetif(pcap_datalink(adhandle)=DLT_EN10MB&&d->addresses!=NULL)break;if(d=NULL) cout<<"nNo interfaces found! Make sure Winpcap is installed.n" return;/获得子网掩码netmask=(sockaddr_in *)(d->addresse

17、s->netmask)->sin_addr.S_un.S_addr;/编译过滤器,只捕获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<<&q

18、uot;nError setting the filter.n" pcap_freealldevs(alldevs); return;/显示提示信息及每项含义cout<<"listening on "<<d->description<<"."<<endl<<endl;ofstream fout(argv1,ios:app); /日志记录文件/为了查看日志时的方便,其中加入了日期记录time_t t;time(&t);fout.seekp(0,ios:end);if(fou

19、t.tellp()!=0) fout<<endl;fout<<"ttARP request(1)/reply(2) on"<<ctime(&t);cout<<"Sour Ip Addr"<<" "<<"Sour MAC Address" <<" "<<"Des Ip Addr"<<" "<<"Des MAC Addres

20、s"<<" "<<"OP"<<" "<<"Time"<<endl;fout<<"Sour Ip Addr"<<" "<<"Sour MAC Address" <<" "<<"Des Ip Addr"<<" "<<"Des MAC Add

21、ress" <<" "<<"OP"<<" "<<"Time"<<endl;/释放设备列表pcap_freealldevs(alldevs);/开始截获ARP包int result;while(result=pcap_next_ex(adhandle,&header,&pkt_data)>=0) /循环解析ARP数据包 if(result=0) continue;/解析ARP包,结果输出到屏幕与文件 packet_handle

22、r(header,pkt_data,cout); packet_handler(header,pkt_data,fout);4、 实验环境及平台搭建操作系统:windows 8运行环境:Microsoft Visual C+ 6.0 开发包:wincap SDK,以及最新platform SDK的一些库文件1. 把wincap SDK里面的库文件以及lib包含到源程序中,避免包含wincap头文件时出现找不到头文件的错误具体方法:在菜单栏中->工具->选项>目录,然后选择include要包含的库的路径2. 下载最新platform SDK里面的部分库文件strsafe.h,然

23、后添加到vc6.0安装目录里面的include文件夹里面,源程序需要用到这个头文件,但是vc6.0里面没有这个开发语言:C语言,C+5、 实验结果及分析实验结果:相关扩展与分析:算法和代码提示:调用socket()打开协议簇为PF_PACKET的原始套接字,这样我们就可以收到数据链路帧:int fd = socket(PF_PACKET,SOCK_RAM,htons(ETH_P_ALL);对打开的套接字调用ioct1(),将网卡设置为混杂模式,这样我们就可以接受到局域网中所有的包(包括目的地址不是本机的帧): struct ifreq req; memset (&req,0,sizeo

24、f(req); strncpy(req.ifr_name,”eth0”,strlen(“eth0”)+1); ioctl(fd,SIOCGIFFLAS,&req); req.ifr_flags|=IFF_PROMISC; /设置为混杂模式 icotl(fd, SIOCGIFFLAGS,&req);利用recvfrom()接收包:recvform(fd,buffer,sizeof(buffer),0,(struct sockaddr *)&from,&from_len);接收到包后,判断是否为ARP包,若是ARP包则进行处理,否则丢弃。If( (ntohs(eth_header->ether_type)=0x0806) &&(ntohs(arp_header-&g

温馨提示

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

评论

0/150

提交评论