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>