递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 7145|回复: 0
打印 上一主题 下一主题

[视窗] 发现一个有意思的东西【通过IP或sock取对方mac】。

[复制链接]

111

主题

612

帖子

2174

积分

金牌会员

Rank: 6Rank: 6

积分
2174
QQ
跳转到指定楼层
楼主
发表于 2023-5-22 17:53:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式



  1. /**
  2. * @send_arp.c
  3. * @This software is intended to be used as a example to show how to send and receive arp request with Linux * PF_PACKET interface
  4. * @Author:xuelei
  5. **/
  6. #include
  7. #include
  8. #include
  9. #include
  10. #include
  11. #include
  12. #include
  13. #include
  14. #include
  15. #include
  16. #include
  17. #include
  18. #include
  19. #include /* 需要里面的 glibc 版本号 */
  20. #if __GLIBC__ >= 2 && __GLIBC_MINOR >= 1
  21.         #include
  22.         #include /* 链路层(L2)协议 */
  23. #else
  24.         #include
  25.         #include
  26.         #include /* 链路层协议 */
  27. #endif
  28. #include

  29. #define INLEN 4
  30. #define MAC_BCAST_ADDR  (uint8_t *) "\xff\xff\xff\xff\xff\xff"

  31. void usage_quit(char *arg0);
  32. int get_ifi(char *dev, char *mac, int macln, struct in_addr *lc_addr, int ipln);
  33. void prmac(u_char *ptr);

  34. int main(int argc, char **argv)
  35. {
  36.         if(argc != 2)
  37.                 usage_quit(argv[0]);

  38.         int fd, salen, n;
  39.         u_char *mac;
  40.         char recv_buf[120], rep_addr[16];
  41.         struct in_addr lc_addr, req_addr;
  42.         struct sockaddr_ll reqsa, repsa;
  43.         struct arp_pkt {
  44.                 struct ether_header eh;
  45.                 struct ether_arp ea;
  46.                 u_char padding[18];
  47.         } req;

  48.         bzero(&reqsa, sizeof(reqsa));
  49.         reqsa.sll_family = PF_PACKET;
  50.         reqsa.sll_ifindex = if_nametoindex("eth0");

  51.         if((fd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ARP))) < 0) {
  52.                 perror("Socket error");
  53.                 exit(1);
  54.         }

  55.         mac = (char *)malloc(ETH_ALEN);
  56.         bzero(&req, sizeof(req));

  57.         if(get_ifi("eth0", mac, ETH_ALEN, &lc_addr, INLEN)) {
  58.                 fprintf(stderr, "Error: Get host’s information failed\n");
  59.                 exit(0);
  60.         }
  61.         printf("        Host MAC is: %02x:%02x:%02x:%02x:%02x:%02x\n",*mac,*(mac+1),*(mac+2),*(mac+3),*(mac+4),*(mac+5));
  62.          printf("       Host IP is: %s\n", inet_ntop(AF_INET, &lc_addr, rep_addr, 1024));
  63.         /* 填写以太网头部*/
  64.         memcpy(req.eh.ether_dhost, MAC_BCAST_ADDR, ETH_ALEN);
  65.         memcpy(req.eh.ether_shost, mac, ETH_ALEN);
  66.         req.eh.ether_type = htons(ETHERTYPE_ARP);

  67.         /* 填写arp数据 */
  68.         req.ea.arp_hrd = htons(ARPHRD_ETHER);
  69.         req.ea.arp_pro = htons(ETHERTYPE_IP);
  70.         req.ea.arp_hln = ETH_ALEN;
  71.         req.ea.arp_pln = INLEN;
  72.         req.ea.arp_op = htons(ARPOP_REQUEST);
  73.         memcpy(req.ea.arp_sha, mac, ETH_ALEN);
  74.         memcpy(req.ea.arp_spa, &lc_addr, INLEN);
  75.         inet_aton(argv[1], req.ea.arp_tpa);

  76.         bzero(recv_buf, sizeof(recv_buf));
  77.         bzero(&repsa, sizeof(repsa));
  78.         salen = sizeof(struct sockaddr_ll);

  79.         if((n = sendto(fd, &req, sizeof(req), 0, (struct sockaddr *)&reqsa, sizeof(reqsa))) <= 0) {
  80.                 perror("Sendto error");
  81.                 exit(1);
  82.         }
  83.         printf("Broadcast arp request of %s, %d bytes be sent\n\n", argv[1], n);



  84.         while(1) {
  85.                 if((n = recvfrom(fd, recv_buf, sizeof(req), 0, (struct sockaddr *)&repsa, &salen)) <= 0) {
  86.                         perror("Recvfrom error");
  87.                         exit(1);
  88.                 }
  89.                 if(ntohs(*(__be16 *)(recv_buf + 20))==2 && !memcmp(req.ea.arp_tpa, recv_buf + 28, 4)) {
  90.                         printf("Response from %s, %d bytes received\n", argv[1], n);
  91.                         printf("        Peer IP is: %s\n", inet_ntop(AF_INET, (struct in_addr *)(recv_buf + 28), rep_addr, 1024));
  92.                         prmac( (u_char *)(recv_buf + 22) ); //prmac( (u_char *)(recv_buf + 6) );
  93.                         break;
  94.                 }
  95.                 else
  96.                     {
  97.                     printf("Have recive data\n");
  98.                     break;
  99.                     }
  100.         }

  101.         free(mac);
  102. }

  103. int get_ifi(char *dev, char * mac, int macln, struct in_addr *lc_addr, int ipln)
  104. {
  105.         int reqfd, n;
  106.         struct ifreq macreq;

  107.         reqfd = socket(AF_INET, SOCK_DGRAM, 0);
  108.         strcpy(macreq.ifr_name, dev);

  109.         /* 获取本地接口MAC地址*/
  110.         if(ioctl(reqfd, SIOCGIFHWADDR, ¯eq) != 0)
  111.                 return 1;
  112.         memcpy(mac, macreq.ifr_hwaddr.sa_data, macln);

  113.         /* 获取本地接口IP地址*/
  114.         if(ioctl(reqfd, SIOCGIFADDR, ¯eq) != 0)
  115.                 return 1;
  116.         memcpy(lc_addr, &((struct sockaddr_in *)(¯eq.ifr_addr))->sin_addr, ipln);

  117.         return 0;
  118. }

  119. void prmac(u_char *ptr)
  120. {
  121.         printf("        Peer MAC is: %02x:%02x:%02x:%02x:%02x:%02x\n",*ptr,*(ptr+1),*(ptr+2),*(ptr+3),*(ptr+4),*(ptr+5));
  122. }

  123. void usage_quit(char *arg0)
  124. {
  125.         fprintf(stderr, "Usage: %s \n", arg0);
  126.         exit(1);
  127. }
复制代码



  1. int getpeermac( int sockfd, char *buf )
  2. {
  3.     int ret =0;  
  4.     struct arpreq arpreq;  
  5.     struct sockaddr_in dstadd_in;  
  6.     socklen_t  len = sizeof( struct sockaddr_in );  
  7.     memset( &arpreq, 0, sizeof( struct arpreq ));  
  8.     memset( &dstadd_in, 0, sizeof( struct sockaddr_in ));  
  9.     if( getpeername( sockfd, (struct sockaddr*)&dstadd_in, &len ) < 0 )  
  10.         err_err("getpeername()");  
  11.     else  
  12.     {  
  13.         memcpy( &arpreq.arp_pa, &dstadd_in, sizeof( struct sockaddr_in ));  
  14.         strcpy(arpreq.arp_dev, "eth1");  
  15.         arpreq.arp_pa.sa_family = AF_INET;  
  16.         arpreq.arp_ha.sa_family = AF_UNSPEC;  
  17.         if( ioctl( sockfd, SIOCGARP, &arpreq ) < 0 )  
  18.             err_err("ioctl SIOCGARP");  
  19.         else  
  20.         {  
  21.             unsigned char* ptr = (unsigned char *)arpreq.arp_ha.sa_data;  
  22.             ret = sprintf(buf, "%02x%02x%02x%02x%02x%02x", *ptr, *(ptr+1), *(ptr+2), *(ptr+3), *(ptr+4), *(ptr+5));  
  23.         }  
  24.     }  
  25.     return ret;  
  26. }
复制代码










专业承接18-98岁xx的心理及生理教育辅导。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2024-11-24 09:51 , Processed in 0.084867 second(s), 19 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表