Advertisement
Guest User

Untitled

a guest
Mar 20th, 2019
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.02 KB | None | 0 0
  1. #include <arpa/inet.h>
  2. #include <linux/if_arp.h>
  3. #include <linux/if_ether.h>
  4. #include <linux/if_packet.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <string.h>
  8. #include <sys/ioctl.h>
  9. #include <unistd.h>
  10.  
  11. #define ETH_P_CUSTOM 0x8888
  12.  
  13. int main(int argc, char** argv) {
  14. int sfd,sfdS, i, ifindex,ifindexS;
  15. ssize_t len;
  16. char* frame;
  17. char* fdata;
  18. struct ethhdr* fhead;
  19. struct ifreq ifr, ifrS;
  20. struct sockaddr_ll sall, sallS;
  21. struct sockaddr_ll sallnew;
  22. socklen_t sl;
  23.  
  24. sfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_CUSTOM));
  25. strncpy(ifr.ifr_name, argv[1], IFNAMSIZ);
  26. ioctl(sfd, SIOCGIFINDEX, &ifr);
  27. ifindex = ifr.ifr_ifindex;
  28. ioctl(sfd, SIOCGIFHWADDR, &ifr);
  29. memset(&sall, 0, sizeof(struct sockaddr_ll));
  30. sall.sll_family = AF_PACKET;
  31. sall.sll_protocol = htons(ETH_P_CUSTOM);
  32. sall.sll_ifindex = ifr.ifr_ifindex;
  33. sall.sll_hatype = ARPHRD_ETHER;
  34. sall.sll_pkttype = PACKET_HOST;
  35. sall.sll_halen = ETH_ALEN;
  36. bind(sfd, (struct sockaddr*) &sall, sizeof(struct sockaddr_ll));
  37.  
  38. sfdS = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_CUSTOM));
  39. strncpy(ifrS.ifr_name, argv[1], IFNAMSIZ);
  40. ioctl(sfdS, SIOCGIFINDEX, &ifrS);
  41. ifindexS = ifrS.ifr_ifindex;
  42. ioctl(sfdS, SIOCGIFHWADDR, &ifrS);
  43. memset(&sallS, 0, sizeof(struct sockaddr_ll));
  44. sallS.sll_family = AF_PACKET;
  45. sallS.sll_protocol = htons(ETH_P_CUSTOM);
  46. sallS.sll_ifindex = ifr.ifr_ifindex;
  47. sallS.sll_hatype = ARPHRD_ETHER;
  48. sallS.sll_pkttype = PACKET_HOST;
  49. sallS.sll_halen = ETH_ALEN;
  50. bind(sfd, (struct sockaddr*) &sallS, sizeof(struct sockaddr_ll));
  51.  
  52. while(1) {
  53. //receive
  54. frame = malloc(ETH_FRAME_LEN);
  55. memset(frame, 0, ETH_FRAME_LEN);
  56. fhead = (struct ethhdr*) frame;
  57. fdata = frame + ETH_HLEN;
  58. len = recvfrom(sfd, frame, ETH_FRAME_LEN, 0, (struct sockaddr*) &sall, &sl);
  59.  
  60. printf("%d %d",sall.sll_pkttype,sall.sll_hatype);
  61.  
  62. printf("[%dB] %02x:%02x:%02x:%02x:%02x:%02x -> ", (int)len,
  63. fhead->h_source[0], fhead->h_source[1], fhead->h_source[2],
  64. fhead->h_source[3], fhead->h_source[4], fhead->h_source[5]);
  65. printf("%02x:%02x:%02x:%02x:%02x:%02x | ",
  66. fhead->h_dest[0], fhead->h_dest[1], fhead->h_dest[2],
  67. fhead->h_dest[3], fhead->h_dest[4], fhead->h_dest[5]);
  68. printf("%s\n", fdata);
  69. for (i = 0; i < len ; i++) {
  70. printf("%02x ", (unsigned char) frame[i]);
  71. if ((i + 1) % 16 == 0)
  72. printf("\n");
  73. }
  74. printf("\n\n");
  75. //send
  76.  
  77. sscanf(argv[2], "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",
  78. &sallS.sll_addr[0], &sallS.sll_addr[1], &sallS.sll_addr[2],
  79. &sallS.sll_addr[3], &sallS.sll_addr[4], &sallS.sll_addr[5]);
  80. memcpy(fhead->h_dest, &sallS.sll_addr, ETH_ALEN);
  81. memcpy(fhead->h_source, &ifrS.ifr_hwaddr.sa_data, ETH_ALEN);
  82. fhead->h_proto = htons(ETH_P_CUSTOM);
  83. memcpy(fdata, fdata, len);
  84. sendto(sfdS, frame, ETH_HLEN + len, 0,
  85. (struct sockaddr*) &sallS, sizeof(struct sockaddr_ll));
  86. free(frame);
  87. }
  88. close(sfd);
  89. close(sfdS);
  90. return EXIT_SUCCESS;
  91. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement