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