ARP请求获得MAC地址代码

在这里插入图片描述

一、sendto函数

sendto(sock_raw_fd, msg, msg_len, 0, (struct sockaddr*)&sll, sizeof(sll));

注意:
1、sock_raw_fd:原始套接字
2、msg:发送的消息(封装好的数字协议)
3、sll:本机网络接口,值发送的数据应该从本机的哪个网卡出去,而不是以前的目的地址

原始套接字:组帧数据报文—>设置从本机的哪块网卡sendto发出去

二、步骤

①本地接口结构体

头文件:#include <netpacket/packet.h>

存放地址的结构体:
在这里插入图片描述
只需要对sll.sll_ifindex赋值就可以了。

sll.sll_ifindex=本地接口;	//关键就是本地接口如何获得
sendto(sock_raw_fd, msg, msg_len, 0, (struct sockaddr*)&sll, sizeof(sll));

②获取本地接口并发送
通过ioctl来获取网络接口地址

头文件:
#include <sys/ioctl.h>
struct ifreq的头文件:
#include <net/if.h>
IFNAMSIZ 16

函数:int ioctl (int fd, int request, void *);
fd:原始套接字
request:请求
void *:存放某个地址结构

ioctl获取接口示例:

struct ifreq ethreq;								//网络接口地址
strncpy(ethreq.ifr_name, "eth0", IFNAMSIZ);			//指定网卡名称
if( ioctl(sock_raw_fd, SIOCGIFINDEX,&ethreq) == -1)
{
   
	perror("ioctl");
	close(sock_raw_fd);
	exit(-1);
}

struct sockaddr_ll sll;
bzero(&sll, sizeof(sll));
sll.sll_ifindex = ethreq.ifr_ifindex;	//给sll赋值

int len = sendto(sock_raw_fd, msg, sizeof(msg), 0, (struct sockaddr *)&sll, sizeof(sll));	

ioctl参数对照表:
在这里插入图片描述

三、测试demo(ARP扫描当前局域网某一IP的MAC地址)

概述:扫描MAC地址

1、ARP概述
①是TCP/IP协议族中的一个
②主要用于查询IP所对应的MAC
③请求方使用广播来发送请求
④应答方使用单播来回送数据
⑤为了在发送数据的时候提高效率,在计算中会有一个ARP缓存表,用来暂时存放IP所对应的MAC,在LINUX中使用ARP即可查看,在xp中使用ARP -a
在这里插入图片描述

代码:

①扫描当前局域网某一IP的MAC地址

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/ether.h>
#include <pthread.h>
#include <arpa/inet.h>
#include <sys/ioctl.h>			//ioctl头文件
#include <net/if.h>				//struct ifreq头文件
#include <netpacket/packet.h>	//struct sockaddr_ll头文件
#include <unistd.h>				//_exit头文件


/*
参数说明:
sockfd:原始套接字
out:指定的网卡名称
msg:发送的消息(封装好的数字协议)
msg_len:长度
*/
void my_sendto(int sockfd, char *out, unsigned char *msg, int msg_len)
{
   
	//通过ioctl得到网络接口
	struct ifreq ethreq;
	strncpy(ethreq.ifr_name, <
现在有一台计算机A(IP:192.168.85.1 MAC:AA-AA-AA-AA-AA-AA),另一台计算机B(IP:192.168.85.100 MAC:BB-BB-BB-BB-BB-BB)现在用A去 ping B。看见 Reply from 192.168.85.100: bytes=32 time<10ms TTL=32 这样的信息。然后在运行中输入arp -a,会看见 192.168.8.100 BB-BB-BB-BB-BB-BB dynamic这样的信息。那就是arp高速缓存中IP地址和MAC地址的一个映射关系,在以太网中,数据传递靠的是MAC,而并不是IP地址。其实在这背后就隐藏着arp的秘密。你一定会问,网络上这么多计算机,A是怎么找到B的?那么我们就来分析一下细节。首先A并不知道B在哪里,那么A首先就会发一个广播的ARP请求,即目的MAC为FF-FF-FF-FF-FF-FF,目的IP为B的192.168.85.100,再带上自己的源IP,和源 MAC。那么一个网段上的所有计算机都会接收到来自A的ARP请求,由于每台计算机都有自己唯一的MAC和IP,那么它会分析目的IP即 192.168.85.100是不是自己的IP?如果不是,网卡会自动丢弃数据包。如果B接收到了,经过分析,目的IP是自己的,于是更新自己的ARP高速缓存,记录下A的IP和MAC。然后B就会回应A一个ARP应答,就是把A的源IP,源MAC变成现在目的IP,和目的MAC,再带上自己的源IP,源 MAC,发送给A。当A机接收到ARP应答后,更新自己的ARP高速缓存,即把arp应答中的B机的源IP,源MAC的映射关系记录在高速缓存中。那么现在A机中有B的MAC和IP,B机中也有A的MAC和IP。arp请求和应答过程就结束了。由于arp高速缓存是会定时自动更新的,在没有静态绑定的情况下,IP和MAC的映射关系会随时间流逝自动消失。在以后的通信中,A在和B通信时,会首先察看arp高速缓存中有没有B的IP和MAC的映射关系,如果有,就直接取得MAC地址,如果没有就再发一次ARP请求的广播,B再应答即重复上面动作。 好了在了解了上面基本arp通信过程后,arp欺骗就不那神秘了,计算机在接收到ARP应答的时候,不管有没有发出ARP请求,都会更新自己的高速缓存。利用这点如果C机(IP:192.168.85.200 MAC:CC-CC-CC-CC-CC-CC)伪装成B机向A发出ARP应答,自己伪造B机的源MAC为CC-CC-CC-CC-CC-CC,源IP依旧伪造成B的IP即192.168.85.100,是那么A机的ARP缓存就会被我们伪造的MAC所更新,192.168.85.100对应的MAC就会变成CC-CC-CC-CC-CC-CC.如果A机再利用192.168.85.100即B的IP和B通信,实际上数据包却发给了C机,B机根本就接收不到了。实例基于WINCAP编写,描述其本源理与流程.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值