计算机网络课设报告解析ARP数据包含C++源码

合集下载

c语言Winpcap编程构造并接收解析arp包

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++源码

计算机⽹络课设报告解析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原理分析源码分析

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攻击(附源码)

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数据包课程设计

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分析报告及路由协议详情分析报告

实验四: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工作过程

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,观察并分析结果结论:提示请求超时,传输失败。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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完成。

相关文档
最新文档