发送ARP

#include<iostream>
#include"pcap.h"
#pragma comment(lib,"wpcap.lib")
#pragma comment(lib,"ws2_32.lib")

using namespace std;
//物理帧头结构
typedef struct PhyFrame
{
	unsigned char DstMAC[6];
	unsigned char SrcMAC[6];
	unsigned short FrameType;
}PHYFRAME;
//ARP帧结构
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;
//ARP包=物理帧头+ARP帧
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);
	//判断mac地址是否正确
	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 error!"<<endl;
					return 0;
				}
				else
					j=0;
				if(k>5)
				{
					cout<<"MAC address error!"<<endl;
					return 0;
				}
			}
		}
	}
	//填充MAC地址
	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);
	}
	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);
	//判断IP地址是否正确
	for(i=0;i<m;i++)
	{
		if(ip[i]<'.'||ip[i]>'.'&&ip[i]<'0'||ip[i]>'9')
		{
			cout<<"IP address errror!"<<endl;
			return 0;
		}
		else
		{
			if(ip[i]!='.')
				j++;
			else
			{
				k++;
				if(j>3)
				{
					cout<<"IP address errror!"<<endl;
			        return 0;
				}
				else
					j=0;
				if(k>3)
				{
					cout<<"IP address errror!"<<endl;
			        return 0;
				}
			}
		}
	}
	//填充IP地址
	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);

	//填充ARP帧各字段
	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[2],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;
	}
//通过网卡发送ARP包
	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<<"Sourve IP:  "<<argv[2]<<endl;
	cout<<"Dest MAC: "<<argv[3]<<endl;
	cout<<"Dest IP: "<<argv[4]<<endl;
	cout<<"ARP packet send success!"<<endl;
}

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值