File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / hping2 / main.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 22:11:37 2012 UTC (12 years, 7 months ago) by misho
Branches: hping2, MAIN
CVS tags: v2_0_0rc3p7, v2_0_0rc3p5, v2_0_0rc3p4, v2_0_0rc3p0, v2_0_0rc3, HEAD
hping2

    1: /* 
    2:  * $smu-mark$ 
    3:  * $name: main.c$ 
    4:  * $author: Salvatore Sanfilippo <antirez@invece.org>$ 
    5:  * $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$ 
    6:  * $license: This software is under GPL version 2 of license$ 
    7:  * $date: Fri Nov  5 11:55:48 MET 1999$ 
    8:  * $rev: 8$ 
    9:  */ 
   10: 
   11: /*
   12:  * hping official page at http://www.kyuzz.org/antirez
   13:  * Covered by GPL version 2, Read the COPYING file for more information
   14:  */
   15: 
   16: /* $Id: main.c,v 1.1.1.1 2012/02/21 22:11:37 misho Exp $ */
   17: 
   18: #include <unistd.h>
   19: #include <string.h>
   20: #include <stdio.h>
   21: #include <stdlib.h>
   22: #include <sys/socket.h>
   23: #include <netinet/in.h>
   24: #include <arpa/inet.h>
   25: #include <signal.h>
   26: #include <time.h>
   27: #include <sys/time.h>
   28: #include <sys/types.h>
   29: 
   30: #include "hping2.h"
   31: 
   32: #if (!defined OSTYPE_LINUX) || (defined FORCE_LIBPCAP)
   33: #include <pcap.h>
   34: #endif /* ! OSTYPE_LINUX || FORCE_LIBPCAP */
   35: 
   36: /* globals */
   37: unsigned int
   38: 	tcp_th_flags = 0,
   39: 	linkhdr_size,				/* physical layer header size */
   40: 	ip_tos = 0,
   41: 	set_seqnum = FALSE,
   42: 	tcp_seqnum = FALSE,
   43: 	set_ack,
   44: 	h_if_mtu,
   45: 	virtual_mtu	= DEFAULT_VIRTUAL_MTU,
   46: 	ip_frag_offset	= 0,
   47: 	signlen,
   48: 	lsr_length = 0,
   49: 	ssr_length = 0,
   50: 	tcp_ack;
   51: 
   52: 
   53: unsigned short int
   54: 	data_size = 0;
   55: 
   56: float
   57: 	rtt_min = 0,
   58: 	rtt_max = 0,
   59: 	rtt_avg = 0;
   60: 
   61: int
   62: 	sockpacket,
   63: 	sockraw,
   64: 	sent_pkt = 0,
   65: 	recv_pkt = 0,
   66: 	out_of_sequence_pkt = 0,
   67: 	sending_wait = DEFAULT_SENDINGWAIT,	/* see DEFAULT_SENDINGWAIT */
   68: 	opt_rawipmode	= FALSE,
   69: 	opt_icmpmode	= FALSE,
   70: 	opt_udpmode	= FALSE,
   71: 	opt_scanmode	= FALSE,
   72: 	opt_listenmode  = FALSE,
   73: 	opt_waitinusec	= FALSE,
   74: 	opt_numeric	= FALSE,
   75: 	opt_gethost	= TRUE,
   76: 	opt_quiet	= FALSE,
   77: 	opt_relid	= FALSE,
   78: 	opt_fragment	= FALSE,
   79: 	opt_df		= FALSE,
   80: 	opt_mf		= FALSE,
   81: 	opt_debug	= FALSE,
   82: 	opt_verbose	= FALSE,
   83: 	opt_winid_order = FALSE,
   84: 	opt_keepstill	= FALSE,
   85: 	opt_datafromfile= FALSE,
   86: 	opt_hexdump	= FALSE,
   87: 	opt_contdump	= FALSE,
   88: 	opt_sign	= FALSE,
   89: 	opt_safe	= FALSE,
   90: 	opt_end		= FALSE,
   91: 	opt_traceroute  = FALSE,
   92: 	opt_seqnum	= FALSE,
   93: 	opt_incdport	= FALSE,
   94: 	opt_force_incdport = FALSE,
   95: 	opt_icmptype	= DEFAULT_ICMP_TYPE,
   96: 	opt_icmpcode	= DEFAULT_ICMP_CODE,
   97: 	opt_rroute	= FALSE,
   98: 	opt_tcpexitcode	= FALSE,
   99: 	opt_badcksum	= FALSE,
  100: 	opt_tr_keep_ttl = FALSE,
  101: 	opt_tcp_timestamp = FALSE,
  102: 	opt_tr_stop	= FALSE,
  103: 	opt_tr_no_rtt	= FALSE,
  104: 	opt_rand_dest	= FALSE,
  105: 	opt_rand_source	= FALSE,
  106: 	opt_lsrr        = FALSE,
  107: 	opt_ssrr        = FALSE,
  108: 	opt_cplt_rte    = FALSE,
  109: 	tcp_exitcode	= 0,
  110: 	src_ttl		= DEFAULT_TTL,
  111: 	src_id		= -1, /* random */
  112: 	base_dst_port	= DEFAULT_DPORT,
  113: 	dst_port	= DEFAULT_DPORT,
  114: 	src_port,
  115: 	sequence	= 0,
  116: 	initsport	= DEFAULT_INITSPORT,
  117: 	src_winsize	= DEFAULT_SRCWINSIZE,
  118: 	src_thoff 	= (TCPHDR_SIZE >> 2),
  119: 	count		= DEFAULT_COUNT,
  120: 	ctrlzbind	= DEFAULT_BIND,
  121: 	delaytable_index= 0,
  122: 	eof_reached	= FALSE,
  123: 	icmp_ip_version = DEFAULT_ICMP_IP_VERSION,
  124: 	icmp_ip_ihl	= DEFAULT_ICMP_IP_IHL,
  125: 	icmp_ip_tos	= DEFAULT_ICMP_IP_TOS,
  126: 	icmp_ip_tot_len = DEFAULT_ICMP_IP_TOT_LEN,
  127: 	icmp_ip_id	= DEFAULT_ICMP_IP_ID,
  128: 	icmp_ip_protocol= DEFAULT_ICMP_IP_PROTOCOL,
  129: 	icmp_ip_srcport	= DEFAULT_DPORT,
  130: 	icmp_ip_dstport	= DEFAULT_DPORT,
  131: 	opt_force_icmp  = FALSE,
  132: 	icmp_cksum	= DEFAULT_ICMP_CKSUM,
  133: 	raw_ip_protocol	= DEFAULT_RAW_IP_PROTOCOL;
  134: 
  135: char
  136: 	datafilename	[1024],
  137: 	targetname	[1024],
  138: 	targetstraddr	[1024],
  139: 	ifname		[1024] = {'\0'},
  140: 	ifstraddr	[1024],
  141: 	spoofaddr	[1024],
  142: 	icmp_ip_srcip	[1024],
  143: 	icmp_ip_dstip	[1024],
  144: 	icmp_gwip	[1024],
  145: 	sign		[1024],
  146: 	rsign		[1024], /* reverse sign (hping -> gniph) */
  147: 	ip_opt		[40],
  148: 	*opt_scanports = "";
  149: 
  150: unsigned char
  151: 	lsr		[255] = {0},
  152: 	ssr		[255] = {0};
  153: 
  154: unsigned
  155: 	ip_optlen	= 0;
  156: 
  157: struct sockaddr_in
  158: 	icmp_ip_src,
  159: 	icmp_ip_dst,
  160: 	icmp_gw,
  161: 	local,
  162: 	remote;
  163: 
  164: struct itimerval usec_delay;
  165: volatile struct delaytable_element delaytable[TABLESIZE];
  166: 
  167: struct hcmphdr *hcmphdr_p; /* global pointer used by send_hcmp to transfer
  168: 			      hcmp headers to data_handler */
  169: 
  170: #if (!defined OSTYPE_LINUX) || (defined FORCE_LIBPCAP)
  171: pcap_t *pcapfp;
  172: char errbuf[PCAP_ERRBUF_SIZE];
  173: struct pcap_pkthdr hdr;
  174: #endif /* ! OSTYPE_LINUX || FORCE_LIBPCAP */
  175: 
  176: /* main */
  177: int main(int argc, char **argv)
  178: {
  179: 	char setflags[1024] = {'\0'};
  180: 	int c, hdr_size;
  181: 
  182: 	if (parse_options(argc, argv) == -1) {
  183: 		printf("hping2: missing host argument\n"
  184: 			"Try `hping2 --help' for more information.\n");
  185: 		exit(1);
  186: 	}
  187: 
  188: 	/* reverse sign */
  189: 	if (opt_sign || opt_listenmode) {
  190: 		char *src = sign+strlen(sign)-1; /* last char before '\0' */
  191: 		char *dst = rsign;
  192: 
  193: 		while(src>=sign)
  194: 			*dst++ = *src--;
  195: 		*dst = '\0';
  196: 		if (opt_debug)
  197: 			printf("DEBUG: reverse sign: %s\n", rsign);
  198: 	}
  199: 
  200: 	/* get target address before interface processing */
  201: 	if ((!opt_listenmode && !opt_safe) && !opt_rand_dest)
  202: 		resolve((struct sockaddr*)&remote, targetname);
  203: 
  204: 	if (opt_rand_dest) {
  205: 		strlcpy(targetstraddr, targetname, sizeof(targetstraddr));
  206: 	} else {
  207: 		strlcpy(targetstraddr, inet_ntoa(remote.sin_addr),
  208: 			sizeof(targetstraddr));
  209: 	}
  210: 
  211: 	/* get interface's name and address */
  212: 	if ( get_if_name() == -1 ) {
  213: 		printf("[main] no such device\n");
  214: 		exit(1);
  215: 	}
  216: 
  217: 	if (opt_verbose || opt_debug) {
  218: 		printf("using %s, addr: %s, MTU: %d\n",
  219: 			ifname, ifstraddr, h_if_mtu);
  220: 	}
  221: 
  222: 	/* open raw socket */
  223: 	sockraw = open_sockraw();
  224: 	if (sockraw == -1) {
  225: 		printf("[main] can't open raw socket\n");
  226: 		exit(1);
  227: 	}
  228: 
  229: 	/* set SO_BROADCAST option */
  230: 	socket_broadcast(sockraw);
  231: 	/* set SO_IPHDRINCL option */
  232: 	socket_iphdrincl(sockraw);
  233: 
  234: 	/* open sock packet or libpcap socket */
  235: #if (defined OSTYPE_LINUX) && (!defined FORCE_LIBPCAP)
  236: 	sockpacket = open_sockpacket();
  237: 	if (sockpacket == -1) {
  238: 		printf("[main] can't open packet socket\n");
  239: 		exit(1);
  240: 	}
  241: #else
  242: 	if (open_pcap() == -1) {
  243: 		printf("[main] open_pcap failed\n");
  244: 		exit(1);
  245: 	}
  246: #endif /* OSTYPE_LINUX && !FORCE_LIBPCAP */
  247: 
  248: 	/* get physical layer header size */
  249: 	if ( get_linkhdr_size(ifname) == -1 ) {
  250: 		printf("[main] physical layer header size unknown\n");
  251: 		exit(1);
  252: 	}
  253: 
  254: 	if (spoofaddr[0] == '\0')
  255: 		resolve((struct sockaddr*)&local, ifstraddr);
  256: 	else
  257: 		resolve((struct sockaddr*)&local, spoofaddr);
  258: 
  259: 	if (icmp_ip_srcip[0] == '\0')
  260: 		resolve((struct sockaddr*)&icmp_ip_src, "1.2.3.4");
  261: 	else
  262: 		resolve((struct sockaddr*)&icmp_ip_src, icmp_ip_srcip);
  263: 
  264: 	if (icmp_ip_dstip[0] == '\0')
  265: 		resolve((struct sockaddr*)&icmp_ip_dst, "5.6.7.8");
  266: 	else
  267: 		resolve((struct sockaddr*)&icmp_ip_dst, icmp_ip_dstip);
  268: 
  269: 	if (icmp_gwip[0] == '\0')
  270: 		resolve((struct sockaddr*)&icmp_gw, "0.0.0.0");
  271: 	else
  272: 		resolve((struct sockaddr*)&icmp_gw, icmp_gwip);
  273: 
  274: 	srand(time(NULL));
  275: 
  276: 	/* set initial source port */
  277: 	if (initsport == -1)
  278: 		initsport = src_port = 1024 + (rand() % 2000);
  279: 	else
  280: 		src_port = initsport;
  281: 
  282: 	for (c = 0; c < TABLESIZE; c++)
  283: 		delaytable[c].seq = -1;
  284: 
  285: 	/* use SIGALRM to send packets like ping do */
  286: 	Signal(SIGALRM, send_packet);
  287: 
  288: 	/* binding */
  289: 	if (ctrlzbind != BIND_NONE) Signal(SIGTSTP, inc_destparm);
  290: 	Signal(SIGINT, print_statistics);
  291: 	Signal(SIGTERM, print_statistics);
  292: 
  293: 	/* if we are in listemode enter in listenmain() else  */
  294: 	/* print HPING... bla bla bla and enter in wait_packet() */
  295: 	if (opt_listenmode) {
  296: 		fprintf(stderr, "hping2 listen mode\n");
  297: 
  298: 		/* memory protection */
  299: 		if (memlockall() == -1) {
  300: 			perror("[main] memlockall()");
  301: 			fprintf(stderr, "Warning: can't disable memory paging!\n");
  302: 		} else if (opt_verbose || opt_debug) {
  303: 			printf("Memory paging disabled\n");
  304: 		}
  305: 		listenmain();
  306: 		/* UNREACHED */
  307: 	}
  308: 
  309: 	/* Scan mode */
  310: 	if (opt_scanmode) {
  311: 		fprintf(stderr, "Scanning %s (%s), port %s\n",
  312: 				targetname, targetstraddr, opt_scanports);
  313: 		scanmain();
  314: 		/* UNREACHED */
  315: 	}
  316: 
  317: 	if (opt_rawipmode) {
  318: 		strcat(setflags, "raw IP mode");
  319: 		hdr_size = IPHDR_SIZE;
  320: 	} else if (opt_icmpmode) {
  321: 		strcat(setflags, "icmp mode");
  322: 		hdr_size = IPHDR_SIZE + ICMPHDR_SIZE;
  323: 	} else if (opt_udpmode) {
  324: 		strcat(setflags, "udp mode");
  325: 		hdr_size = IPHDR_SIZE + UDPHDR_SIZE;
  326: 	} else {
  327: 		if (tcp_th_flags & TH_RST)  strcat(setflags, "R");
  328: 		if (tcp_th_flags & TH_SYN)  strcat(setflags, "S");
  329: 		if (tcp_th_flags & TH_ACK)  strcat(setflags, "A");
  330: 		if (tcp_th_flags & TH_FIN)  strcat(setflags, "F");
  331: 		if (tcp_th_flags & TH_PUSH) strcat(setflags, "P");
  332: 		if (tcp_th_flags & TH_URG)  strcat(setflags, "U");
  333: 		if (tcp_th_flags & TH_X)    strcat(setflags, "X");
  334: 		if (tcp_th_flags & TH_Y)    strcat(setflags, "Y");
  335: 		if (setflags[0] == '\0')    strcat(setflags, "NO FLAGS are");
  336: 		hdr_size = IPHDR_SIZE + TCPHDR_SIZE;
  337: 	}
  338: 	
  339: 	printf("HPING %s (%s %s): %s set, %d headers + %d data bytes\n",
  340: 		targetname,
  341: 		ifname,
  342: 		targetstraddr,
  343: 		setflags,
  344: 		hdr_size,
  345: 		data_size);
  346: 
  347: 	/* memory protection */
  348: 	if (opt_datafromfile || opt_sign) {
  349: 		if (memlockall() == -1) {
  350: 			perror("[main] memlockall()");
  351: 			fprintf(stderr,
  352: 				"Warning: can't disable memory paging!\n");
  353: 		} else if (opt_verbose || opt_debug) {
  354: 			printf("Memory paging disabled\n");
  355: 		}
  356: 	}
  357: 
  358: 	/* start packet sending */
  359: 	kill(getpid(), SIGALRM);
  360: 
  361: 	/* main loop */
  362: 	while(1)
  363: 		wait_packet();
  364: 
  365: 	return 0;
  366: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>