ZBLOG

上述代码在客户端运行后,服务端接收到的报文并非新MAC

抱歉,我之前给出的代码只是一个简单的示例,它仅仅在本地修改了捕获到的报文中的源MAC地址,并没有直接发送到网络上。因此,当服务端接收到报文时,并不会看到修改后的MAC地址。

要实现修改后的MAC地址被服务端正确接收,需要将修改后的报文重新发送到网络上。你可以使用Raw Socket技术来发送自定义构造的以太网帧报文。

以下是一个简单的示例,演示了如何使用Raw Socket发送以太网帧报文并修改源MAC地址:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <sys/socket.h>
  5. #include <netinet/in.h>
  6. #include <netinet/ip.h>
  7. #include <netinet/if_ether.h>
  8. #include <net/if_arp.h>
  9. #include <arpa/inet.h>
  10. int main() {
  11. int sockfd;
  12. struct sockaddr_ll sa;
  13. char interface[] = "eth0";
  14. // 创建原始套接字
  15. sockfd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
  16. if (sockfd == -1) {
  17. perror("无法创建套接字");
  18. return 1;
  19. }
  20. // 获取本地网卡接口索引
  21. memset(&sa, 0, sizeof(struct sockaddr_ll));
  22. sa.sll_family = AF_PACKET;
  23. if (ioctl(sockfd, SIOCGIFINDEX, &sa) == -1) {
  24. perror("获取网卡索引失败");
  25. close(sockfd);
  26. return 1;
  27. }
  28. // 设置目标接口和MAC地址
  29. strncpy(sa.sll_ifr.ifr_name, interface, IFNAMSIZ);
  30. // 获取本地网卡的MAC地址
  31. if (ioctl(sockfd, SIOCGIFHWADDR, &sa) == -1) {
  32. perror("获取MAC地址失败");
  33. close(sockfd);
  34. return 1;
  35. }
  36. unsigned char srcMac[] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55}; // 原始源MAC地址
  37. unsigned char dstMac[] = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF}; // 新的目标MAC地址
  38. struct ethhdr *eth;
  39. char packet[sizeof(struct ethhdr)];
  40. // 构造以太网帧报文
  41. eth = (struct ethhdr *)packet;
  42. memcpy(eth->h_dest, dstMac, ETH_ALEN); // 目标MAC地址
  43. memcpy(eth->h_source,s sa.sll_addr , ETH_ALEN); // 源MAC地址为本地网卡的物理地址(通过ioctl获取)
  44. // 填写以太网类型字段,例如IPV4是htons(ETH_P_IP),ARP是htons(ETH_P_ARP)
  45. eth->h_proto = htons(ETH_P_IP);
  46. // 发送报文
  47. if (sendto(sockfd,(char*)packet,sizeof(packet),0,(struct sockaddr*)&sa,sizeof(struct sockaddr_ll))==-1){
  48. perror("发送报文失败");
  49. close(sockfd);
  50. return -1;
  51. }
  52. printf("已成功发送报文\n");
  53. close(sockfd);
  54. return 0;
  55. }

请注意,上述代码只是一个简单的示例,并假设你已经知道要发送报文的目标接口。你需要根据实际情况进行修改和适配。

使用Raw Socket需要root权限或者相应的权限设置,同时在使用时请确保遵守法律规定并遵循适当的使用规范。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=4300

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?