计算机网络课设报告解析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。
计算机网络课设报告解析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地址的条件下,得到⽬的主机或设备的物理地址。
arpspoof原理分析源码分析
arpspoof原理分析源码分析从main函数开始⾸先⼤家不要慌,我加了⽆数注释,这个⼯具的代码也不过400⾏⽽已。
⾸先我们看⼀下main函数:为了避免⼤家看起来太紧张,我在源码的注释中加了详细的讲解,⽅便基础薄弱的同学理解:1int main(int argc, char *argv[])2 {3int c;4char ebuf[PCAP_ERRBUF_SIZE];5 intf = NULL;6 spoof_ip = target_ip = 0;78/**9关于getopt这个函数我想做如下解释⼤家就可以读懂下⾯的函数的具体意思了:10 1.getopt的⽤途:⽤于专门处理函数参数的。
11 2.getopt的⽤法:argc与argv直接是从main的参数中拿下来的,第三个参数描述了整个程序参数的命令要求12具体的⽤法我们可以先理解为要求i,t这两个参数必须有值13然后有具体值得参数会把值付给全局变量optarg,这样我们就能理解下⾯的while循环中的操作了14*/15while ((c = getopt(argc, argv, "i:t:h?V")) != -1) {1617switch (c) {1819case'i':20 intf = optarg;21break;22case't':23/*24 libnet_name_resolve是解析域名,然后把域名解析的结果形成ip地址返回到target_ip25*/26if ((target_ip = libnet_name_resolve(optarg, 1)) == -1)27 usage();28break;29default:30 usage();3132 }3334 }3536 argc -= optind;37 argv += optind;3839if (argc != 1)40 usage();4142if ((spoof_ip = libnet_name_resolve(argv[0], 1)) == -1)43 usage();4445/*46 pcap_lookupdev 顾名思义这个pcap库中的函数是⽤来寻找本机的可⽤⽹络设备。
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协议在物联网等新兴领域的应用。
国家开放大学《计算机网络》课程实验报告(实验六 计算机网络综合性实验)
计算机网络实验报告实验时间:参加人员:一、实验名称:实验六计算机网络综合性实验;二、实验内容1. 任意捕获一个数据包,分析其数据链路层格式、网络层格式和传输层格式,加深学生对计算机网络分层概念的理解。
2. 地址解析协议(ARP)是LAN 环境中最重要的协议之一。
ARP 允许你的网络上使用的设备自动将物理(MAC)地址映射为IP 地址,因此需要对ARP 有很详细的了解,并清楚它是怎样工作的。
3. 传输控制协议(TCP)是互联网上最常用的协议,TCP 可以保证数据传输的可靠性。
很多互联网服务,比如HTTP、FTP、SMTP 和Telnet,都要依靠TCP 来传输数据。
另外,很多传统的LAN 程序,比如文件传输和SQL 也都要使用TCP 协议。
三、实验步骤1.捕获报文基本分析实验(1)打开SnifferPro程序后,选择Capture(捕获)→Start(开始),或者使用F10键,或者是工具栏上的开始箭头。
图1 SnifferPro软件界面(2)一小段时间过后,再次进入Capture(捕获)菜单,然后选择Stop(停止)或者按下F10键,还可以使用工具栏。
(3)按F9键来执行“停止并显示”的功能,或者可以进入Capture(捕获)菜单,选择“停止并显示”。
(4)停止捕获后,在对话框最下角增加了一组窗口卷标,包括高级、解码、矩阵、主机表单、协议分布和统计信息。
(5)选择解码卷标,可以看到SnifferPro缓冲器中的所有实际“数据”。
分析该卷标结构及其内容。
2.捕获并分析地址解析协议(ARP)(1)选择“捕获”→“定义过滤器”。
(2)在“定义过滤器”中,选择“文件”→“新建”。
(3)将这个文件命名为ARP,单击OK,然后单击“完成”。
(4)现在选择“高级”,从协议列表中选择ARP。
(5)单击OK,关闭定义过滤器窗口。
已经定义了过滤器,可以按F10来捕获流量。
(6)输入arp-dIP来清除默认网关上的ap,这个命令中的IP是你的默认网关IP地址,然后Ping你的默认网关。
实验四:ARP分析报告及路由协议详情分析报告
计算机科学与技术学院计算机网络实验报告年级 2013 学号 2013434151汪凡成绩专业计算机科学与技术实验地点 C1-422 指导教师常卓实验项目实验3.3:ARP分析实验3.5:路由协议分析实验日期 2016/5/6实验3.3:ARP分析一、实验目的1.掌握根本的ARP命令。
2.熟悉ARP报文格式和数据封装方式。
3.理解ARP的工作原理。
二、实验原理(1)ARP简介1.什么是ARPARP,即地址解析协议。
TCP/IP网络使用ARP实现IP地址到MAC地址的动态解析。
网络层使用逻辑地址〔IP地址〕作为互联网的编址方案,但实际的物理网络〔以太网〕采用硬件地址〔MAC地址〕来唯一识别设备。
因此在实际网络的链路上传送数据帧时,最终还是必须使用硬件地址〔MAC地址)。
①ARP工作原理每个主机和路由器的存中都设有一个ARP高速缓存,用于存放其他设备的IP地址到物理地址的映射表。
当主机欲向本局域网上其他主机发送IP包时,先在本地ARP缓存中查看是否有对方的MAC地址信息。
如果没有,如此ARP会在网络中广播一个ARP请求,拥有该目标IP地址的设备将自动发回一个ARP 回应,对应的MAC地址将记录到主机的ARP缓存中。
考虑到一个网络可能经常有设备动态参加或者撤出,并且更换设备的网卡或IP地址也都会引起主机地址映射发生变化,因此,ARP缓存定时器将会删除在指定时间段未使用的ARP 条目,具体时间因设备而异。
例如,有些Windows操作系统存储ARP缓存条目的时间为2mim但如果该条目在这段时间被再次使用,其ARP定时器将延长至lOmin。
ARP缓存可以提高工作效率。
如果没有缓存,每当有数据帧进入网络时,ARP都必须不断请求地址转换,这样会延长通信时间,甚至造成网络拥塞。
反之,保存时间过长也可能导致离开网络或者更改第3层地址的设备出错。
ARP可解决同一个局域网上的主机或路由器的IP地址和硬件地址的映射问题。
如果所要找的主机和源主机不在同一个局域网上,那么就要通过ARP找到一个位于本局域网上的某个路由器的硬件地址,然后把分组发送给这个路由器,让这个路由器把分组转发给下一个网络。
internet技术实验报告 验证地址解析协议ARP工作过程
实验报告验证地址解析协议ARP工作过程操作系统:主机PC0:Windows XP主机PC1:Windows 7网络环境:主机PC0与主机PC1同属于一个局域网,同时都与Internet互联(校园网)(使用packet tracer软件绘制)PC1:2、用arp -d命令清除两台主机上的ARP表,然后在PC0与PC1上分别用ping 命令与对方通信PC0 清空ARP告诉缓存后先查看一下PC0的MAC地址:PC1 清空ARP告诉缓存后先查看一下PC1的MAC地址:在PC0上执行ping命令查看是否能够和PC1互通:结论:PC0和PC1成功ping通。
在PC1上执行ping命令查看是否能够和PC0互通:结论:PC1和PC0成功ping通。
3、用arp -a命令在两台PC上分别看到对方的MAC地址PC0主机上:PC1主机上:分析:PC0和PC1在设置时同属于一个局域网网段。
在执行ping命令的时候(此处以PC0 ping PC1为例),PC0先向整个网段中广播ARP包,询问IP为118.229.207.175(PC1)的主机的MAC地址;此时网段中的PC1收到包后比对自己的IP地址发现符合条件,于是给PC1回一个ARP包告诉PC0自己的MAC地址,这时候PC0就会向PC1发送4个ECHO报文完成ping命令。
PC1收到这样的ICMP 报文后广播一个ARP包询问PC0的(118.229.207.177)MAC地址,得到后会向PC0回复ECHO报文,完成整个通信过程。
4、将PC0的子网掩码设为255.255.255.0,如下图所示:PC0:5、用arp -d命令清除两台主机上的ARP表,然后在PC0上"ping"PC1,观察并分析结果。
用arp -a命令在两台PC上均不能看到对方的MAC地址PC0主机:结论:目标主机不可达,传输失败。
用arp –a查看MAC地址:6、接着在PC1上"ping"PC0,观察并分析结果结论:提示请求超时,传输失败。
解析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地址。
计算机网络课程设计报告
计算机网络课程设计华中科技大学信息学部软件姓名:专业班级:学号:指导老师:目录一、课程的性质、目的和任务 (3)二、课程内容和基本要求 (3)(一)、协议包的分析,网络协议的组成 (3)1、捕获ARP请求,ARP应答数据包 (3)2、捕获ICMP数据包,对其进行分析研究 (4)3、捕获TCP“三次握手”“2次两次握手”释放连接数据包 (6)4、捕获HTTP,DNS,DHCP数据包,分析其构成 (10)5、通过捕捉smtp协议包捕捉邮箱密码 (15)小结 (15)(二)、编写一个程序自动生成CRC校验码 (15)程序代码: (15)编译运行 (16)(三)、机架实验 (17)小结 (17)(四)、模拟学校校园网 (17)校园网拓扑图 (17)网络测试 (18)小结 (22)一、课程的性质、目的和任务该课程为实践类课程。
通过本课程,(1)学生需要深入理解网络协议的组成,对网络中传输数据的过程有更深入的认识。
(2)学生需要了解计算机网络工程设计的一般任务,明确计算机网络设计与建设的基本原则,熟悉计算机网络需求分析的目标、任务与方法,掌握计算机网络设计的通用方法,并学会撰写规范的计算机网络方案书。
二、课程内容和基本要求(一)、协议包的分析,网络协议的组成1、捕获ARP请求,ARP应答数据包,分析其组成特征。
总结ARP协议运行的基本过程。
本机(192.168.84.69)ping目的主机(192.168.84.39):抓包截图:本机192.168.84.69 源MAC地址 c8:9c:dc:59:39:30目的主机 192.168.84.39 目的MAC地址 c8:9c:dc:5a:2b:57ARP协议运行过程:ARP进程在本局域网上发送ARP请求,目的主机在ARP 请求分组里看到自己的IP,就发送一个响应分组,写入自己的硬件地址。
2、捕获ICMP数据包,对其进行分析研究。
(icmp请求数据包,icmp应答数据包)Ping 进行ICMP数据包截获ICMP请求数据包:TYPE:8CODE:0 CHECKSUM :0X225CICMP应答数据包:TYPE:0CODE:0CHECKSUM :0X2A5CICMP协议数据包对IP分组在传送时出现的异常情况进行报告,对IP报文传输时出现的差错、拥塞、路由改变、以及路由器或主机信息的获取等情况,向源端主机提交报告,由源主机采取相应措施,改进传输质量。
计算机网络课程设计(第六章)解析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.利用捕获软件捕获数据包,并对数据包进行分析二、任务要求要求分析的协议包括:ARP, ICMP, FTP以及HTTP报文1、对捕获的数据包结构进行分析2、对帧头,IP头、TCP头中的各项进行分析3、分析TCP连接的3次握手和4次挥手过程4、对于FTP用分析出控制连接建立,数据连接建立,数据连接释放,控制连接释放的全过程5、ARP协议要能完整的分析ARP查询以及返回的信息6、对典型的ICMP协议报文进行分析(ping ,tracert等应用)7、对TCP/IP协议体系结构的工作过程和协议分布进行充分认识。
三、任务内容(报文分析)1.、ARP报文分析a. ARP request报文b.ARP response 报文注:ARP的报文格式:Hardware type(硬件类型):指明硬件的类型,以太网是1;Protocol type(协议类型):指明发送者映射到数据链路标识的网络层协议类型,其中ip 对应(0*0800);Hardware size(硬件地址长度):MAC地址的长度,共六字节。
Protocol size(协议地址长度):网络层地址的长度,即ip地址的长度,这里共四字节。
Opcode(操作):这里是ARP请求为一,即request(1);Sender MAC address(源MAC地址)Sender IP address(源IP地址)Target MAC address(目的MAC地址)Target IP address(目的IP地址)分析:以上是用10.16.134.11去ping 10.16.134.10 得到的结果:ARP报文被分装在以太帧里面,第一个是一个request的报文,先发送一个广播,广播里面告诉我们10.16.134.11在寻找10.16.134.10。
ARP协议的基本功能就是通过目标设备的ip地址,查询目标设备的mac 地址。
解析ARP数据包(二)——说明书
解析ARP数据包(二)——说明书(2007-04-16 19:59:51)转载▼标签:计算机网络课程设计分类:IT技术一.课程设计要求通过编制程序,获取网络中的ARP数据包,解析数据包的内容,将结果显示在标准输出上,并同时写入日志文件。
程序的具体要求如下所示: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(Address Resolution Protocol,地址解析协议)。
四.ARP包的格式?/P>帧头部帧数据ARP消息14BARP数据包封装成一个帧物理帧头格式ARP数据包格式五.ARP协议工作流程1. 首先,每台主机都会在自己的ARP缓冲区(ARP Cache)中建立一个ARP列表,以表示IP地址和MAC地址的对应关系。
2. 当源主机需要将一个数据包要发送到目的主机时,会首先检查自己ARP列表中是否存在该IP地址对应的MAC地址,如果有﹐就直接将数据包发送到这个MAC地址;如果没有,就向本地网段发起一个ARP请求的广播包,查询此目的主机对应的MAC地址。
计算机网络课程设计(第七章)解析IP数据包(完整程序代码)
计算机网络课程设计——机械工业出版社第7章:解析IP数据包课程设计目的:本课程设计的目的就是设计一个解析IP数据包的程序,并根据这个程序,说明IP 数据包的结构及IP协议的相关问题,从而对IP层的工作原理有更好的理解和认识。
完整程序代码:#include<stdio.h>#include<winsock2.h>#include<ws2tcpip.h>#pragma comment(lib,"ws2_32.lib")typedef struct _IP_HEADER{union{BYTE Version;BYTE HdrLen;};BYTE ServiceType;WORD TotalLen;WORD ID;union{WORD Flags;WORD FragOff;};BYTE TimeToLive;BYTE Protocol;WORD HdrChksum;DWORD SrcAddr;DWORD DstAddr;BYTE Options;} IP_HEADER;#define IO_RCVALL _WSAIOW(IOC_VENDOR,1)#define BUFFER_SIZE 65535void getVersion(BYTE b,BYTE &version){version=b>>4;}void getIHL(BYTE b,BYTE &length){length=(b&0x0f)*4;}char* parseServiceType_getProcedence(BYTE b) {switch(b>>5){case 7:return "Network Control";break;case 6:return "internet work Control";break;case 5:return "CRITIC/ECP";break;case 4:return "Flash Override";break;case 3:return "Flash";break;case 2:return "Immediate";break;case 1:return "Priority";break;case 0:return "Routine";break;default:return "Unknown";}}char* parseServiceType_getTOS(BYTE b) {b=(b>>1)&0x0f;switch(b){case 0:return "Normal Service";break;case 1:return "Minimize monetary cost";break;case 2:return "Maximize reliability";break;case 4:return "Maximize throughput";break;case 8:return "Minimize delay";break;case 15:return "Maximize security";break;default:return "Unknown";}}void getFlags(WORD w,BYTE &DF,BYTE &MF) {DF=(w>>14)&0x01;MF=(w>>13)&0x01;}void getFragOff(WORD w,WORD &fragOff) {fragOff=w&0x1fff;}char* getProtocol(BYTE Protocol){switch (Protocol){case 1:return "ICMP";case 2:return "IGMP";case 4:return "IP in IP";case 6:return "TCP";case 8:return "EGP";case 17:return "UDP";case 41:return "IPv6";case 46:return "RSVP";case 89:return "OSPF";default:return "UNKNOWN";}}void ipparse(FILE* file,char* buffer){IP_HEADER ip=*(IP_HEADER*)buffer;fseek(file,0,SEEK_END);fprintf(file,"----------------------------------\n");BYTE version;getVersion(ip.Version,version);fprintf(file,"Version:%d\n",version);BYTE headerLen;getIHL(ip.HdrLen,headerLen);fprintf(file,"HdrLen:%d(Bytes)\n",headerLen);fprintf(file,"ServiceType: %s,%s\n",parseServiceType_getProcedence(ip.ServiceType),parseServiceType_getTOS(ip.ServiceType));fprintf(file,"TotalLen: %d(Bytes)\n",ip.TotalLen);fprintf(file,"ID: %d\n",ip.ID);BYTE DF,MF;getFlags(ip.Flags,DF,MF);fprintf(file,"Flags:DF=%d,MF=%d\n",DF,MF);WORD fragOff;getFragOff(ip.FragOff,fragOff);fprintf(file,"FragOff: %d\n",fragOff);fprintf(file,"FragOff: %d\n",fragOff);fprintf(file,"TimeToLive: %d(Hops)\n",ip.TimeToLive);fprintf(file,"Protocol: %s\n",getProtocol(ip.Protocol));fprintf(file,"HdrChksum: 0x%0x\n",ip.HdrChksum);fprintf(file,"SrcAddr: %s\n",inet_ntoa(*(in_addr*)&ip.SrcAddr));fprintf(file,"DstAddr: %s\n",inet_ntoa(*(in_addr*)&ip.DstAddr)); }void main(int argc,char*argv[]){if(argc!=2){printf("Please input command: ParseArp output_file");return;}FILE* file;if((file=fopen(argv[1],"wb+"))==NULL){printf("Fail to open file %s",argv[1]);return;}WSADATA wsData;if(WSAStartup(MAKEWORD(2,2),&wsData)!=0){printf("WSAStartup failed!");return;}SOCKET sock;if((sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP))==INVALID_SOCK ET){printf("Creat socket failed");return;}BOOL flag=true;if(setsockopt(sock,IPPROTO_IP,IP_HDRINCL,(char*)&flag,sizeof(flag)) ==SOCKET_ERROR){printf("Setsockopt failed!");return;}char hostName[128];if(gethostname(hostName,100)==SOCKET_ERROR){printf("Gethostname failed!");return;}hostent* pHostIP;if((pHostIP=gethostbyname(hostName))==NULL){printf("Gethostbyname failed!");return;}sockaddr_in addr_in;addr_in.sin_addr=*(in_addr*)pHostIP->h_addr_list[0];addr_in.sin_family=AF_INET;addr_in.sin_port=htons(6000);if(bind(sock,(PSOCKADDR)&addr_in,sizeof(addr_in))==SOCKET_ERRO R){printf("Bind failed!");return;}DWORD dwValue=1;DWORD dwBufferLen[10];DWORD dwBufferInLen=1;DWORD dwBytesReturned=0;if(WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof(dwBufferInLen),& dwBufferLen,sizeof(dwBufferLen),&dwBytesReturned,NULL,NULL)==SOCKET_ ERROR){printf("Ioctlsocket failed!");return;}char buffer[BUFFER_SIZE];printf("Listening on local host...\n");while(true){int size=recv(sock,buffer,BUFFER_SIZE,0);if(size>0){ipparse(stdout,buffer);ipparse(file,buffer);}}fclose(file);return;}结果截图。
计算机网络ARP地址协议解析实验报告
计算机⽹络ARP地址协议解析实验报告计算机⽹络实验报告⼀、实验⽬的:1. 掌握ARP协议的报⽂格式2. 掌握ARP协议的⼯作原理3. 理解ARP⾼速缓存的作⽤4. 掌握ARP请求和应答的实现⽅法5. 掌握ARP缓存表的维护过程⼆、实验步骤:⼀,完成⽹络环境的配置,并进⾏拓扑验证。
预期问题:拓扑验证出现错误。
必须严格按照附录中的拓扑图进⾏⽹络环境的配置,如有错误不能向下进⾏实验。
因为在错误的⽹络配置环境下做的实验结果也是⽆意义的。
⼆,完成采集⽹络传输数据前的准备⼯作。
⽹关的设定;开通静态路由;主机 A ping 主机 E成功;清空ARP ⾼速缓存;设置协议分析器的过滤条件;预期问题:⽹关设定错误,没有在主机 B 开启静态路由都会造成主机 A Ping 主机E 不成功。
三,开始实验,启动协议分析器,开始捕获数据。
预期问题:必须先开启数据捕获,再执⾏主机 A ping 主机 E 操作,否则获取不到数据。
四,查看采集到的ARP 报⽂,对实验结果进⾏截图、记录。
五,关闭实验平台,将实验系统恢复原状,完成实验。
1.IP配置完毕,进⾏拓扑验证:图⽰为A⾓⾊捕获到的ARP-request图⽰说明:⽅向:172.16.1.42(主机 A)→⼦⽹内的所有主机内容:ARP‐request协议解析树: Ethernet 802.3⽬的 MAC 地址= FFFFFF‐FFFFFF :向⼦⽹内所有主机发送源 MAC 地址=6C626D‐707DCE:主机 A 的 MAC 地址协议类型或数据长度=0806(ARP 协议):ARP 协议ARP(地址解析议)硬件类型=1协议类型=0800硬件地址长度=6协议地址长度=4操作码=1(请求)发送端硬件地址=6C626D‐707DCE (主机A发送端逻辑地址=172.16.1.41 (主机A)⽬的端硬件地址=000000‐000000 (未知,请求的硬件地址)⽬的端逻辑地址=172.16.1.42 (主机 B 左⽹卡)过程描述:主机 A→⼦⽹内的所有主机,发送 ARP‐request,请求 IP 地址是 172.16.1.42 (主机B的左⽹卡)主机 Aping 主机 E,由于 A 发现 E 与其不是在同⼀⼦⽹,所以主机 A 把发送的数据转发到⽹关:主机 B 左⽹卡。
解析ARP数据包
华南农业大学信息学院课程设计课程设计题目:解析ARP数据包计划学时:2周所属课程名称:计算机网络课程设计开设时间: 2010学年第一学期授课班级: 07软件R3指导教师:**学生姓名:***学号:*************信息学院解析ARP数据包摘要:本文首先介绍了地址解析协议ARP的概念,详细说明了ARP的工作原理,ARP攻击的基本原理,详细分解了ARP数据包的各个字段含义,ARP协议工作的流程和这次课程设计的意义与目的;接着描述了此实验的总体设计;然后是详细设计,分析讲解了实现代码的主要部分;最后还讲了做这次课程设计的个人总结,谈了一些个人观点。
关键字:ARP数据包、工作原理、ARP攻击、解析、截获、功能1 引言1.1背景首先,我们来了解一下什么是ARP,ARP的工作原理以及ARP攻击所带来的危害。
1.1.1什么是ARP地址解析协议(Address Resolution Protocol,ARP)是在仅知道主机的IP地址时确定其物理地址的一种协议。
因IPv4和以太网的广泛应用,其主要用作将IP地址翻译为以太网的MAC地址,但其也能在A TM和FDDIIP网络中使用。
从IP地址到物理地址的映射有两种方式:表格方式和非表格方式。
ARP具体说来就是将网络层(IP层,也就是相当于OSI的第三层)地址解析为数据连接层(MAC 层,也就是相当于OSI的第二层)的MAC地址。
在以太网协议中规定,同一局域网中的一台主机要和另一台主机进行直接通信,必须要知道目标主机的MAC地址。
而在TCP/IP协议栈中,网络层和传输层只关心目标主机的IP地址。
这就导致在以太网中使用IP协议时,数据链路层的以太网协议接到上层IP协议提供的数据中,只包含目的主机的IP地址。
于是需要一种方法,根据目的主机的IP地址,获得其MAC地址。
这就是ARP协议要做的事情。
所谓地址解析(address resolution)就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。
解析arp课程设计
解析arp课程设计一、课程目标知识目标:1. 让学生掌握ARP(地址解析协议)的基本概念,理解其工作原理;2. 学会使用ARP命令进行网络通信测试,了解ARP缓存的作用;3. 掌握ARP欺骗的原理和防范方法。
技能目标:1. 培养学生运用所学知识解决实际网络问题的能力;2. 提高学生在网络环境中进行故障排查和问题解决的能力;3. 培养学生团队合作和沟通交流的能力。
情感态度价值观目标:1. 培养学生对计算机网络知识的兴趣,激发学习热情;2. 增强学生的网络安全意识,树立正确的网络道德观念;3. 培养学生勇于探索、积极进取的精神风貌。
分析课程性质、学生特点和教学要求:1. 课程性质:本课程为计算机网络基础课程,以实践操作为主,理论讲解为辅;2. 学生特点:学生具备一定的计算机网络基础知识,对实际操作有较高的兴趣;3. 教学要求:注重理论与实践相结合,以学生为主体,充分调动学生的积极性和主动性。
1. 熟练掌握ARP相关理论知识,具备实际操作能力;2. 独立完成网络故障排查,提高问题解决能力;3. 树立正确的网络安全意识,为今后的学习和工作打下坚实基础。
二、教学内容1. ARP基础知识:- 地址解析协议的概念与作用;- ARP缓存的作用及维护;- ARP工作原理及报文格式。
2. ARP命令操作:- 使用ARP命令查看、添加和删除ARP缓存记录;- 通过ARP命令进行网络通信测试;- 分析ARP命令在实际应用中的问题及解决方法。
3. ARP欺骗与防范:- ARP欺骗的原理及类型;- ARP欺骗的检测方法;- 防范ARP欺骗的措施及配置。
4. 教学内容安排与进度:- 第一课时:ARP基础知识学习;- 第二课时:ARP命令操作练习;- 第三课时:ARP欺骗与防范措施学习。
5. 教材关联:- 教学内容与《计算机网络》教材中第四章第二节“地址解析协议”相关;- 结合教材内容,对ARP协议进行深入剖析和实际操作。
6. 教学大纲:- 理论知识:ARP基本概念、工作原理、命令操作;- 实践操作:ARP缓存维护、通信测试、欺骗防范;- 教学进度:三个课时,逐步深入学习ARP相关知识。
ARP协议的c语言实现源代码
ARP协议的c语言实现源代码【转载】收藏什么是ARP协议英文原义:Address Resolution Protocol中文释义:(RFC-826)地址解析协议#include <netdb.h>#include <unistd.h>#include <ctype.h>#include <errno.h>#include <signal.h>#include <string.h>#include <stdio.h>#include <stdlib.h>#include <getopt.h>#include <sys/uio.h>#include <sys/file.h>#include <sys/time.h>#include <sys/signal.h>#include <sys/ioctl.h>#include <sys/param.h>#include <sys/socket.h>#include <linux/sockios.h>#include <linux/if.h>#include <linux/if_arp.h>#include <linux/if_packet.h>#include <linux/types.h>#include <netinet/in.h>#include <arpa/inet.h>#define src_addr "192.168.0.239"#define device "eth0"#define fill_buf "aaaaaaaaaaaa"int socket_id;char *target = src_addr;int send_count = 0;int recv_count = 0;struct in_addr src, dst;struct sockaddr_ll me, he;struct timeval send_time, recv_time;struct in_addr get_src_ip(char * devices){struct sockaddr_in saddr;int sock_id = socket(AF_INET, SOCK_DGRAM, 0); if (sock_id < 0) {perror("socket");exit(2);}if (devices) {if (setsockopt(sock_id, SOL_SOCKET, SO_BINDTODEVICE, device, strlen(device)+1) == -1)perror("WARNING: interface is ignored");}int alen = sizeof(saddr);memset(&saddr, 0, sizeof(saddr));saddr.sin_port = htons(0x1000);saddr.sin_family = AF_INET;if (connect(sock_id, (struct sockaddr*)&saddr, sizeof(saddr)) == -1) {perror("connect");exit(2);}if (getsockname(sock_id, (struct sockaddr*)&saddr, &alen) == -1) {perror("getsockname");exit(2);}close(sock_id);return saddr.sin_addr;}int check_device(char* if_dev, int ss){int ifindex;struct ifreq ifr;memset(&ifr, 0, sizeof(ifr));strncpy(ifr.ifr_name, if_dev, IFNAMSIZ-1);if (ioctl(ss, SIOCGIFINDEX, &ifr) < 0) {fprintf(stderr, "arping: unknown iface %s\n", if_dev);exit(2);}ifindex = ifr.ifr_ifindex;if (ioctl(ss, SIOCGIFFLAGS, (char*)&ifr)) {perror("ioctl(SIOCGIFFLAGS)");exit(2);}if (!(ifr.ifr_flags&IFF_UP)) {printf("Interface \"%s\" is down\n", if_dev);exit(2);}if (ifr.ifr_flags&(IFF_NOARP|IFF_LOOPBACK)) {printf("Interface \"%s\" is not ARPable\n", if_dev);exit(2);return ifindex;} // check_device()int socket_init(){int s, s_errno;s = socket(PF_PACKET, SOCK_DGRAM, 0);s_errno = errno;me.sll_family = AF_PACKET;me.sll_ifindex = check_device(device, s);me.sll_protocol = htons(ETH_P_ARP);if (bind(s, (struct sockaddr*)&me, sizeof(me)) == -1) {perror("bind");exit(2);}int alen = sizeof(me);if (getsockname(s, (struct sockaddr*)&me, &alen) == -1) {perror("getsockname");exit(2);}if (me.sll_halen == 0) {printf("Interface \"%s\" is not ARPable (no ll address)\n", device);exit(2);}he = me;memset(he.sll_addr, -1, he.sll_halen); // set dmac addr FF:FF:FF:FF:FF:FFreturn s;}intcreate_pkt(unsigned char * buf, struct in_addr src, struct in_addr dst, struct sockaddr_ll * FROM, struct sockaddr_ll * TO){struct arphdr *ah = (struct arphdr*) buf;unsigned char *p = (unsigned char *)(ah+1);ah->ar_hrd = htons(FROM->sll_hatype);if (ah->ar_hrd == htons(ARPHRD_FDDI))ah->ar_hrd = htons(ARPHRD_ETHER);ah->ar_pro = htons(ETH_P_IP);ah->ar_hln = FROM->sll_halen;ah->ar_pln = 4;ah->ar_op = htons(ARPOP_REQUEST);memcpy(p, &FROM->sll_addr, ah->ar_hln);p+=FROM->sll_halen;memcpy(p, &src, 4);memcpy(p, &TO->sll_addr, ah->ar_hln);p+=ah->ar_hln;memcpy(p, &dst, 4);p+=4;memcpy(p, fill_buf, strlen(fill_buf) );p+=12;return (p-buf);}void send_pkt(){unsigned char send_buf[256];int pkt_size = create_pkt(send_buf, src, dst, &me, &he);gettimeofday(&send_time, NULL);int cc = sendto(socket_id, send_buf, pkt_size, 0, (struct sockaddr*)&he, sizeof(he));if( cc == pkt_size )send_count++;alarm(1);}int chk_recv_pkt(unsigned char * buf, struct sockaddr_ll * FROM){struct arphdr *ah = (struct arphdr*)buf;unsigned char *p = (unsigned char *)(ah+1);struct in_addr src_ip, dst_ip;if (ah->ar_op != htons(ARPOP_REQUEST) && ah->ar_op != htons(ARPOP_REPL Y)) return 0;if (ah->ar_pro != htons(ETH_P_IP) || ah->ar_pln != 4 || ah->ar_hln != me.sll_halen )return 0;memcpy(&src_ip, p+ah->ar_hln, 4);memcpy(&dst_ip, p+ah->ar_hln+4+ah->ar_hln, 4);if (src_ip.s_addr != dst.s_addr || src.s_addr != dst_ip.s_addr )return 0;return (p-buf);}void disp_info(int received, struct in_addr dst, int msecs, int usecs, struct sockaddr_ll from) {printf("%03d ", received);printf("%s ", from.sll_pkttype==PACKET_HOST ? "Unicast" : "Broadcast");printf("%s from %s", "reply", inet_ntoa(dst) );printf(" [%02X:%02X:%02X:%02X:%02X:%02X] ", from.sll_addr[0], from.sll_addr[1], \ from.sll_addr[2], from.sll_addr[3], from.sll_addr[4], from.sll_addr[5]);printf(" %ld.%ld ms\n", (long int)msecs, (long int)usecs);fflush(stdout);}void finish(){printf("\nSent %d ARP probe packet(s) \n", send_count);printf("Received %d response(s)", recv_count);printf("\n\n");fflush(stdout);exit(!recv_count);}////////////////////////////////////////////////////////////////intmain(int argc, char **argv){uid_t uid = getuid();setuid(uid);if( *(argv+1) != NULL )target = *(argv+1);if (inet_aton(target, &dst) != 1) {struct hostent *hp;hp = gethostbyname2(target, AF_INET);printf("\ntarget = %s \n", target );if (!hp) {fprintf(stderr, "arping: unknown host %s\n", target);exit(2);}memcpy(&dst, hp->h_addr, 4);}src = get_src_ip(device);if (!src.s_addr ) {fprintf(stderr, "arping: no source address in not-DAD mode\n");exit(2);}socket_id = socket_init();printf("\nARPING %s ", inet_ntoa(dst));printf("from %s %s\n\n", inet_ntoa(src), device ? : "");signal(SIGINT, finish);signal(SIGALRM, send_pkt);send_pkt();while(1){struct sockaddr_ll from;int alen = sizeof(from);char recv_buf[0x1000];int recv_size = recvfrom(socket_id, recv_buf, sizeof(recv_buf), 0, (struct sockaddr *)&from,&alen );gettimeofday(&recv_time, NULL);if( recv_size < 0 ) {perror("arping: recvfrom");continue;}if( chk_recv_pkt(recv_buf, &from) > 0 ) {memcpy(he.sll_addr, from.sll_addr, he.sll_halen);long usecs, msecs;if (recv__sec) {usecs = (recv__sec - send__sec) * 1000000 + recv__usec - send__usec;msecs = (usecs+500)/1000;usecs -= msecs*1000 - 500;}recv_count++;disp_info(recv_count, dst, msecs, usecs, from);} // if (chk...)}return 0;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程设计任务书目录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地址的条件下,得到目的主机或设备的物理地址。
ARP协议的数据包格式如图所示:ARP数据包的消息格式下面对数据包的各个部分进行说明●硬件类型:指定硬件接口类型。
例如,值为1表示Ethernet●协议类型:指定发送方支持的上层协议的类型●物理地址长度:指定物理(硬件)地址的长度●协议地址长度:网络层协议的地址长度。
若为IP协议,其值为4●操作:指定ARP的操作类型,例如,1表示ARP请求,2表示ARP应答●源物理地址:指定发送方的IP地址●目的物理地址:指定目的物理地址。
●目的IP地址:指定目的IP地址ARP分组必须在数据链路层中被封装成侦,才能发送出去封装形式如图所示b)ARP协议的工作流程。
1)在发送一个ARP分组之前,源主机首先根据目的IP地址,在本地ARP高速缓存表中查找与之对应的目的物理地址。
如果找到对应的物理地址,就不用进行地址解析,否则需要进行地址解析。
2)实现地址解析的第一步是产生ARP请求分组。
在相应的字段写入本地主机的源物理地址、源IP地址,在目的物理地址字段写入0,并在操作字段写入1。
3)将ARP分组发送到本地的数据链路层,并封装成帧。
以源物理地址作为源地址,以物理广播地址(FF-FF-FF-FF-FF-FF)作为目的地址,通过物理层发送出去。
4)由于采用了广播地址,因此网段内所有的主机或设备都能接受到该帧。
除了目的主机外,所有接受到该分组的主机和设备都会丢弃该分组,因为目的主机能够识别ARP 消息中的目的IP地址。
5)目的主机发送ARP应答分组。
在ARP应答分组中,以请求分组中源物理地址、源IP地址作为其目的物理地址、目的IP地址,并将目的主机自身的物理地址、IP地址填入应答分组的源物理地址、源IP地址字段,并在操作字段中写入2。
该分组通过数据链路层以点对点的方式发送出去(因为现在目的方已经知道双方的物理地址)。
6)源结点接收到ARP应答分组,知道对应于目的IP地址的目的物理地址,将它作为一条新记录加入到ARP高速缓存表。
7)源结点将有完整源IP地址、源物理地址、目的IP地址、目的物理地址的信息和数据作为一个发送分组,传送给它的数据链路层并封装成桢,然后以点对点的方式发送到目的主机。
四、课程设计分析1.课程设计中的重点及难点1)程序中会用到Winpcap,Winpcap是Win32环境下数据包捕获的开放代码函数库。
基于Winpcap的应用程序一般按照下面几个步骤进行设计:●输出网卡设备列表。
●选择网卡并打开。
●捕获数据包时,可能需要设置过滤器。
●捕获数据包或者发送数据包。
2)在程序设计过程中需要注意网络—主机字节顺序的转化。
由于不同的计算机系统所采用的数据表示方式不同,对于2B或4B的数据,有的采用低字节地址存放数据的高权值位,而有的却以低地址字节存放数据低权位值,在网络的数据传输中,我们应该统一表示,所以我们在捕获数据包后,应将数据包头部的表示长度或类型的数据转换成本地机的表达形式。
可以利用函数ntohs()将网络字节序转换为主机字节序。
3)选择网卡并打开时,注意选择可用的网卡。
2.参考算法1)取得当前网卡设备列表。
2)选择Ethernet网卡并打开,注意判断所选网卡是否为实际存在的可用网卡。
3)设置过滤器,此处的过滤器正则表达式为“arp”或者“ether proto\\arp”。
4)捕获数据包并进行处理(包括输出各IP地址,物理地址,操作类型以及时间)。
由于要记录日志文件,为了便于输出流参数,建议采用pcap_next_ex()函数。
流程图如图所示:3.核心代码●ARP数据包结构struct arppkt{unsigned short hdtyp; //硬件类型。
值0001表示其为Ethernetunsigned short protyp; //协议类型。
值0800表示上层协议为IPunsigned char hdsize; //硬件地址长度。
值为06unsigned char prosize; //协议地址长度。
值为04unsigned short op; //操作值为0001/0002,分别表示ARP请求/应答u_char smac[6]; //源MAC地址,6Bu_char sip[4]; //源IP地址,4Bu_char dmac[6]; //目的MAC地址u_char dip[4]; //目的IP地址};●获取网络设备列表,并以混杂模式打开网络设备//获取网络设备列表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<<"\nUnable to open the adapter.";pcap_freealldevs(alldevs); //释放设备列表return;}if(pcap_datalink(adhandle)==DLT_EN10MB&&d->addresses!=NULL)break;}●编译过滤器并设置过滤器,只捕获ARP数据包char packet_filter[]=”ether proto \\arp”; //过滤,选择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;}●循环捕获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" //此头文件没有包含在VC中,需要另外加入#include<fstream.h>#include<iomanip.h> //格式化输出需要用到#include<conio.h> //用到_getch()//注意到接收的数据包头中代表类型,数据长度的字段采用的是big-endian//所以对于2B/4B的数据要用ntohs()转换为本机形式//ARP包结构struct arppkt{unsigned short hdtyp; //硬件类型.值0001unsigned 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); void main(int argc,char *argv[ ]){if(argc!=2){cout<<"Usage:arpparse logfilename"<<endl;cout<<"press any key to continue."<<endl;_getch();return;}pcap_if_t *alldevs;pcap_if_t *d;pcap_t *adhandle;char errbuf[PCAP_ERRBUF_SIZE];u_int netmask;char packet_filter[]="ether proto \\arp";struct bpf_program fcode;struct pcap_pkthdr *header;const u_char *pkt_data;if(pcap_findalldevs(&alldevs,errbuf)==-1){cout<<"Error in pcap_findalldevs:"<<errbuf;return;}for(d=alldevs;d;d=d->next){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->addressess!=NULL) break;}if(d==NULL){cout<<"\nNo interfaces found! Make sure Winpcap is installed.\n";return;}//获得子网掩码netmask=((sockaddr_in *)(d->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(ashandle,&fcode)<0){ cout<<"\nError setting the filter.\n";pcap_freealldevs(alldevs);return;}cout<<"\t\tlistening on "<<d->description<<"..."<<endl<<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\tARP request(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"<<" "<<"Sour MAC Address"<<" "<<"Des Ip Addr"<<" "<<"Des MAC Address"<<" "<<"OP"<<" "<<"Time"<<endl;//释放设备列表pcap_freealldevs(alldevs);int result;while((result=pcap_next_ex(adhandle,&header,&pkt_data))>=0){if(result==0)continue;packer_handler(header,pkt_data,cout);packet_handler(header,pkt_data,fout);}}void packet_handler(const pcap_pkthdr *header,const u_char *pkt_data,ostream& out){arpkt* 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::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[3])<<'.';out.unsetf(ios::left);//输出目的MAC地址out.fill('0');out.setf(ios::uppercase);for(i=0;i<5;i++)out<<hex<<setw(2)<<int(arph->dmac[i])<<'-';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;}五、相关扩展本课程设计还可以在Linux环境下用rawsocket完成。