⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 parseoptions.c

📁 VC++源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* parseoptions.c -- options handling * Copyright(C) 1999-2001 Salvatore Sanfilippo * Under GPL, see the COPYING file for more information about * the license.  */ /* $Id: parseoptions.c,v 1.25 2003/08/08 14:39:00 antirez Exp $ */ /* * Revised for Windows: Rob Turpin <rgturpin@epop3.com>  *                      7/03/2004           */#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#ifndef WIN32#include <sys/time.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <unistd.h>#else#include <winsock2.h>#include <sys/timeb.h>#include <io.h>#endif#include "antigetopt.h"#include "hping2.h"#include "globals.h"enum {	OPT_COUNT, OPT_INTERVAL, OPT_NUMERIC, OPT_QUIET, OPT_INTERFACE,	OPT_HELP, OPT_VERSION, OPT_DESTPORT, OPT_BASEPORT, OPT_TTL, OPT_ID,	OPT_WIN, OPT_SPOOF, OPT_FIN, OPT_SYN, OPT_RST, OPT_PUSH, OPT_ACK,	OPT_URG, OPT_XMAS, OPT_YMAS, OPT_FRAG, OPT_MOREFRAG, OPT_DONTFRAG,	OPT_FRAGOFF, OPT_TCPOFF, OPT_REL, OPT_DATA, OPT_RAWIP, OPT_ICMP,	OPT_UDP, OPT_BIND, OPT_UNBIND, OPT_DEBUG, OPT_VERBOSE, OPT_WINID,	OPT_KEEP, OPT_FILE, OPT_DUMP, OPT_PRINT, OPT_SIGN, OPT_LISTEN,	OPT_SAFE, OPT_TRACEROUTE, OPT_TOS, OPT_MTU, OPT_SEQNUM, OPT_BADCKSUM,	OPT_SETSEQ, OPT_SETACK, OPT_ICMPTYPE, OPT_ICMPCODE, OPT_END,	OPT_RROUTE, OPT_IPPROTO, OPT_ICMP_IPVER, OPT_ICMP_IPHLEN,	OPT_ICMP_IPLEN, OPT_ICMP_IPID, OPT_ICMP_IPPROTO, OPT_ICMP_CKSUM,	OPT_ICMP_TS, OPT_ICMP_ADDR, OPT_TCPEXITCODE, OPT_FAST, OPT_TR_KEEP_TTL,	OPT_TCP_TIMESTAMP, OPT_TR_STOP, OPT_TR_NO_RTT, OPT_ICMP_HELP,	OPT_RAND_DEST, OPT_RAND_SOURCE, OPT_LSRR, OPT_SSRR, OPT_ROUTE_HELP,	OPT_ICMP_IPSRC, OPT_ICMP_IPDST, OPT_ICMP_SRCPORT, OPT_ICMP_DSTPORT,	OPT_ICMP_GW, OPT_FORCE_ICMP, OPT_APD_SEND, OPT_SCAN, OPT_FASTER };static struct ago_optlist hping_optlist[] = {	{ 'c',	"count",	OPT_COUNT,	AGO_NEEDARG },	{ 'i',	"interval",	OPT_INTERVAL,	AGO_NEEDARG|AGO_EXCEPT0 },	{ 'n',	"numeric",	OPT_NUMERIC,	AGO_NOARG },	{ 'q',	"quiet",	OPT_QUIET,	AGO_NOARG },	{ 'I',	"interface",	OPT_INTERFACE,	AGO_NEEDARG },	{ 'h',	"help",		OPT_HELP,	AGO_NOARG },	{ 'v',	"version",	OPT_VERSION,	AGO_NOARG },	{ 'p',	"destport",	OPT_DESTPORT,	AGO_NEEDARG|AGO_EXCEPT0 },	{ 's',	"baseport",	OPT_BASEPORT,	AGO_NEEDARG|AGO_EXCEPT0 },	{ 't',	"ttl",		OPT_TTL,	AGO_NEEDARG },	{ 'N',	"id",		OPT_ID,		AGO_NEEDARG|AGO_EXCEPT0 },	{ 'w',	"win",		OPT_WIN,	AGO_NEEDARG|AGO_EXCEPT0 },	{ 'a',	"spoof",	OPT_SPOOF,	AGO_NEEDARG|AGO_EXCEPT0 },	{ 'F',	"fin",		OPT_FIN,	AGO_NOARG|AGO_EXCEPT0 },	{ 'S',	"syn",		OPT_SYN,	AGO_NOARG|AGO_EXCEPT0 },	{ 'R',	"rst",		OPT_RST,	AGO_NOARG|AGO_EXCEPT0 },	{ 'P',	"push",		OPT_PUSH,	AGO_NOARG|AGO_EXCEPT0 },	{ 'A',	"ack",		OPT_ACK,	AGO_NOARG|AGO_EXCEPT0 },	{ 'U',	"urg",		OPT_URG,	AGO_NOARG|AGO_EXCEPT0 },	{ 'X',	"xmas",		OPT_XMAS,	AGO_NOARG|AGO_EXCEPT0 },	{ 'Y',	"ymas",		OPT_YMAS,	AGO_NOARG|AGO_EXCEPT0 },	{ 'f',	"frag",		OPT_FRAG,	AGO_NOARG|AGO_EXCEPT0 },	{ 'x',	"morefrag",	OPT_MOREFRAG,	AGO_NOARG|AGO_EXCEPT0 },	{ 'y',	"dontfrag",	OPT_DONTFRAG,	AGO_NOARG },	{ 'g',	"fragoff",	OPT_FRAGOFF,	AGO_NEEDARG|AGO_EXCEPT0 },	{ 'O',	"tcpoff",	OPT_TCPOFF,	AGO_NEEDARG|AGO_EXCEPT0 },	{ 'r',	"rel",		OPT_REL,	AGO_NOARG },	{ 'd',	"data",		OPT_DATA,	AGO_NEEDARG|AGO_EXCEPT0 },	{ '0',	"rawip",	OPT_RAWIP,	AGO_NOARG|AGO_EXCEPT0 },	{ '1',	"icmp",		OPT_ICMP,	AGO_NOARG },	{ '2',	"udp",		OPT_UDP,	AGO_NOARG },	{ '8',	"scan",		OPT_SCAN,	AGO_NEEDARG },	{ 'z',	"bind",		OPT_BIND,	AGO_NOARG },	{ 'Z',	"unbind",	OPT_UNBIND,	AGO_NOARG },	{ 'D',	"debug",	OPT_DEBUG,	AGO_NOARG },	{ 'V',	"verbose",	OPT_VERBOSE,	AGO_NOARG },	{ 'W',	"winid",	OPT_WINID,	AGO_NOARG },	{ 'k',	"keep",		OPT_KEEP,	AGO_NOARG },	{ 'E',	"file",		OPT_FILE,	AGO_NEEDARG|AGO_EXCEPT0 },	{ 'j',	"dump",		OPT_DUMP,	AGO_NOARG|AGO_EXCEPT0 },	{ 'J',	"print",	OPT_PRINT,	AGO_NOARG|AGO_EXCEPT0 },	{ 'e',	"sign",		OPT_SIGN,	AGO_NEEDARG|AGO_EXCEPT0 },	{ '9',	"listen",	OPT_LISTEN,	AGO_NEEDARG|AGO_EXCEPT0 },	{ 'B',	"safe",		OPT_SAFE,	AGO_NOARG|AGO_EXCEPT0 },	{ 'T',	"traceroute",	OPT_TRACEROUTE,	AGO_NOARG },	{ 'o',	"tos",		OPT_TOS,	AGO_NEEDARG },	{ 'm',	"mtu",		OPT_MTU,	AGO_NEEDARG|AGO_EXCEPT0 },	{ 'Q',	"seqnum",	OPT_SEQNUM,	AGO_NOARG|AGO_EXCEPT0 },	{ 'b',	"badcksum",	OPT_BADCKSUM,	AGO_NOARG|AGO_EXCEPT0 },	{ 'M',	"setseq",	OPT_SETSEQ,	AGO_NEEDARG|AGO_EXCEPT0 },	{ 'L',	"setack",	OPT_SETACK,	AGO_NEEDARG|AGO_EXCEPT0 },	{ 'C',	"icmptype",	OPT_ICMPTYPE,	AGO_NEEDARG|AGO_EXCEPT0 },	{ 'K',	"icmpcode",	OPT_ICMPCODE,	AGO_NEEDARG|AGO_EXCEPT0 },	{ 'u',	"end",		OPT_END,	AGO_NOARG|AGO_EXCEPT0 },	{ 'G',	"rroute",	OPT_RROUTE,	AGO_NOARG },	{ 'H',	"ipproto",	OPT_IPPROTO,	AGO_NEEDARG|AGO_EXCEPT0 },	{ '\0',	"icmp-help",	OPT_ICMP_HELP,	AGO_NOARG },	{ '\0',	"icmp-ipver",	OPT_ICMP_IPVER,	AGO_NEEDARG|AGO_EXCEPT0 },	{ '\0',	"icmp-iphlen",	OPT_ICMP_IPHLEN, AGO_NEEDARG|AGO_EXCEPT0 },	{ '\0', "icmp-iplen",	OPT_ICMP_IPLEN,	 AGO_NEEDARG|AGO_EXCEPT0 },	{ '\0',	"icmp-ipid",	OPT_ICMP_IPID,	 AGO_NEEDARG|AGO_EXCEPT0 },	{ '\0',	"icmp-ipproto",	OPT_ICMP_IPPROTO, AGO_NEEDARG|AGO_EXCEPT0 },	{ '\0', "icmp-cksum",	OPT_ICMP_CKSUM,   AGO_NEEDARG|AGO_EXCEPT0 },	{ '\0',	"icmp-ts",	OPT_ICMP_TS,		AGO_NOARG },	{ '\0', "icmp-addr",	OPT_ICMP_ADDR,		AGO_NOARG },	{ '\0', "tcpexitcode",	OPT_TCPEXITCODE,	AGO_NOARG },	{ '\0',	"fast",		OPT_FAST,		AGO_NOARG|AGO_EXCEPT0 },	{ '\0',	"faster",	OPT_FASTER,		AGO_NOARG|AGO_EXCEPT0 },	{ '\0',	"tr-keep-ttl",	OPT_TR_KEEP_TTL,	AGO_NOARG },	{ '\0', "tcp-timestamp",OPT_TCP_TIMESTAMP,	AGO_NOARG },	{ '\0', "tr-stop",	OPT_TR_STOP,		AGO_NOARG },	{ '\0',	"tr-no-rtt",	OPT_TR_NO_RTT,		AGO_NOARG },	{ '\0', "rand-dest",	OPT_RAND_DEST,		AGO_NOARG },	{ '\0', "rand-source",	OPT_RAND_SOURCE,	AGO_NOARG },  	{ '\0', "lsrr",     OPT_LSRR, AGO_NEEDARG|AGO_EXCEPT0 },  	{ '\0', "ssrr",     OPT_SSRR, AGO_NEEDARG|AGO_EXCEPT0 },  	{ '\0', "route-help",   OPT_ROUTE_HELP, AGO_NOARG }, AGO_LIST_TERM,	{ '\0', "apd-send",	OPT_APD_SEND,		AGO_NEEDARG },	{ '\0', "icmp-ipsrc",	OPT_ICMP_IPSRC,		AGO_NEEDARG|AGO_EXCEPT0 },	{ '\0', "icmp-ipdst",	OPT_ICMP_IPDST,		AGO_NEEDARG|AGO_EXCEPT0 },	{ '\0', "icmp-gw",	OPT_ICMP_GW,		AGO_NEEDARG|AGO_EXCEPT0 },	{ '\0', "icmp-srcport", OPT_ICMP_SRCPORT,	AGO_NEEDARG|AGO_EXCEPT0 },	{ '\0', "icmp-dstport", OPT_ICMP_DSTPORT,	AGO_NEEDARG|AGO_EXCEPT0 },	{ '\0', "force-icmp",	OPT_FORCE_ICMP,		AGO_NOARG },	AGO_LIST_TERM};/* The following var is turned to 1 if the -i option is used. * This allows to assign a different delay default value if * the scanning mode is selected. */static int delay_changed = 0;#ifndef WIN32static int suidtester(void){  return (getuid() != geteuid());}#endifvoid fail_parse_route(void){    fprintf(stderr, "RECTUM\n");    exit(1);}void parse_route(unsigned char *route, unsigned int *route_len, char *str){#ifndef WIN32  struct in_addr ip;#else  unsigned long ip;#endif  unsigned int i = 0;  unsigned int j;  unsigned int n = 0;  unsigned int route_ptr = 256;  char c;  route += 3;  while (str[i] != '\0') {    for (j = i; isalnum(str[j]) || str[j] == '.'; j++);    switch (c = str[j]) {    case '\0':    case '/':      if (n >= 62) {        fprintf(stderr, "too long route\n");        fail_parse_route();      }      str[j] = '\0';#ifndef WIN32      if (inet_aton(str + i, &ip)) {        memcpy(route + 4 * n, &ip.s_addr, 4);#else      if ((ip = inet_addr(str + i)) != INADDR_NONE) {        memcpy(route + 4 * n, &ip, 4);#endif           n++;        if (c == '/')          str[j++] = '/';        break;      }      fprintf(stderr, "invalid IP adress in route\n");      fail_parse_route();    case ':':      if ((!i) && j && j < 4) {        sscanf(str, "%u:%n", &route_ptr, &i);        if (i == ++j) {          if (route_ptr < 256)            break;        }      }    default:      fail_parse_route();    }    i = j;  }  if (route_ptr == 256)    route[-1] = (unsigned char) ( n ? 8 : 4 );  else    route[-1] = (unsigned char) route_ptr;      *route_len = 4*n + 3;  route[-2] = (unsigned char) *route_len;}int parse_options(int argc, char **argv){	int src_ttl_set = 0;	int targethost_set = 0;	int o;	if (argc < 2)		return -1;#ifndef WIN32  ago_set_exception(0, suidtester, "Option disabled when setuid");#endif	while ((o = antigetopt(argc, argv, hping_optlist)) != AGO_EOF) {		switch(o) {		case AGO_UNKNOWN:		case AGO_REQARG:		case AGO_AMBIG:			ago_gnu_error("hping", o);			fprintf(stderr, "Try hping --help\n");			exit(1);		case AGO_ALONE:			if (targethost_set == 1) {				fprintf(stderr, "hping: you must specify only "						"one target host at a time\n");				exit(1);			}       else {				strlcpy(targetname, ago_optarg, 1024);				targethost_set = 1;			}			break;		case OPT_COUNT:			count = strtol(ago_optarg, NULL, 0);			break;		case OPT_INTERVAL:#ifndef WIN32			if (*ago_optarg == 'u') {				opt_waitinusec = TRUE;				usec_delay.it_value.tv_sec =				usec_delay.it_interval.tv_sec = 0;				usec_delay.it_value.tv_usec = 				usec_delay.it_interval.tv_usec =					atol(ago_optarg+1);#else      if (*ago_optarg == 'm') {				opt_waitinusec = TRUE;        msec_delay.millitm = atol(ago_optarg + 1);        #endif      			}			else				sending_wait = strtol(ago_optarg, NULL, 0);		case OPT_NUMERIC:			opt_numeric = TRUE;			break;		case OPT_QUIET:			opt_quiet = TRUE;			break;		case OPT_INTERFACE:      strlcpy (ifname, ago_optarg, 1024);#ifdef WIN32      strlcpy(ifstraddr, ifname, 1024);#endif			break;		case OPT_HELP:			show_usage();			break;		case OPT_VERSION:			show_version();			break;		case OPT_DESTPORT:			if (*ago_optarg == '+')			{				opt_incdport = TRUE;				ago_optarg++;			}			if (*ago_optarg == '+')			{				opt_force_incdport = TRUE;				ago_optarg++;			}			base_dst_port = dst_port = strtol(ago_optarg, NULL, 0);			break;		case OPT_BASEPORT:			initsport = strtol(ago_optarg, NULL, 0);			break;		case OPT_TTL:			src_ttl = strtol(ago_optarg, NULL, 0);			src_ttl_set = 1;			break;		case OPT_ID:			src_id = strtol(ago_optarg, NULL, 0);			break;		case OPT_WIN:			src_winsize = strtol(ago_optarg, NULL, 0);			break;		case OPT_SPOOF:			strlcpy (spoofaddr, ago_optarg, 1024);			break;		case OPT_FIN:			tcp_th_flags |= TH_FIN;			break;		case OPT_SYN:			tcp_th_flags |= TH_SYN;			break;		case OPT_RST:			tcp_th_flags |= TH_RST;			break;		case OPT_PUSH:			tcp_th_flags |= TH_PUSH;			break;		case OPT_ACK:			tcp_th_flags |= TH_ACK;			break;		case OPT_URG:			tcp_th_flags |= TH_URG;			break;		case OPT_XMAS:			tcp_th_flags |= TH_X;			break;		case OPT_YMAS:			tcp_th_flags |= TH_Y;			break;		case OPT_FRAG:			opt_fragment = TRUE;			break;		case OPT_MOREFRAG:			opt_mf = TRUE;			break;		case OPT_DONTFRAG:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -