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

📄 arpsend.cpp

📁 发送ARP包的控制台程序
💻 CPP
字号:
// arpsend.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "arpsend.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif



// 唯一的应用程序对象

CWinApp theApp;

using namespace std;

/*! \brief 将字符类型的数据转化为6byte16进制地址
    \param const LPSTR str:输入的字符
	\param unsigned char*add:输出转化完的16进制数
	\return 转化成功则返回真
*/
bool strtoaddr(const LPSTR str,unsigned char*add)
{
	char temp1,temp2=0;
    for(int i=0;i<6;i++)
	{
		for(int j=0;j<2;j++)
		{
			temp1=str[i*2+j];
			if(temp1>='a'&&temp1<='f')temp1=temp1-'a'+10;
			else if(temp1>='A'&&temp1<='F')temp1=temp1-'A'+10;
			else if(temp1>='0'&&temp1<='9')temp1=temp1-'0';
			else
			{
				cout<<"输入数据不正确,请输入16进制数据"<<endl;
				return 0;
			}
			temp2=temp2*16+temp1;
		}
		add[i]=temp2;
	}
	return 1;
}


/*!\brief 发送一个arp数据包
   \return 成功发送时返回为真
*/
bool arpsend()
{
	LPADAPTER  lpAdapter;             //指向网卡设备的指针
    LPPACKET   lpPacket;              //指向数据包结构的指针
    char AdapterName[8192];           //存储网卡名的数组
	unsigned long   AdapterLength;    //网卡名数组的长度
	AdapterLength = sizeof(AdapterName);

	if(PacketGetAdapterNames(AdapterName,&AdapterLength)==FALSE)  //获取网卡设备名
	{
		cout<<"无法获得网卡名"<<endl;
		return 0;
	}
	
	lpAdapter = PacketOpenAdapter(AdapterName);                  //打开网卡设备
	if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE))//无法打开设备,失败返回
	{
		  cout<<"无法打开网卡驱动"<<endl;
		  return 0;
	 }
	
	if((lpPacket = PacketAllocatePacket())==NULL)                //为数据包结构分配内存
	{
		  cout<<"无法给PACKET结构指针分配内存"<<endl;
		  return 0;
	 }
	  
	 PacketInitPacket(lpPacket, &arpPacket, sizeof(arpPacket));  //使用自定义的结构ARPPacket初始化数据包结构
	 
	 if(PacketSetNumWrites(lpAdapter,1)==FALSE)                  //设置每次发送的数据包数目为1
	 {
		 cout<<"无法设置发送包的数目"<<endl;
		 return 0;
	 }
	 
	 if(PacketSendPacket(lpAdapter,lpPacket,TRUE)==FALSE)        //发送数据包
	 {
		 cout<<"无法发送包"<<endl;
		 return 0;
	 }

	  PacketFreePacket(lpPacket);                                //释放内存资源
	  PacketCloseAdapter(lpAdapter);                             //释放网卡设备

	  return 1;


}


			     



int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;

	// 初始化 MFC 并在失败时显示错误
	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
	{
		// TODO: 更改错误代码以符合您的需要
		_tprintf(_T("致命错误: MFC 初始化失败\n"));
		nRetCode = 1;
	}
	else
	{
		if(argc!=6)                                                        //输入参数不符合要求,程序退出。
		{
			cout<<"Usage:arpsend src_ip src_mac dst_ip dst_mac flag"<<endl;
			cout<<"arpsend:程序名"<<endl;
            cout<<"src_ip:源ip地址"<<endl;
            cout<<"src_mac:源mac地址"<<endl;
            cout<<"dst_ip:目的ip地址"<<endl;
            cout<<"dst_mac:目的mac地址"<<endl;
            cout<<"flag:0表示arp请求;1表示arp应答"<<endl;
			return 1;
		}
       
		//开始填充arp包
		if(!strtoaddr(argv[4],arpPacket.header.DesAdd))  //填充头部的目的mac地址
		{
			cout<<"目的mac地址输入有误"<<endl;
			return 2;
		}
		if(!strtoaddr(argv[2],arpPacket.header.SrcAdd)) //填充头部的源端mac地址
		{
			cout<<"源端mac地址输入有误"<<endl;
			return 3;
		}
		arpPacket.header.ProType=0x0806;               //填充协议类型,arp为0x0806
		arpPacket.data.hwType=1;                       //底层网络类型(以太网)为1
		arpPacket.data.protType=0x0800;                //上层协议类型,ip协议
		arpPacket.data.haddrLen=0x06;                  //底层网络地址长度,mac地址为6字节
		arpPacket.data.paddrLen=0x04;                  //上层协议地址长度,ip地址为4字节
		if(argv[5]=="0")                               //flag=0,为arp请求,操作码,request=1
			arpPacket.data.Opcode=0x0001;
		else
		{
			if(argv[5]=="1")                           //flag=1,为arp应答,操作码,response=2
				arpPacket.data.Opcode=0x0002;
			else
			{
				cout<<"flag输入有误,只可以为0:arp请求或1:arp应答"<<endl;
				return 4;
			}
		}
		strtoaddr(argv[2],arpPacket.data.smacAddr);    //填充发送方的mac地址
		arpPacket.data.sprotAddr=inet_addr(argv[1]);   //填充发送方的ip地址
		strtoaddr(argv[4],arpPacket.data.rmacAddr);    //填充接受方的mac地址
		arpPacket.data.rprotAddr=inet_addr(argv[3]);   //填充接受方的ip地址
		if(!arpsend())
	{
		cout<<"发送失败"<<endl;
		return 5;
	}
	else
		cout<<"发送完成"<<endl;
        
		
	}

	return nRetCode;
}

⌨️ 快捷键说明

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