Annotation of embedaddon/hping2/main.c, revision 1.1.1.1

1.1       misho       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.26 2003/08/07 23:55:55 antirez 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>