sedrector

Untitled

Apr 7th, 2020
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.14 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. char *PkttypeNames[] = {
  13.     "To us",
  14.     "To all",
  15.     "To group",
  16.     "To someone else",
  17.     "Originated by us",
  18. };
  19.  
  20. int main(int argc, char** argv) {
  21.   int sfd, i;
  22.   ssize_t len;
  23.   char* frame;
  24.   char* fdata;
  25.   //char* pkthost;
  26.   struct ethhdr* fhead;
  27.   struct ifreq ifr;
  28.   struct sockaddr_ll sall;
  29.   struct sockaddr_ll sender;
  30.  
  31.   sfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_CUSTOM));
  32.   strncpy(ifr.ifr_name, argv[1], IFNAMSIZ);
  33.   ioctl(sfd, SIOCGIFINDEX, &ifr);
  34.   memset(&sall, 0, sizeof(struct sockaddr_ll));
  35.   sall.sll_family = AF_PACKET;
  36.   sall.sll_protocol = htons(ETH_P_CUSTOM);
  37.   sall.sll_ifindex = ifr.ifr_ifindex;
  38.   sall.sll_hatype = ARPHRD_ETHER;
  39.   sall.sll_pkttype = PACKET_HOST;
  40.   sall.sll_halen = ETH_ALEN;
  41.   bind(sfd, (struct sockaddr*) &sall, sizeof(struct sockaddr_ll));
  42.   while(1) {
  43.     frame = malloc(ETH_FRAME_LEN);
  44.     memset(frame, 0, ETH_FRAME_LEN);
  45.     fhead = (struct ethhdr*) frame;
  46.     fdata = frame + ETH_HLEN;
  47.     socklen_t addr_len = sizeof(sender);    
  48.     len = recvfrom(sfd, frame, ETH_FRAME_LEN, 0, (struct sockaddr*)&sender, &addr_len);
  49.    
  50.     printf("Rozmiar: [%dB] Nadawca: %02x:%02x:%02x:%02x:%02x:%02x -> ", (int)len,
  51.            fhead->h_source[0], fhead->h_source[1], fhead->h_source[2],
  52.            fhead->h_source[3], fhead->h_source[4], fhead->h_source[5]);
  53.     printf("Odbiorca: %02x:%02x:%02x:%02x:%02x:%02x |\n",
  54.            fhead->h_dest[0], fhead->h_dest[1], fhead->h_dest[2],
  55.            fhead->h_dest[3], fhead->h_dest[4], fhead->h_dest[5]);
  56.  
  57.     printf("Typ pakietu: %d [%s]\n", sender.sll_pkttype, PkttypeNames[sender.sll_pkttype]);
  58.     printf("EtherType : %d\n", sender.sll_protocol);
  59.     printf("Dane: %s\n", fdata);
  60.     for (i = 0; i < len ; i++) {
  61.       printf("%02x ", (unsigned char) frame[i]);
  62.       if ((i + 1) % 16 == 0)
  63.         printf("\n");
  64.     }
  65.  
  66.     printf("\n\n");
  67.     free(frame);
  68.   }
  69.   close(sfd);
  70.   return EXIT_SUCCESS;
  71. }
Advertisement
Add Comment
Please, Sign In to add comment