📄 arpsend.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 + -