/* Thanks to crazyc for the packet replay code basics */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include typedef unsigned char __u8; typedef unsigned short __u16; #include "80211.h" struct llc_hdr { __u8 dsap; __u8 ssap; __u8 cntl; __u8 org_code[3]; __u16 type; } __attribute__ ((packed)); int initialize(char *device, int sd, int promisc) { struct ifreq ifr; strncpy(ifr.ifr_name, device, sizeof(ifr.ifr_name)); if (ioctl(sd, SIOCGIFFLAGS, &ifr)<0) { perror("SIOCGIFFLAGS"); return -1; } if (promisc) ifr.ifr_flags |= IFF_PROMISC; else ifr.ifr_flags &= ~IFF_PROMISC; if(ioctl(sd, SIOCSIFFLAGS, &ifr)<0) { perror("SIOCSIFFLAGS"); return -1; } printf("Initialized device %s\n", device); if (ioctl(sd, SIOCGIFINDEX, &ifr)<0) { perror("SIOCGIFINDEX"); return -1; } return ifr.ifr_ifindex; } void shutdownDevices() { printf("User shutdown\n"); exit(0); } void printMAC(u_char *mac) { int i; printf("%.2x", mac[0]); for (i = 1; i < ETH_ALEN; i++) { printf(":%.2x", mac[i]); } } int main(int argc, char **argv) { // const u_char startMAC[8] = {0x00, 0x09, 0xBF, 0x0A, 0xF1, 0x86, 0, 0}; const u_char startMAC[8] = {0x00, 0x09, 0xBF, 0x0B, 0x79, 0xB0, 0, 0}; struct ethhdr *ethHeader; struct sockaddr_ll etherSocket; int sd; int ethIndex; u_char packet[65535]; u_char sendPacket[65535]; signal(SIGINT, shutdownDevices); signal(SIGQUIT, shutdownDevices); // Set up raw sockets for sending sd = socket(PF_PACKET, SOCK_RAW, htons(ETH_P_ALL)); if (sd < 0) { printf("Couldn't create packet socket :(\n"); return 1; } if ((ethIndex = initialize("ath0", sd, 1)) < 0) { printf("Couldn't find adapter.\n"); return 1; } /* // Set the MAC address to our starting one struct ifreq req; strcpy(req.ifr_name, "ath0"); req.ifr_hwaddr.sa_family = ARPHRD_ETHER; memcpy(req.ifr_hwaddr.sa_data, startMAC, 6); if (ioctl(sd, SIOCSIFHWADDR, &req) < 0) { printf("Unable to set MAC address %d.\n",errno); return 1; }*/ // Bind the socket to the interface memset(ðerSocket, 0, sizeof(etherSocket)); etherSocket.sll_family = AF_PACKET; etherSocket.sll_protocol = htons(ETH_P_ALL); etherSocket.sll_ifindex = ethIndex; if (bind(sd, (struct sockaddr *)ðerSocket, sizeof(etherSocket)) < 0) { printf("Couldn't bind socket.\n"); return 1; } char errbuf[512]; errbuf[0] = 0; pcap_t *cap_file = pcap_open_offline("mariobeaconsmod", errbuf); if (errbuf[0] != 0) printf("Warning: %s\n",errbuf); if (!cap_file) { printf("Error opening packet file: %s\n",errbuf); return 1; } #define DLT_80211_PRISM 0x77 int header_offset = 0; if (pcap_datalink(cap_file) == DLT_80211_PRISM) { header_offset = 144; } printf("Header offset: %d\n", header_offset); struct pcap_pkthdr *header; const u_char *frame; if(pcap_next_ex(cap_file, &header, &frame) < 1) { printf("Unable to read packet.\n"); return 1; } struct timeval lasttime; struct timespec delay; lasttime.tv_sec = header->ts.tv_sec; lasttime.tv_usec = header->ts.tv_usec; do { if(lasttime.tv_usec > header->ts.tv_usec) { lasttime.tv_usec -= 1000000; lasttime.tv_sec++; } delay.tv_sec = header->ts.tv_sec - lasttime.tv_sec; delay.tv_nsec = (header->ts.tv_usec - lasttime.tv_usec) * 1000; nanosleep(&delay, NULL); lasttime.tv_sec = header->ts.tv_sec; lasttime.tv_usec = header->ts.tv_usec; memset(ðerSocket, 0, sizeof(etherSocket)); etherSocket.sll_family = AF_PACKET; etherSocket.sll_ifindex = ethIndex; memcpy(etherSocket.sll_addr, startMAC, 8); etherSocket.sll_halen = 6; printf("%d\n",header->len - header_offset - 4); if (sendto(sd, frame + header_offset, header->len - header_offset - 4, 0, (struct sockaddr *)ðerSocket, sizeof(etherSocket)) == -1) { printf("Error in sending packet.\n"); return 1; } } while(pcap_next_ex(cap_file, &header, &frame) == 1); return 0; }