//h.h
#include <iostream.h>
#include <fstream.h>
#include <conio.h>
#include <stdio.h>
#include "Packet32.h"
#include "Ntddndis.h"
#pragma comment(lib,"Packet.lib")
// DLC头
typedef struct DLCHeader
{
unsigned char DesMAC[6];
unsigned char SrcMAC[6];
unsigned short Ethertype;
} DLCHEADER;
// ARP桢
typedef struct ARPFrame
{
unsigned short HW_Type;
unsigned short Prot_Type;
unsigned char HW_Addr_Len;
unsigned char Prot_Addr_Len;
unsigned short Flag;
unsigned char Send_HW_Addr[6];
unsigned char Send_Prot_Addr[4];
unsigned char Targ_HW_Addr[6];
unsigned char Targ_Prot_Addr[4];
unsigned char padding[18];
} ARPFRAME;
// ARP包=DLC头+ARP桢
typedef struct ARPPacket
{
DLCHeader dlcHeader;
ARPFrame arpFrame;
}*PARPPACKET;
ARPPacket ARPPACKET;
//源文件.cpp
#include <iostream.h>
#include <string.h>
//#include "h.h"
int transIP(char *,unsigned char *);
int transMAC(char *,unsigned char *);
LPADAPTER lpAdapter;
LPPACKET lpPacket;
bool Send();
void main(int argc,char *argv[])
{
if(argc!=6)
{
cout<<"输入格式错误"<<endl;
return;
}
int i=0;
memset(&ARPPACKET, 0, sizeof(ARPPACKET));
if(*argv[5]=='0')
{
for(i=0;i<6;i++)
ARPPACKET.dlcHeader.DesMAC[i]=0xff;
ARPPACKET.arpFrame.Flag=(unsigned short)1;
}
else
{
if(*argv[5]=='1')
{
//填充DLC头中目的MAC地址
if(!transMAC(argv[4],ARPPACKET.dlcHeader.DesMAC))
return;
//ARP桢中flag位置2
ARPPACKET.arpFrame.Flag=(unsigned short)0x0200;
}
else
cout<<"flag位输入错误"<<endl;
}
if(!transMAC(argv[2],ARPPACKET.dlcHeader.SrcMAC))
return;
//填充DLC头中桢类型
ARPPACKET.dlcHeader.Ethertype=htons((unsigned short)0x0608);
ARPPACKET.arpFrame.HW_Type=(unsigned short)0x0100;
//(Ethernet类型)
ARPPACKET.arpFrame.Prot_Type=(unsigned short)0x0008;
ARPPACKET.arpFrame.HW_Addr_Len=(unsigned char)6;
ARPPACKET.arpFrame.Prot_Addr_Len=(unsigned char)4;
if(!transMAC(argv[2],ARPPACKET.arpFrame.Send_HW_Addr))
return;
if(!transIP(argv[1],ARPPACKET.arpFrame.Send_Prot_Addr))
return;
if(!transMAC(argv[4],ARPPACKET.arpFrame.Targ_HW_Addr))
return;
if(!transIP(argv[3],ARPPACKET.arpFrame.Targ_Prot_Addr))
return;
for(i=0;i<18;i++)
ARPPACKET.arpFrame.padding[i]=0;
if(!Send())
cout<<"发送arp包失败"<<endl;
}
int transIP(char *argv,unsigned char *a)
{
char ip[16];
int i=0,j=0,k=0;
strcpy(ip,argv);
int m=strlen(argv);
for(i=0;i<m;i++) //判断命令行输入的IP格式是否正确
{
if((ip[i]<'0'||ip[i]>'9')&&ip[i]!='.')
{
cout<<"输入ip:"<<argv<<"格式错误"<<endl;
return 0;
}
else
{
if(ip[i]!='.')j++;
else
{
k++;
if(j>3)
{
cout<<"输入ip:"<<argv<<"格式错误"<<endl;
return 0;
}
else
{j=0;}
if(k>3)
{
cout<<"输入ip:"<<argv<<"格式错误"<<endl;
return 0;
}
}
}
}
j=0;
for(i=0;i<4;i++) //填充IP地址
{
while(*(ip+j)<'0'||*(ip+j)>'9')j++;
a[i]=(unsigned char)atoi(ip+j);
while(*(ip+j)>='0'&&*(ip+j)<='9')j++;
}
return 1;
}
int transMAC(char *argv,unsigned char *b)
{
char mac[18];
int i=0,j=0,k=0;
strcpy(mac,argv);
int m=strlen(argv);
for(i=0;i<m;i++) //判断命令行输入的MAC地址是否正确
{
if(mac[i]<'0'||(mac[i]>':'&&mac[i]<'A')||(mac[i]>'Z'&&mac[i]<'a')||mac[i]>'Z')
{
cout<<"输入mac:"<<argv<<"格式错误"<<endl;
return 0;
}
else
{
if(mac[i]!=':')j++;
else
{
k++;
if(j>2)
{
cout<<"输入mac"<<argv<<"格式错误"<<endl;
return 0;
}
else
{j=0;}
if(k>5)
{
cout<<"输入mac"<<argv<<"格式错误"<<endl;
return 0;
}
}
}
}
for(i=0;i<6;i++) //填充MAC地址
{
while(*(mac+j)==':'||*(mac+j)=='-')j++;
if(*(mac+j)>='0'&&*(mac+j)<='9')
b[i]=(unsigned char)(*(mac+j)-'0');
if(*(mac+j)>='a'&&*(mac+j)<='z')
b[i]=(unsigned char)(*(mac+j)-'a'+10);
if(*(mac+j)>='A'&&*(mac+j)<='z')
b[i]=(unsigned char)(*(mac+j)-'A'+10);
j++;
b[i]*=16;
if(*(mac+j)>='0'&&*(mac+j)<='9')
b[i]+=(unsigned char)(*(mac+j)-'0');
if(*(mac+j)>='a'&&*(mac+j)<='z')
b[i]+=(unsigned char)(*(mac+j)-'a'+10);
if(*(mac+j)>='A'&&*(mac+j)<='z')
b[i]+=(unsigned char)(*(mac+j)-'A'+10);
j++;
}
return 1;
}
bool Send()
{
char AdapterNameA[8192];
char AdapterNameU[2*sizeof(AdapterNameA)];
unsigned long AdapterAlength=sizeof(AdapterNameA);
unsigned long AdapterUlength=2*sizeof(AdapterNameA);
DWORD dwVersion=GetVersion ();
DWORD dwWindowsMajorVersion=(DWORD)(LOBYTE(LOWORD(dwVersion)));
if(!(dwVersion >= 0x80000000 && dwWindowsMajorVersion >=4))
{
//Windows NT
//获取UNICODE码网卡名列表
if(PacketGetAdapterNames(AdapterNameU,&AdapterUlength)==FALSE)
{
cout<<"无法得到网卡列表!"<<endl;
return FALSE;
}
//将第一个网卡名转为ASCII码
unsigned short *pAdapterName=(unsigned short *)AdapterNameU;
for(unsigned i=0;i<AdapterAlength;i++)
if((AdapterNameA[i]=(char)pAdapterName[i])=='/0')
break;
}
else
{
//Windows 9x
//获取ASCII码网卡名列表
if(PacketGetAdapterNames(AdapterNameA,&AdapterAlength)==FALSE)
{
cout<<"无法得到网卡列表!"<<endl;
return FALSE;
}
}
lpAdapter=PacketOpenAdapter(AdapterNameA);
if(!lpAdapter||lpAdapter->hFile==INVALID_HANDLE_VALUE)
{
cout<<"无法打开网卡,错误码:"<<GetLastError()<<endl;
return FALSE;
}
//发送帧
LPPACKET lpPacket; //分配发送包结构
if((lpPacket=PacketAllocatePacket())!=NULL)
{
//初始化发送包结构
PacketInitPacket(lpPacket,&ARPPACKET,sizeof(ARPPACKET));
// 每次只发送一个包
PacketSetNumWrites(lpAdapter,1);
//发送包
if(PacketSendPacket(lpAdapter,lpPacket,true)==1)
{
cout<<"send ok"<<endl;
}
else
{
cout<<"发送包失败"<<endl;
PacketFreePacket(lpPacket); //释放发送包结构
}
}
else
{
cout<<"分配发送包LPPACKET结构失败!"<<endl;
}
PacketCloseAdapter(lpAdapter);
return TRUE;
}