发送EthernetARP包.txt

//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;
  }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值