Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <arpa/inet.h>
- #include <linux/if_arp.h>
- #include <linux/if_ether.h>
- #include <linux/if_packet.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/ioctl.h>
- #include <unistd.h>
- #define ETH_P_CUSTOM 0x8888
- int main(int argc, char** argv) {
- int sfd,sfdS, i, ifindex,ifindexS;
- ssize_t len;
- char* frame;
- char* fdata;
- struct ethhdr* fhead;
- struct ifreq ifr, ifrS;
- struct sockaddr_ll sall, sallS;
- struct sockaddr_ll sallnew;
- socklen_t sl;
- sfd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_CUSTOM));
- strncpy(ifr.ifr_name, argv[1], IFNAMSIZ);
- ioctl(sfd, SIOCGIFINDEX, &ifr);
- ifindex = ifr.ifr_ifindex;
- ioctl(sfd, SIOCGIFHWADDR, &ifr);
- memset(&sall, 0, sizeof(struct sockaddr_ll));
- sall.sll_family = AF_PACKET;
- sall.sll_protocol = htons(ETH_P_CUSTOM);
- sall.sll_ifindex = ifr.ifr_ifindex;
- sall.sll_hatype = ARPHRD_ETHER;
- sall.sll_pkttype = PACKET_HOST;
- sall.sll_halen = ETH_ALEN;
- bind(sfd, (struct sockaddr*) &sall, sizeof(struct sockaddr_ll));
- sfdS = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_CUSTOM));
- strncpy(ifrS.ifr_name, argv[1], IFNAMSIZ);
- ioctl(sfdS, SIOCGIFINDEX, &ifrS);
- ifindexS = ifrS.ifr_ifindex;
- ioctl(sfdS, SIOCGIFHWADDR, &ifrS);
- memset(&sallS, 0, sizeof(struct sockaddr_ll));
- sallS.sll_family = AF_PACKET;
- sallS.sll_protocol = htons(ETH_P_CUSTOM);
- sallS.sll_ifindex = ifr.ifr_ifindex;
- sallS.sll_hatype = ARPHRD_ETHER;
- sallS.sll_pkttype = PACKET_HOST;
- sallS.sll_halen = ETH_ALEN;
- bind(sfd, (struct sockaddr*) &sallS, sizeof(struct sockaddr_ll));
- while(1) {
- //receive
- frame = malloc(ETH_FRAME_LEN);
- memset(frame, 0, ETH_FRAME_LEN);
- fhead = (struct ethhdr*) frame;
- fdata = frame + ETH_HLEN;
- len = recvfrom(sfd, frame, ETH_FRAME_LEN, 0, (struct sockaddr*) &sall, &sl);
- printf("%d %d",sall.sll_pkttype,sall.sll_hatype);
- printf("[%dB] %02x:%02x:%02x:%02x:%02x:%02x -> ", (int)len,
- fhead->h_source[0], fhead->h_source[1], fhead->h_source[2],
- fhead->h_source[3], fhead->h_source[4], fhead->h_source[5]);
- printf("%02x:%02x:%02x:%02x:%02x:%02x | ",
- fhead->h_dest[0], fhead->h_dest[1], fhead->h_dest[2],
- fhead->h_dest[3], fhead->h_dest[4], fhead->h_dest[5]);
- printf("%s\n", fdata);
- for (i = 0; i < len ; i++) {
- printf("%02x ", (unsigned char) frame[i]);
- if ((i + 1) % 16 == 0)
- printf("\n");
- }
- printf("\n\n");
- //send
- sscanf(argv[2], "%hhx:%hhx:%hhx:%hhx:%hhx:%hhx",
- &sallS.sll_addr[0], &sallS.sll_addr[1], &sallS.sll_addr[2],
- &sallS.sll_addr[3], &sallS.sll_addr[4], &sallS.sll_addr[5]);
- memcpy(fhead->h_dest, &sallS.sll_addr, ETH_ALEN);
- memcpy(fhead->h_source, &ifrS.ifr_hwaddr.sa_data, ETH_ALEN);
- fhead->h_proto = htons(ETH_P_CUSTOM);
- memcpy(fdata, fdata, len);
- sendto(sfdS, frame, ETH_HLEN + len, 0,
- (struct sockaddr*) &sallS, sizeof(struct sockaddr_ll));
- free(frame);
- }
- close(sfd);
- close(sfdS);
- return EXIT_SUCCESS;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement