解析ARP数据包长沙理工大学.docx
《解析ARP数据包长沙理工大学.docx》由会员分享,可在线阅读,更多相关《解析ARP数据包长沙理工大学.docx(10页珍藏版)》请在冰豆网上搜索。
解析ARP数据包长沙理工大学
长沙理工大学信息学院课程设计
课程设计题目:
解析ARP数据包
计划学时:
2周
所属课程名称:
计算机网络课程设计
开设时间:
2010学年第一学期
授课班级:
07软件R3
指导教师:
**
学生姓名:
***
学号:
*************
信息学院
评分
标准
封面格式
(5%)
正文格式
(10%)
题目理解准确度
(30%)
程序设计质量
(30%)
设计报告质量
(25%)
得分
总分
解析ARP数据包
摘要:
本文首先介绍了地址解析协议ARP的概念,详细说明了ARP的工作原理,ARP攻击的基本原理,详细分解了ARP数据包的各个字段含义,ARP协议工作的流程和这次课程设计的意义与目的;接着描述了此实验的总体设计;然后是详细设计,分析讲解了实现代码的主要部分;最后还讲了做这次课程设计的个人总结,谈了一些个人观点。
关键字:
ARP数据包、工作原理、ARP攻击、解析、截获、功能
1引言
1.1背景
首先,我们来了解一下什么是ARP,ARP的工作原理以及ARP攻击所带来的危害。
1.1.1什么是ARP
地址解析协议(AddressResolutionProtocol,ARP)是在仅知道主机的IP地址时确定其物理地址的一种协议。
因IPv4和以太网的广泛应用,其主要用作将IP地址翻译为以太网的MAC地址,但其也能在ATM和FDDIIP网络中使用。
从IP地址到物理地址的映射有两种方式:
表格方式和非表格方式。
ARP具体说来就是将网络层(IP层,也就是相当于OSI的第三层)地址解析为数据连接层(MAC层,也就是相当于OSI的第二层)的MAC地址。
在以太网协议中规定,同一局域网中的一台主机要和另一台主机进行直接通信,必须要知道目标主机的MAC地址。
而在TCP/IP协议栈中,网络层和传输层只关心目标主机的IP地址。
这就导致在以太网中使用IP协议时,数据链路层的以太网协议接到上层IP协议提供的数据中,只包含目的主机的IP地址。
于是需要一种方法,根据目的主机的IP地址,获得其MAC地址。
这就是ARP协议要做的事情。
所谓地址解析(addressresolution)就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。
另外,当发送主机和目的主机不在同一个局域网中时,即便知道目的主机的MAC地址,两者也不能直接通信,必须经过路由转发才可以。
所以此时,发送主机通过ARP协议获得的将不是目的主机的真实MAC地址,而是一台可以通往局域网外的路由器的某个端口的MAC地址。
于是此后发送主机发往目的主机的所有帧,都将发往该路由器,通过它向外发送。
这种情况称为ARP代理(ARPProxy)。
1.1.2ARP工作原理
程序的具体要求如下所示:
1)以命令行的形式运行,如下所示:
arpparse logfile
其中,arpparse为程序名;logfile为日志文件名。
2)程序输出内容如下所示:
源IP地址 源MAC地址 目的IP地址 目的MAC地址 操作 时间
各部分的说明如下所示:
?
源IP地址:
输出ARP消息格式中的源IP地址字段。
?
源MAC地址:
输出ARP消息格式中的源物理地址字段
?
目的IP地址:
输出ARP消息格式中的目的IP地址字段。
?
目的MAC地址:
输出ARP消息格式中的目的物理地址字段。
?
操作:
输出ARP消息格式中的操作字段,若为ARP请求,则为1,若为ARP应答,则为2。
?
时间:
该ARP包产生的时间。
3)当程序接收到键盘输入Ctrl十C时退出。
三.ARP协议工作原理
我们都知道以太网设备比如网卡都有自己全球唯一的MAC地址,它们是以MAC地址来传输以太网数据包的,但是它们却识别不了我们IP包中的IP地址,所以我们在以太网中进行IP通信的时候就需要一个协议来建立IP地址与MAC地址的对应关系,以使IP数据包能发到一个确定的地方去。
这就是ARP(AddressResolutionProtocol,地址解析协议)。
四.ARP包的格式
?
/P>
帧头部帧数据ARP消息
14B
ARP数据包封装成一个帧
物理帧头格式
ARP数据包格式
五.ARP协议工作流程
1.首先,每台主机都会在自己的ARP缓冲区(ARPCache)中建立一个ARP列表,以表示IP地址和MAC地址的对应关系。
2.当源主机需要将一个数据包要发送到目的主机时,会首先检查自己ARP列表中是否存在该IP地址对应的MAC地址,如果有﹐就直接将数据包发送到这个MAC地址;如果没有,就向本地网段发起一个ARP请求的广播包,查询此目的主机对应的MAC地址。
此ARP请求数据包里包括源主机的IP地址、硬件地址、以及目的主机的IP地址。
3.网络中所有的主机收到这个ARP请求后,会检查数据包中的目的IP是否和自己的IP地址一致。
如果不相同就忽略此数据包;如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已经存在该IP的信息,则将其覆盖,然后给源主机发送一个ARP响应数据包,告诉对方自己是它需要查找的MAC地址;
1.1.4ARP包的格式
ARP(同RARP)使用相同的报头结构,如图2所示。
图2ARP(RARP)包头结构
硬件类型字段:
指明了发送方想知道的硬件接口类型,以太网的值为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地址。
1.1.5ARP协议工作流程
1.首先,每台主机都会在自己的ARP缓冲区(ARPCache)中建立一个ARP列表,以表示IP地址和MAC地址的对应关系。
2.当源主机需要将一个数据包要发送到目的主机时,会首先检查自己ARP列表中是否存在该IP地址对应的MAC地址,如果有﹐就直接将数据包发送到这个MAC地址;如果没有,就向本地网段发起一个ARP请求的广播包,查询此目的主机对应的MAC地址。
此ARP请求数据包里包括源主机的IP地址、硬件地址、以及目的主机的IP地址。
3.网络中所有的主机收到这个ARP请求后,会检查数据包中的目的IP是否和自己的IP地址一致。
如果不相同就忽略此数据包;如果相同,该主机首先将发送端的MAC地址和IP地址添加到自己的ARP列表中,如果ARP表中已经存在该IP的信息,则将其覆盖,然后给源主机发送一个ARP响应数据包,告诉对方自己是它需要查找的MAC地址;
4.源主机收到这个ARP响应数据包后,将得到的目的主机的IP地址和MAC地址添加到自己的ARP列表中,并利用此信息开始数据的传输。
如果源主机一直没有收到ARP响应数据包,表示ARP查询失败。
1.2意义与目的
这次课程设计的意义与目的主要有以下两点:
1、我们已经学习了一个学期的计算机网络课程,在网络协议体系结构中,不管采用哪一种划分形式,网络层都是作为独立的一层,可见其在网络通信中的重要性。
在网络层中有对重要协议:
ARP/RARP,用于网卡物理地址(MAC地址)与网络协议地址(IP地址)之间的转换。
通过这个课程设计,加深对课本知识的理解与掌握,同时自己亲自动手实现,对知识的领悟能够起到事半功倍的效果。
2、认识ARP地址解析协议的工作原理,了解ARP攻击(ARP欺骗)的实现原理,找到解决ARP攻击的有效解决方案,为局域网计算机提供一个安全的运行环境,以及在不小心被攻击时知道如何处理。
2总体设计
2.1系统或算法框架设计
1.得到网络驱动.利用PCAP提供的PCAP_findalldevs()函数实现此功能.
2.选择一块网卡,并判断其是否可用.
3.编辑设置过滤器,使其只捕获ARP包.过滤函数PCAP_complie和PCAP_setfilter.设置函数为PCAP_setfilter().
4.开始捕获数据包并进行处理.使用PCAP_next_ex()函数实现此功能.
2.2功能设计
通过编制程序,获取网络中的ARP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。
程序的具体要求如下所示:
1)以命令行的形式运行,如下所示:
arp1.exe log.txt
其中,arp1.exe为程序名;log.txt为日志文件名。
2)程序输出内容如下所示:
源IP地址 源MAC地址 目的IP地址 目的MAC地址 操作 时间
各部分的说明如下所示:
1、源IP地址:
输出ARP消息格式中的源IP地址字段。
2、源MAC地址:
输出ARP消息格式中的源物理地址字段
3、目的IP地址:
输出ARP消息格式中的目的IP地址字段。
4、目的MAC地址:
输出ARP消息格式中的目的物理地址字段。
5、操作:
输出ARP消息格式中的操作字段,若为ARP请求,则为1,若为ARP应答,则为2。
6、时间:
该ARP包产生的时间。
3)当程序接收到键盘输入Ctrl十C时退出。
2.3平台设计
Windows7,MicrosoftMicrosoftVisualC++6.0简体中文版,WinPcap_4_1_2,WpdPack_4_1_2
2.4数据结构的设计
解析ARP数据包
(一)—源代码
(2011-04-1515:
55:
58)
转载▼
标签:
杂谈
分类:
学习专区
#include
#pragmacomment(lib,"Ws2_32.lib")//使用ntohs()函数,转换2B/4B的数据
#pragmacomment(lib,"wpcap.lib")
#include"pcap.h"//需要另外导入,具体步骤见Winpcap使用说明
#include
#include//格式化输出
#include//使用_getch()
structarppkt{
unsignedshorthdtyp;//硬件地址
unsignedshortprotyp;//协议类型
unsignedcharhdsize;//硬件地址长度
unsignedcharprosize;//协议地址长度
unsignedshortop;//操作值
u_charsmac[6];//源MAC地址
u_charsip[4];//源IP地址
u_chardmac[6];//目的MAC地址
u_chardip[4];//目的IP地址
};
//自定义处理包函数
//pcap_pkthdr是winpcap加入的
//pkt_data表示MAC帧的起始位置
//out是输入流
voidpacket_handler(constpcap_pkthdr*header,constu_char*pkt_data,ostream&);
voidmain(intargc,char*argv[])
{
if(argc!
=2)
{
cout<<"usage:
arpparselogfilename"<cout<<"pressanykeytocontinue."<_getch();
return;
}
pcap_if_t*alldevs;//网络设备结构
pcap_if_t*d;
pcap_t*adhandle;
charerrbuf[PCAP_ERRBUF_SIZE];//错误信息
u_intnetmask;//子网掩码
charpacket_filter[]="etherproto\\arp";//过滤,选择ARP协议
structbpf_programfcode;
structpcap_pkthdr*header;
constu_char*pkt_data;
//获取网络设备列表
if(pcap_findalldevs(&alldevs,errbuf)==-1)
{
cout<<"Errorinpcap_findalldevs:
"<return;
}
//选择一个Ethernetka卡
for(d=alldevs;d;d=d->next)
{
//以混杂模式打开网卡,接受所有的帧
if((adhandle=pcap_open_live(d->name,1000,1,300,errbuf))==NULL)
{
cout<<"\nUnabletoopentheadapter.";
pcap_freealldevs(alldevs);//释放设备列表
return;
}
if(pcap_datalink(adhandle)==DLT_EN10MB&&d->addresses!
=NULL)
break;
}
if(d==NULL)
{
cout<<"\nNOinterfacesfound!
Makesurewinpcapisinstalled.\n";
return;
}
//获得子网掩码
netmask=((sockaddr_in*)(d->addresses->netmask))->sin_addr.S_un.S_addr;
//调试过滤器,只捕获ARP包
if(pcap_compile(adhandle,&fcode,packet_filter,1,netmask)<0)
{
cout<<"\nUnabletocompilethepacketfilter.Checkthesyntax.\n";
pcap_freealldevs(alldevs);
return;
}
//设置过滤器
if(pcap_setfilter(adhandle,&fcode)<0)
{
cout<<"\nErrorsettingthefilter.\n";
pcap_freealldevs(alldevs);
return;
}
cout<<"\t\tlisteningon"<description<<"..."<ofstreamfout(argv[1],ios:
:
app);//日志记录文件
//加入日期记录
time_tt;
time(&t);
fout.seekp(0,ios:
:
end);
if(fout.tellp()!
=0)
4总结
4.1工作小结
结合上述分析,
对于部分从事网络管理的人员,
当需要对某些网络软件或游
戏进行控制时,就需要用
Ethereal
来分析其使用的协议、端口号和服务器
IP
地
址等,
然后再利用访问控制或防火墙等其他技术来达到对网络用户进行控制和管
理的目的。
例如,如果知道
QQ
客户端和服务器端使用的端口分别是
4000
和
8000
,则
可以在访问控制列表中设置不允许这两个端口的数据通过,这样就达到了禁止
QQ
的目的。
如果不允许使用
HTTP
协议来浏览网页,则可以在防火墙中禁止
HTTP
协议的数据包通过。
如果不允许用户浏览某
IP
地址,则可以在防火墙中
设置该
IP
地址过滤。
如果要禁止用户使用网络游戏,则可以通过该抓包工具分
析出该游戏使用的固定端口号或
IP
地址,然后禁用即可。
4.2存在的问题
1、本程序是在命令行模式下运行,界面不美观,并且只有在输入正确参数时才能正确执行,而且如果局域网的用户开启了防火墙的话也无法正常执行。
一般情况下,程序执行时间很长,直到用户自己结束程序。
2、编译环境配置比较麻烦,虽然Winpcap功能强大,效率高,使用方便,但是,使用前的准备工作要费一番功夫,步骤如下:
步骤1:
安装驱动程序。
下载WinPcapDriver和DLL并安装,安装后重启机器。
步骤2:
下载wpdpack(Developer’spack)。
解压后会看到其中包含了docs、Include、lib、Examples等文件夹。
步骤3:
在VC中设定Include目录及Library目录。
具体做法:
打开VC后,Tools->Option->Directories,在includefiles中添加……\wpdpack\Include目录(步骤2中得到的);在Libraryfiles中添加……\wpdpack\Lib目录。
步骤4:
Project->settings->Link,在Object/librarymodules中加上wpcap.lib。
4.3改进的方法
1、以图形化界面设计,改善程序运行时的视觉效果,同时图形化界面操作简单,界面友好,也方便非计算机专业人员的使用。
2、由于本程序所使用的头文件和链接库(WinPcap_4_1_2,WpdPack_4_1_2)在大多数电脑中都是没有的,若没有安装WinPcap_4_1_2,可能会影响程序的正确执行,所以应该尽量使用系统提供的应用程序编程接口。
4.4参考文献
1、计算机网络(第五版),谢希仁编著,电子工业出版社,2009年5月第7次印刷。
2、XX百科