/* * $smu-mark$ * $name: hping2.h$ * $author: Salvatore Sanfilippo $ * $copyright: Copyright (C) 1999 by Salvatore Sanfilippo$ * $license: This software is under GPL version 2 of license$ * $date: Fri Nov 5 11:55:48 MET 1999$ * $rev: 9$ */ /* $Id: hping2.h,v 1.19 2003/08/07 23:55:55 antirez Exp $ */ #ifndef _HPING2_H #define _HPING2_H #include #include #include #include "byteorder.h" #include "systype.h" #ifdef __sun__ typedef char int_8_t; typedef unsigned char u_int8_t; typedef short int_16_t; typedef unsigned short u_int16_t; typedef int int_32_t; typedef unsigned int u_int32_t; #endif /* types */ #ifndef __u8 #define __u8 u_int8_t #endif /* __u8 */ #ifndef __u16 #define __u16 u_int16_t #endif /* __u16 */ #ifndef __u32 #define __u32 u_int32_t #endif /* __u32 */ #ifndef __uint8_t #define __uint8_t u_int8_t #endif /* __uint8_t */ #ifndef __uint16_t #define __uint16_t u_int16_t #endif /* __uint16_t */ #ifndef __uint32_t #define __uint32_t u_int32_t #endif /* __uint32_t */ #include "hcmp.h" /* Hping Control Message Protocol */ /* protocols header size */ #ifndef ICMPHDR_SIZE #define ICMPHDR_SIZE sizeof(struct myicmphdr) #endif #ifndef UDPHDR_SIZE #define UDPHDR_SIZE sizeof(struct myudphdr) #endif #ifndef TCPHDR_SIZE #define TCPHDR_SIZE sizeof(struct mytcphdr) #endif #ifndef IPHDR_SIZE #define IPHDR_SIZE sizeof(struct myiphdr) #endif #ifndef IP6HDR_SIZE #define IP6HDR_SIZE sizeof(struct myip6hdr) #endif /* wait X seconds after reached to sent packets in oreder to display replies */ #define COUNTREACHED_TIMEOUT 1 /* requests status table stuffs */ /* Warning, TABLESIZE 0 == floating point exception */ #define TABLESIZE 400 #define S_SENT 0 #define S_RECV 1 /* usefull defines */ #ifndef TRUE #define TRUE 1 #define FALSE 0 #endif #ifndef IFNAMSIZ #define IFNAMSIZ 16 #endif #ifndef PF_PACKET #define PF_PACKET 17 /* kernel 2.[12].* with 2.0.* kernel headers? */ #endif #ifndef ETH_P_IP #define ETH_P_IP 0x0800 /* Internet Protocol packet */ #endif #ifndef ABS #define ABS(x) (((x)>0) ? (x) : -(x)) #endif /* header size of some physical layer type */ #define PPPHDR_SIZE_LINUX 0 #define PPPHDR_SIZE_FREEBSD 4 #define PPPHDR_SIZE_OPENBSD 4 #define PPPHDR_SIZE_NETBSD 4 #define PPPHDR_SIZE_BSDI 4 #define ETHHDR_SIZE 14 #define LOHDR_SIZE 14 #define WLANHDR_SIZE 14 #define TRHDR_SIZE 20 /* packet size (physical header size + ip header + tcp header + 0 data bytes) */ #ifndef IP_MAX_SIZE #define IP_MAX_SIZE 65535 #endif /* absolute offsets */ #define ABS_OFFSETIP linkhdr_size #define ABS_OFFSETTCP ( linkhdr_size + IPHDR_SIZE ) #define ABS_OFFSETICMP ( linkhdr_size + IPHDR_SIZE ) #define ABS_OFFSETUDP ( linkhdr_size + IPHDR_SIZE ) /* defaults and misc */ #define DEFAULT_SENDINGWAIT 1 /* wait 1 sec. between sending each packets */ #define DEFAULT_DPORT 0 /* default dest. port */ #define DEFAULT_INITSPORT -1 /* default initial source port: -1 means random */ #define DEFAULT_COUNT -1 /* default packets count: -1 means forever */ #define DEFAULT_TTL 64 /* default ip->ttl value */ #define DEFAULT_SRCWINSIZE 512 /* default tcp windows size */ #define DEFAULT_VIRTUAL_MTU 16 /* tiny fragments */ #define DEFAULT_ICMP_TYPE 8 /* echo request */ #define DEFAULT_ICMP_CODE 0 /* icmp-type relative */ #define DEFAULT_ICMP_IP_VERSION 4 #define DEFAULT_ICMP_IP_IHL (IPHDR_SIZE >> 2) #define DEFAULT_ICMP_IP_TOS 0 #define DEFAULT_ICMP_IP_TOT_LEN 0 /* computed by send_icmp_*() */ #define DEFAULT_ICMP_IP_ID 0 /* rand */ #define DEFAULT_ICMP_CKSUM -1 /* -1 means compute the cksum */ #define DEFAULT_ICMP_IP_PROTOCOL 6 /* TCP */ #define DEFAULT_RAW_IP_PROTOCOL 6 /* TCP */ #define DEFAULT_TRACEROUTE_TTL 1 #define BIND_NONE 0 /* no bind */ #define BIND_DPORT 1 /* bind destination port */ #define BIND_TTL 2 /* bind ip->ttl */ #define DEFAULT_BIND BIND_DPORT /* fragmentation defines */ #define MF ((unsigned short)0x2000) /* more fragments */ #define DF ((unsigned short)0x4000) /* dont fragment */ #define NF ((unsigned short)0x0000) /* no more fragments */ /* ip options defines */ #define IPOPT_COPY 0x80 #define IPOPT_CLASS_MASK 0x60 #define IPOPT_NUMBER_MASK 0x1f #define IPOPT_COPIED(o) ((o)&IPOPT_COPY) #define IPOPT_CLASS(o) ((o)&IPOPT_CLASS_MASK) #define IPOPT_NUMBER(o) ((o)&IPOPT_NUMBER_MASK) #define IPOPT_CONTROL 0x00 #define IPOPT_RESERVED1 0x20 #define IPOPT_MEASUREMENT 0x40 #define IPOPT_RESERVED2 0x60 #define IPOPT_END (0 |IPOPT_CONTROL) #define IPOPT_NOOP (1 |IPOPT_CONTROL) #define IPOPT_SEC (2 |IPOPT_CONTROL|IPOPT_COPY) #define IPOPT_LSRR (3 |IPOPT_CONTROL|IPOPT_COPY) #define IPOPT_TIMESTAMP (4 |IPOPT_MEASUREMENT) #define IPOPT_RR (7 |IPOPT_CONTROL) #define IPOPT_SID (8 |IPOPT_CONTROL|IPOPT_COPY) #define IPOPT_SSRR (9 |IPOPT_CONTROL|IPOPT_COPY) #define IPOPT_RA (20|IPOPT_CONTROL|IPOPT_COPY) #define IPOPT_OPTVAL 0 #define IPOPT_OLEN 1 #define IPOPT_OFFSET 2 #define IPOPT_MINOFF 4 #define MAX_IPOPTLEN 40 #define IPOPT_NOP IPOPT_NOOP #define IPOPT_EOL IPOPT_END #define IPOPT_TS IPOPT_TIMESTAMP #define IPOPT_TS_TSONLY 0 /* timestamps only */ #define IPOPT_TS_TSANDADDR 1 /* timestamps and addresses */ #define IPOPT_TS_PRESPEC 3 /* specified modules only */ /* tcp flags */ #ifndef TH_FIN #define TH_FIN 0x01 #endif #ifndef TH_SYN #define TH_SYN 0x02 #endif #ifndef TH_RST #define TH_RST 0x04 #endif #ifndef TH_PUSH #define TH_PUSH 0x08 #endif #ifndef TH_ACK #define TH_ACK 0x10 #endif #ifndef TH_URG #define TH_URG 0x20 #endif #ifndef TH_X #define TH_X 0x40 /* X tcp flag */ #endif #ifndef TH_Y #define TH_Y 0x80 /* Y tcp flag */ #endif /* ICMP TYPE */ #define ICMP_ECHOREPLY 0 /* Echo Reply */ #define ICMP_DEST_UNREACH 3 /* Destination Unreachable */ #define ICMP_SOURCE_QUENCH 4 /* Source Quench */ #define ICMP_REDIRECT 5 /* Redirect (change route) */ #define ICMP_ECHO 8 /* Echo Request */ #define ICMP_TIME_EXCEEDED 11 /* Time Exceeded */ #define ICMP_PARAMETERPROB 12 /* Parameter Problem */ #define ICMP_TIMESTAMP 13 /* Timestamp Request */ #define ICMP_TIMESTAMPREPLY 14 /* Timestamp Reply */ #define ICMP_INFO_REQUEST 15 /* Information Request */ #define ICMP_INFO_REPLY 16 /* Information Reply */ #define ICMP_ADDRESS 17 /* Address Mask Request */ #define ICMP_ADDRESSREPLY 18 /* Address Mask Reply */ #define ICMP6_DEST_UNREACH 1 #define ICMP6_PACK_TOOBIG 2 #define ICMP6_TIME_EXCEEDED 3 #define ICMP6_PARAMETERPROB 4 #define ICMP6_ECHO 128 #define ICMP6_ECHOREPLY 129 /* Codes for UNREACHABLE */ #define ICMP_NET_UNREACH 0 /* Network Unreachable */ #define ICMP_HOST_UNREACH 1 /* Host Unreachable */ #define ICMP_PROT_UNREACH 2 /* Protocol Unreachable */ #define ICMP_PORT_UNREACH 3 /* Port Unreachable */ #define ICMP_FRAG_NEEDED 4 /* Fragmentation Needed/DF set */ #define ICMP_SR_FAILED 5 /* Source Route failed */ #define ICMP_NET_UNKNOWN 6 #define ICMP_HOST_UNKNOWN 7 #define ICMP_HOST_ISOLATED 8 #define ICMP_NET_ANO 9 #define ICMP_HOST_ANO 10 #define ICMP_NET_UNR_TOS 11 #define ICMP_HOST_UNR_TOS 12 #define ICMP_PKT_FILTERED 13 /* Packet filtered */ #define ICMP_PREC_VIOLATION 14 /* Precedence violation */ #define ICMP_PREC_CUTOFF 15 /* Precedence cut off */ #define NR_ICMP_UNREACH 15 /* instead of hardcoding immediate value */ /* Codes for REDIRECT */ #define ICMP_REDIR_NET 0 /* Redirect Net */ #define ICMP_REDIR_HOST 1 /* Redirect Host */ #define ICMP_REDIR_NETTOS 2 /* Redirect Net for TOS */ #define ICMP_REDIR_HOSTTOS 3 /* Redirect Host for TOS */ /* Codes for TIME_EXCEEDED */ #define ICMP_EXC_TTL 0 /* TTL count exceeded */ #define ICMP_EXC_FRAGTIME 1 /* Fragment Reass time exceeded */ /* * IP header */ struct myiphdr { #if defined(__LITTLE_ENDIAN_BITFIELD) __u8 ihl:4, version:4; #elif defined (__BIG_ENDIAN_BITFIELD) __u8 version:4, ihl:4; #else #error "Please, edit Makefile and add -D__(LITTLE|BIG)_ENDIAN_BITFIEND" #endif __u8 tos; __u16 tot_len; __u16 id; __u16 frag_off; __u8 ttl; __u8 protocol; __u16 check; __u32 saddr; __u32 daddr; }; struct myip6hdr { #if defined(__LITTLE_ENDIAN_BITFIELD) __u8 tc1:4, version:4; __u8 flowlabel1:4, tc2:4; __u16 flowlabel2; #elif defined (__BIG_ENDIAN_BITFIELD) /* __u32 version:4, tc:8 flowlabel:20;*/ __u8 version:4, tc1:4; __u8 tc2:4, flowlabel1:4; __u16 flowlabel2; #else #error "Please, edit Makefile and add -D__(LITTLE|BIG)_ENDIAN_BITFIEND" #endif __u16 paylen; __u8 nextheader; __u8 hoplimit; __u8 saddr[16]; __u8 daddr[16]; }; /* * UDP header */ struct myudphdr { __u16 uh_sport; /* source port */ __u16 uh_dport; /* destination port */ __u16 uh_ulen; /* udp length */ __u16 uh_sum; /* udp checksum */ }; /* * TCP header. * Per RFC 793, September, 1981. */ struct mytcphdr { __u16 th_sport; /* source port */ __u16 th_dport; /* destination port */ __u32 th_seq; /* sequence number */ __u32 th_ack; /* acknowledgement number */ #if defined (__LITTLE_ENDIAN_BITFIELD) __u8 th_x2:4, /* (unused) */ th_off:4; /* data offset */ #elif defined (__BIG_ENDIAN_BITFIELD) __u8 th_off:4, /* data offset */ th_x2:4; /* (unused) */ #else #error "Please, edit Makefile and add -D__(LITTLE|BIG)_ENDIAN_BITFIEND" #endif __u8 th_flags; __u16 th_win; /* window */ __u16 th_sum; /* checksum */ __u16 th_urp; /* urgent pointer */ }; /* * ICMP header */ struct myicmphdr { __u8 type; __u8 code; __u16 checksum; union { struct { __u16 id; __u16 sequence; } echo; __u32 gateway; __u32 mtu; } un; }; struct icmp_tstamp_data { __u32 orig; __u32 recv; __u32 tran; }; /* * UDP/TCP pseudo header * for cksum computing */ struct pseudohdr { __u32 saddr; __u32 daddr; __u8 zero; __u8 protocol; __u16 lenght; }; struct pseudohdr6 { __u8 saddr[16]; __u8 daddr[16]; __u16 lenght; __u16 zero1; __u8 zero2; __u8 protocol; }; #define PSEUDOHDR_SIZE sizeof(struct pseudohdr) #define PSEUDOHDR6_SIZE sizeof(struct pseudohdr6) /* * hping replies delay table */ struct delaytable_element { int seq; int src; time_t sec; time_t usec; int status; }; volatile struct delaytable_element delaytable[TABLESIZE]; /* protos */ void nop(void); /* nop */ int parse_options(int, char**); /* option parser */ int get_if_name(void); /* get interface (see source) */ int get_linkhdr_size(char*); /* get link layer hdr size */ int open_sockpacket(void); /* open SOCK_PACKET socket */ int close_sockpacket(int); /* close SOCK_PACKET socket */ int open_sockraw(void); /* open raw socket */ void send_packet (int signal_id); void send_rawip (void); void send_tcp(void); void send_udp(void); void send_icmp(void); void send_hcmp(__u8 type, __u32 arg); /* send hcmp packets */ void send_ip (char*, char*, char*, unsigned int, int, unsigned short, char*, char); void send_ip_handler(char *packet, unsigned int size); /* fragmentation handler */ void wait_packet(void); /* handle incoming packets */ void print_statistics(int); void show_usage(void); void show_version(void); void resolve(struct sockaddr*, char*); /* resolver */ void log_icmp_unreach(const char*, unsigned short);/* ICMP unreachable logger */ void log_icmp_timeexc(const char*, unsigned short);/* ICMP time exceeded logger */ time_t get_usec(void); /* return current usec */ time_t get_midnight_ut_ms(void); /* ms from UT midnight */ __u16 cksum(__u16 *buf, int nwords); /* compute 16bit checksum */ void inc_destparm(int sid); /* inc dst port or ttl */ char *get_hostname(const char*); /* get host from addr */ void datafiller(char *p, int size); /* fill data from file */ void data_handler(char *data, int data_size);/* handle data filling */ void socket_broadcast(int sd); /* set SO_BROADCAST option */ void socket_iphdrincl(int sd); /* set SO_IPHDRINCL option */ void listenmain(void); /* main for listen mode */ char *memstr(char *haystack, char *needle, int size); /* memstr */ void tos_help(void); /* show the TOS help */ int rtt(int *seqp, int recvport, float *ms_delay); /* compute round trip time */ int relativize_id(int seqnum, int *ip_id); /* compute relative id */ int if_promisc_on(int s); /* promisc. mode ON */ int if_promisc_off(int s); /* promisc. mode OFF */ int open_pcap(void); /* open libpcap socket */ int close_pcap(void); /* close libpcap socket */ int pcap_recv(char *, unsigned int); /* libpcap api wrapper */ int memlock(char *addr, size_t size); /* disable paging */ int memunlock(char *addr, size_t size); /* enable paging */ int memlockall(void); /* disable paging (all pages) */ int memunlockall(void); /* enable paging (all pages) */ unsigned char ip_opt_build(char *ip_opt); /* build ip options */ void display_ipopt(char* buf); /* display ip options */ void icmp_help(void); /* show the ICMP help */ void route_help(void); /* show the route help */ void (*Signal(int signo, void (*func)(int)))(int); void delaytable_add(int seq, int src, time_t sec, time_t usec, int status); int read_packet(void *packet, int size); void scanmain(void); u_int32_t hp_rand(void); struct in6_addr ipv6_rand(char *net,int prefixlen); #if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__NetBSD__) && \ !defined(__bsdi__) && !defined(__APPLE__) size_t strlcpy(char *dst, const char *src, size_t siz); #endif /* ARS glue */ void hping_ars_send(char *s); struct SOCKADDR { __u8 data[50]; }; #define ADDR(x) ({ \ void *tmp; \ if(opt_ipv6) \ tmp=&((struct sockaddr_in6*)(x))->sin6_addr; \ else \ tmp=&((struct sockaddr_in*)(x))->sin_addr; \ tmp; \ }) #define ADDR4(x) (((struct sockaddr_in*)(x))->sin_addr) #define ADDR6(x) (((struct sockaddr_in6*)(x))->sin6_addr) #define ADDRCMP(x,y) (memcmp(ADDR(x),ADDR(y),opt_ipv6?16:4)) #endif /* _HPING2_H */