投稿    登录
  博主录制的Python3爬虫视频教程已发布!详情请戳Python3爬虫视频教程!希望大家支持!非常感谢!

Winpcap网络编程五之ARP协议获得MAC表及主机通信

C/C++ 崔庆才 2941浏览 1评论

学习文档

这里我们直接进入正题吧,关于Winpcap的基础知识讲解这里就不再赘述了。在这里给大家提供一些学习网址

Winpcap网络编程及通信教程Winpcap中文技术文档

学习内容

  • 获取设备列表
  • 获取已安装设备的高级信息
  • 打开适配器并捕获数据包
  • 不用回调方法捕获数据包
  • 过滤数据包
  • 分析数据包
  • 处理脱机堆文件
  • 发送数据包
  • 收集并统计网络流量

这些内容,在上述两个链接中均已经有了比较详细的讲解,希望对大家有帮助。

两台主机通信实战

完成两台主机之间的数据通信(数据链路层)

  • 仿真ARP协议获得网段内主机的MAC表
  • 使用帧完成两台主机的通信(Hello! I’m …)

首先我们要理解ARP是干嘛的,ARP主要作用就是通过IP地址来获取MAC地址。那么怎样获取呢?本机向局域网内主机发送ARP包,ARP包内包含了目的IP,源IP,目的MAC,源MAC,其中目的MAC地址为广播地址,FF-FF-FF-FF-FF-FF,即向局域网内所有主机发送一个ARP请求,那么其他主机收到这个请求之后则会向请求来源返回一个数据包。在这个返回的数据包中包含了自身的MAC地址。那么本机收到这些返回的数据包进行解析之后便会得到局域网内所有主机的MAC地址了..

编程开始:

新建一个C++项目,配好环境,引入Winpcap相关的库,这些不再赘述。

头文件引入

在main函数中首先声明一系列变量如下

为这三个变量分配地址空间

接下来就是烂大街的程序,获取适配器列表并选中相应的适配器,注释已经在代码中了,如果还有不明白的请参照前几次的讲解。

上述代码中需要另外声明的有:

到此程序应该会编译通过,可以试着编译一下运行。

GO ON…

接下来我们首先要用ifget方法获取自身的IP和子网掩码

函数声明:

main函数继续写,如下调用,之前声明的ip_addr和ip_netmask就已经被赋值了

到现在我们已经获取到了本机的IP和子网掩码,下一步发送一个ARP请求来获取自身的MAC地址

这个ARP请求的源IP地址就随便指定了,就相当于你构造了一个外来的ARP请求,本机捕获到了请求,然后发送回应给对方的数据包也被本机捕获到了并解析出来了。解析了自己发出去的数据包而已。

那么我们就声明一个函数并实现:

其中我们需要定义一下常量如下

另外发送ARP请求少不了帧头和ARP头的结构,我们需要声明出来,另外我们构建发送包需要再声明两个结构体sparam和gparam

到现在代码也是完整可以运行的,如果有问题请检查上述代码完整性和位置。

可能出现的BUG:

只显示ARP发送成功,没有接受到并解析打印。可能的原因是帧构造有问题,字节没有对齐,有偏差,像#define一样

写入如下代码:

GO ON..

获取到了自身的MAC地址之后,就可以在本机上构建ARP广播请求,向局域网内的所有主机发送ARP请求,得到回应之后解析回应的数据包并进行解析,得到对方的MAC地址。在这里我们需要开启两个线程,一个用来发送一个用来接收。好,我们继续..

先声明两个线程

在main方法中继续写,对sp和gp两个ARP请求所需要的结构体进行赋值。赋值什么?就是你之前用ifget获取来的IP地址和子网掩码以及用getSelfMac获取来的MAC地址。

接下来直接创建两个线程,一个是发送一个接受,分别调用两个方法。

那么发送数据包的方法和接收解析数据包的方法怎样实现呢?

发送数据包,发送数据包先对结构体数据进行赋值,就像getSelfMac方法一样,然后声明了一个buffer用来存储每一个字节内容。

利用memset方法对buffer进行赋值。再利用一个for循环对255个主机进行发送,指定他们的IP地址。另外定义了一个flag,当发送成功之后将flag设置为1

注: 此函数和flag变量在前面别忘了声明一下…

然后是接收数据包并打印MAC地址:

以上暂告一段落,通过整合以上代码,我们可以得到如下运行结果:

接下来我们让用户输入要发送的IP地址和要发送的数据

声明一下TcpData

接下来就是重头戏了,需要声明各种结构体,我们发送的是TCP数据,这样,TCP的TcpData 就作为真正的内容,然后在前面加上TCP头,IP头,帧头,还有校验和要正确。

最后构成一个完整的帧,那么另外声明的结构体如下,前面代码声明过的帧头部结构体就去掉了。

继续main函数中对各种结构体的数据进行初始化赋值,并计算校验和。

校验和方法如下:

记得在声明一下这个方法。如果放在main函数前当然就不用声明啦。

另外需要声明的变量有

接下来的运行结果:

截图如下:

好啦,发送帧到此就告一段落啦!如果有疑问请留言。

帧的接收很简单,直接贴源码如下:

 

运行截图如下

Thank You

如有问题,欢迎留言~

 

转载请注明:静觅 » Winpcap网络编程五之ARP协议获得MAC表及主机通信

喜欢 (4)or分享 (0)

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请狠狠点击下面的

想结交更多的朋友吗?

来进击的Coder瞧瞧吧

进击的Coder

QQ群号 99350970 立即加入

进击的Coder灌水太多?

这里是纯粹的技术领地

激进的Coder

QQ群号 627725766 立即加入

想找人聊天解闷?想要学习干货?

微信公众号进击的Coder为你打造

进击的Coder

微信公众号 扫一扫关注