Advertisement
Guest User

Untitled

a guest
Mar 20th, 2019
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.45 KB | None | 0 0
  1. /*
  2. * Copyright (C) 2019 Michal Kalewski <mkalewski at cs.put.poznan.pl>
  3. *
  4. * Compilation: gcc -Wall ./ethrecv.c -o ./ethrecv
  5. * Usage: ./ethrecv INTERFACE
  6. * NOTE: This program requires root privileges.
  7. *
  8. * Bug reports: https://gitlab.cs.put.poznan.pl/mkalewski/ps-2019/issues
  9. *
  10. */
  11.  
  12. #include <arpa/inet.h>
  13. #include <linux/if_arp.h>
  14. #include <linux/if_ether.h>
  15. #include <linux/if_packet.h>
  16. #include <stdio.h>
  17. #include <stdlib.h>
  18. #include <string.h>
  19. #include <sys/ioctl.h>
  20. #include <unistd.h>
  21.  
  22. #define ETH_P_CUSTOM 0x8888
  23. void sending(char** argv, data){
  24. int sfd, ifindex;
  25. char* frame;
  26. char* fdata;
  27. struct ethhdr* fhead;
  28. struct ifreq ifr;
  29. struct sockaddr_ll sall;
  30.  
  31. sfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_CUSTOM));
  32. frame = malloc(ETH_FRAME_LEN);
  33. memset(frame, 0, ETH_FRAME_LEN);
  34. fhead = (struct ethhdr*) frame;
  35. fdata = frame + ETH_HLEN;
  36. strncpy(ifr.ifr_name, argv[1], IFNAMSIZ);
  37. ioctl(sfd, SIOCGIFINDEX, &ifr);
  38. ifindex = ifr.ifr_ifindex;
  39. ioctl(sfd, SIOCGIFHWADDR, &ifr);
  40. memset(&sall, 0, sizeof(struct sockaddr_ll));
  41. sall.sll_family = AF_PACKET;
  42. sall.sll_protocol = htons(ETH_P_CUSTOM);
  43. sall.sll_ifindex = ifindex;
  44. sall.sll_hatype = ARPHRD_ETHER;
  45. sall.sll_pkttype = PACKET_OUTGOING;
  46. sall.sll_halen = ETH_ALEN;
  47. sscanf(argv[2], "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",
  48. &sall.sll_addr[0], &sall.sll_addr[1], &sall.sll_addr[2],
  49. &sall.sll_addr[3], &sall.sll_addr[4], &sall.sll_addr[5]);
  50. memcpy(fhead->h_dest, &sall.sll_addr, ETH_ALEN);
  51. memcpy(fhead->h_source, &ifr.ifr_hwaddr.sa_data, ETH_ALEN);
  52. fhead->h_proto = htons(ETH_P_CUSTOM);
  53. memcpy(fdata, data, strlen(data) + 1);
  54. sendto(sfd, frame, ETH_HLEN + strlen(data) + 1, 0,
  55. (struct sockaddr*) &sall, sizeof(struct sockaddr_ll));
  56. free(frame);
  57. close(sfd);
  58. }
  59. int main(int argc, char** argv) {
  60. int sfd, i;
  61. ssize_t len;
  62. char* frame;
  63. char* fdata;
  64. struct ethhdr* fhead;
  65. struct ifreq ifr;
  66. struct sockaddr_ll sall;
  67. struct sockaddr_ll sallnew;
  68. socklen_t sl;
  69.  
  70. sfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_CUSTOM));
  71. strncpy(ifr.ifr_name, argv[1], IFNAMSIZ);
  72. ioctl(sfd, SIOCGIFINDEX, &ifr);
  73. memset(&sall, 0, sizeof(struct sockaddr_ll));
  74. sall.sll_family = AF_PACKET;
  75. sall.sll_protocol = htons(ETH_P_CUSTOM);
  76. sall.sll_ifindex = ifr.ifr_ifindex;
  77. sall.sll_hatype = ARPHRD_ETHER;
  78. sall.sll_pkttype = PACKET_HOST;
  79. sall.sll_halen = ETH_ALEN;
  80. bind(sfd, (struct sockaddr*) &sall, sizeof(struct sockaddr_ll));
  81. while(1) {
  82. frame = malloc(ETH_FRAME_LEN);
  83. memset(frame, 0, ETH_FRAME_LEN);
  84. fhead = (struct ethhdr*) frame;
  85. fdata = frame + ETH_HLEN;
  86. len = recvfrom(sfd, frame, ETH_FRAME_LEN, 0, (struct sockaddr*) &sall, &sl);
  87.  
  88. printf("%d %d",sall.sll_pkttype,sall.sll_hatype);
  89.  
  90. printf("[%dB] %02x:%02x:%02x:%02x:%02x:%02x -> ", (int)len,
  91. fhead->h_source[0], fhead->h_source[1], fhead->h_source[2],
  92. fhead->h_source[3], fhead->h_source[4], fhead->h_source[5]);
  93. printf("%02x:%02x:%02x:%02x:%02x:%02x | ",
  94. fhead->h_dest[0], fhead->h_dest[1], fhead->h_dest[2],
  95. fhead->h_dest[3], fhead->h_dest[4], fhead->h_dest[5]);
  96. printf("%s\n", fdata);
  97. for (i = 0; i < len ; i++) {
  98. printf("%02x ", (unsigned char) frame[i]);
  99. if ((i + 1) % 16 == 0)
  100. printf("\n");
  101. }
  102. printf("\n\n");
  103. sending(argv, fdata);
  104. free(frame);
  105. }
  106. close(sfd);
  107. return EXIT_SUCCESS;
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement