mac地址扫描实验

更新时间:2024-03-17 16:57:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

网络攻防对抗 大实验答辩报告

实验名称:ARP协议获取局域网主机mac地址 实验类型:验证型实验 指导老师: 专业班级: 姓 名: 学 号: 电子邮件: 实验地点: 实验日期: 年 月 日

实验成绩:

一、背景知识

在TCP/IP网络环境下,每个主机都分配了一个32位的IP地址,这种互联网地址是在网际范围标识主机的一种逻辑地址。为了让报文在物理网路上传送,必须知道对方目的主机的物理地址。这样就存在把IP地址变换成物理地址的地址转换问题。以以太网环境为例,为了正确地向目的主机传送报文,必须把目的主机的32位IP地址转换成为48位以太网的地址。这就需要在互连层有一组服务将IP地址转换为相应物理地址,这组协议就是ARP协议。

1、ARP协议的工作原理

在每台安装有TCP/IP协议的电脑里都有一个ARP缓存表,表里的IP地址与MAC地址是一一对应的,如附表所示。

我们以主机A(192.168.1.5)向主机B(192.168.1.1)发送数据为例。当发送数据时,主机A会在自己的ARP缓存表中寻找是否有目标IP地址。如果找到了,也就知道了目标MAC地址,直接把目标MAC地址写入帧里面发送就可以了;如果在ARP缓存表中没有找到相对应的IP地址,主机A就会在网络上发送一个广播,目标MAC地址是“FF.FF.FF.FF.FF.FF”,这表示向同一网段内的所有主机发出这样的询问:“192.168.1.1的MAC地址是什么?”网络上其他主机并不响应ARP询问,只有主机B接收到这个帧时,才向主机A做出这样的回应:“192.168.1.1的MAC地址是00-aa-00-62-c6-09”。这样,主机A就知道了主机B的MAC地址,它就可以向主机B发送信息了。同时它还更新了自己的ARP缓存表,下次再向主机B发送信息时,直接从ARP缓存表里查找就可以了。ARP缓存表采用了老化机制,在一段时间内如果表中的某一行没有使用,就会被删除,这样可以大大减少ARP缓存表的长度,加快查询速度。

2、以太网物理帧和ARP数据帧结构如下图:

二、实验内容

本次作业基于ARP协议,编写程序,实现获取本局域网内全部活动主机MAC地址与IP地址对应列表的程序。

要求使用Winpcap,手动封装ARP请求数据包,实现ARP响应数据包的接收和解析。

最好有界面,如果没有界面,则把获取到的局域网主机MAC信息输出到文件中去。

如果有界面的话,要求实现列出本机所有网络设备,用户能自由选择可用设备进行局域网主机MAC地址的获取,并把获取结果输出到界面上。

三、开发环境

1、开发环境与开发语言

开发时选择了C++语言作为开发语言,并选择Microsoft Visual 2008作为开发环境和编译环境。

(1)开发平台截图如下:

2、运行环境

运行环境是在Windows环境下,鼠标双击可执行程序,或者进入DOS后台,在DOS窗口键入可执行程序名称即可。

四、流程及核心算法实现

1、程序流程

程序流程图如下:

开始 获取所有可用设备,并在控制台显示 提示用户选择设备 可用? 否 提示出错 是 获得本机IP地址,和MAC地址,并在控制台中显示出来 开启两个工作线程,分别负责向局域网内发送ARP请求包和接受局域网返回的ARP回复包 向局网内机逐发ARP求包 域主个送请在控制台显示获取的主机IP地址以及相应的MAC地址 监听ARP响应数据包 结束 2、主要功能代码实现

public static string GetMacAddress(string RemoteIP) {

StringBuilder macAddress = new StringBuilder();//分配一个内存空间 try {

Int32 remote = inet_addr(RemoteIP);

Int64 macInfo = new Int64();//分配一个MAC地址的内存 Int32 length = 6;

SendARP(remote, 0, ref macInfo, ref length);

Console.WriteLine(SendARP(remote, 0, ref macInfo, ref length)); Console.ReadLine();

string temp = Convert.ToString(macInfo, 16).PadLeft(12, '0').ToUpper();

int x = 12;

for (int i = 0; i < 6; i++) {

if (i == 5) {

macAddress.Append(temp.Substring(x - 2, 2)); } else {

macAddress.Append(temp.Substring(x - 2, 2) + \}

x -= 2; }

return macAddress.ToString(); } catch {

return macAddress.ToString(); } }

五、操作演示

选择1.进入自动扫描

选择2.查询局域网内的指定ip

按任意键返回

六、总结

本次作业总共进行了将近一周的时间。在调试程序的过程中,出现了许多明显问题,特别是调试的过程,简直可以用痛苦和艰难来形容。遇到问题,分析问题或是请教别人,到最后解决问题,深入地了解了问题,也学到了好多东西。

问题总结如下:

1、指针概念不清晰。多次把指针定义好后,忘记了赋值,导致指针指向了一个空地址,调试出现错误。通过本次作业,对指针,引用等的概念有了明显的认识。

2、类的观念不强。虽然C++的特点是面向对象编程,但类和对象的观念并没有深入的建立起来,实际上还是停留在面向过程的阶段。通过本次作业,类的观念明显增强。

总之,经过本次作业实践,我认为在对ARP工作的原理的理解有了较大长进,取得了一定的进步,达到了预定目的。

本文来源:https://www.bwwdw.com/article/ohd8.html

Top