/****************************************************************************
   Program:     $Id: spoof.h,v 1.13 2006/11/21 21:11:07 rbeverly Exp $
   Author:      Rob Beverly <rbeverly@mit.edu>
   Date:        $Date: 2006/11/21 21:11:07 $
   Description: Spoofer header
****************************************************************************/

#ifdef _WIN32
 #define OS "WIN32"
 #define MISSING_HDRS
 #define MISSING_IP_HDR
 #define MISSING_IN_ADDR_T
#endif
#ifdef _LINUX
 #define OS "LINUX"
 #define MISSING_HDRS
#endif
#ifdef _BSD
  #ifdef __FreeBSD__
    #define OS "FBSD"
    #define _FBSD 1
  #else
    #define OS "BSD"
  #endif
#endif
#ifdef _SOLARIS
 #define OS "SOLARIS"
 #define _LINUX 1
#endif
#ifdef _OSX
 #define OS "OSX"
#endif

#ifndef OS
 #define OS "UNDEF"
#endif

#ifdef _WIN32
  #pragma pack(1)
  #include <winsock2.h>
  #include <ws2tcpip.h>
  #include "/usr/include/netinet/udp.h"
  #include <unistd.h>
#else
  #include <sys/types.h>
  #define  __FAVOR_BSD
  #include <unistd.h>
  #include <sys/socket.h>
  #include <netinet/in.h>
  #include <arpa/inet.h>
  #include <netinet/in_systm.h>
  #include <netinet/ip.h>
  #include <netinet/udp.h>
  #include <netdb.h>
#endif

#ifndef MISSING_HDRS
  #include <netinet/ip_var.h>
  #include <netinet/udp_var.h>
#endif

#include <stdio.h>
#include <stdlib.h>
#include <strings.h>
#include <string.h>
#include <time.h>
#include <errno.h>

#define VERSION 5
#define DEBUG 0

#define ICMP_DIVERT_PORT 2002 
#define UDP_DIVERT_PORT 2003 
#define BUFSIZE 1500
#define SMALLBUF 80
#define BIGBUF 9000
#define MAXLINE 4096
#define TTL_OUT 64
#define SRC_PORT 5353

#if VERSION == 5
  #define SERV_PORT 53
  #define REPORT_PORT 80
#else
  #define SERV_PORT 21
  #define REPORT_PORT 8080
#endif

#define ADDRS 3							/* space for default 3 addrs */
#define SCANSPACE 24					/* adjacent scan width */
#define DUPLICATES 5					/* dups for each probe */
#define PAUSE 2 						/* seconds */
#define NONCE "123456789abcde"			/* nonce */

#define LISTENQ 1024

#define SERVER "18.26.0.235"
#define VALIDDST "18.26.1.3" 			/* different dest IP congruent with */
										/* path to server */
#define REPORT_HOST "spoofer.csail.mit.edu"

#define SENDTO_ERROR -2
#define WINRAWSOCK_ERROR -3
#ifndef SOCKET_ERROR
 #define SOCKET_ERROR -4
#endif

#ifdef MISSING_IP_HDR
  #ifndef LITTLE_ENDIAN
    #define LITTLE_ENDIAN   1234
    #define BIG_ENDIAN      4321
  #endif
  #ifndef BYTE_ORDER
    #define BYTE_ORDER      LITTLE_ENDIAN
  #endif
/*
 * Structure of an internet header, naked of options.
 */
struct ip {
#ifdef _IP_VHL
        u_char  ip_vhl;                 /* version << 4 | header length >> 2 */
#else
#if BYTE_ORDER == LITTLE_ENDIAN
        u_int   ip_hl:4,                /* header length */
                ip_v:4;                 /* version */
#endif
#if BYTE_ORDER == BIG_ENDIAN
        u_int   ip_v:4,                 /* version */
                ip_hl:4;                /* header length */
#endif
#endif /* not _IP_VHL */
        u_char  ip_tos;                 /* type of service */
        u_short ip_len;                 /* total length */
        u_short ip_id;                  /* identification */
        u_short ip_off;                 /* fragment offset field */
#define IP_RF 0x8000                    /* reserved fragment flag */
#define IP_DF 0x4000                    /* dont fragment flag */
#define IP_MF 0x2000                    /* more fragments flag */
#define IP_OFFMASK 0x1fff               /* mask for fragmenting bits */
        u_char  ip_ttl;                 /* time to live */
        u_char  ip_p;                   /* protocol */
        u_short ip_sum;                 /* checksum */
        struct  in_addr ip_src,ip_dst;  /* source and dest address */
};
#endif /* MISSING_IP_HDR */


#ifdef MISSING_HDRS
/*
 * Overlay for ip header used by other protocols (tcp, udp).
 */
struct ipovly {
    u_char  ih_x1[9];       /* (unused) */
    u_char  ih_pr;          /* protocol */
    u_short ih_len;         /* protocol length */
    struct  in_addr ih_src;     /* source internet address */
    struct  in_addr ih_dst;     /* destination internet address */
};

/* 
 * UDP kernel structures and variables.
 */
struct  udpiphdr {
    struct  ipovly ui_i;        /* overlaid ip structure */
    struct  udphdr ui_u;        /* udp header */
};
#define ui_x1       ui_i.ih_x1
#define ui_pr       ui_i.ih_pr
#define ui_len      ui_i.ih_len
#define ui_src      ui_i.ih_src
#define ui_dst      ui_i.ih_dst
#define ui_sport    ui_u.uh_sport
#define ui_dport    ui_u.uh_dport
#define ui_ulen     ui_u.uh_ulen
#define ui_sum      ui_u.uh_sum

#endif /* MISSING_HDRS */

#ifdef MISSING_IN_ADDR_T
 typedef unsigned int in_addr_t;
#endif

#ifndef IPVERSION
 #define IPVERSION 4
#endif

#ifndef IP_DF
 #define IP_DF 0x4000
#endif

/* prevent windows error messages from closing DOS window */
#define winpause(x...) do { fprintf(stdout,x); \
                            fflush(stdout); \
                            while ( getchar() != '\n'); \
                          } while (0)
#define winfatal(x...) do { fprintf(stdout,x); \
							fprintf(stdout,"\nPress any key to continue.\n"); \
                            fflush(stdout); \
                            while ( getchar() != '\n'); \
							exit(-1); \
                          } while (0)

/* ugh, portable endianness detection is painful */
#if ((defined(BYTE_ORDER) && (BYTE_ORDER == LITTLE_ENDIAN)) | defined(_LITTLE_ENDIAN))
 #define SPOOFER_LITTLE_ENDIAN
#else
 #define SPOOFER_BIG_ENDIAN
#endif

/* prettyprint */
#define NIPQUAD(addr) \
  ((unsigned char *)&addr)[0], \
  ((unsigned char *)&addr)[1], \
  ((unsigned char *)&addr)[2], \
  ((unsigned char *)&addr)[3]

/* error messages */
#define WIN_SEND_ERR "** This Windows system blocks raw sockets; reverting to raw ethernet.\n"
#define WINFAIL 999

/* Payload format */
#define SEQNOSIZE 14
typedef struct spoof_rpt {
	unsigned short ver;
	unsigned short unused;
    unsigned long addr;
	unsigned char seqno[SEQNOSIZE];
} spoof_t;
#define PAYLOADSIZE sizeof(spoof_t)

typedef void Sigfunc(int);

/* precasts: net.c */
int craftPacket(char *, char *, int, struct sockaddr_in *, struct sockaddr_in *, u_char);
void craftReport(spoof_t *, unsigned short, unsigned long, char *);
unsigned short in_cksum(unsigned short *, int);
void dumpPacket(unsigned char *, int);
void genSequence(unsigned char *, int);
Sigfunc *signal(int signo, Sigfunc *func);
Sigfunc *Signal(int signo, Sigfunc *func);
void sig_chld(int signo);
ssize_t Readn(int fd, void *ptr, size_t nbytes);
void Writen(int fd, void *ptr, size_t nbytes);
ssize_t Readline(int fd, void *ptr, size_t maxlen);
int checkRFC1918(struct in_addr *in);
int newSocket(int, int);
int connectSock(int, struct sockaddr_in *, int);
int optSocketTTL(int, int);
int optSocketHDRINCL(int);
int socketSend(int, void *, int, struct sockaddr_in *, int);
int socketSendSpoof(int, void *, int, struct sockaddr_in *, int);

/* precasts: util.c */
unsigned long byte32Swap(unsigned long);
unsigned short byte16Swap(unsigned short);
void checkroot();
void win_init();
void banner();
void spoofSleep();
void fatal(char *, ...);
void pfatal(char *);

/* precasts: trace.c */
int findtr(char *traceroute);
int runtrace(char *tracecmd, char *dest, char *result);

/* precasts: dnetspoof.c */
int etherSend();
int registerEther();
int deregisterEther();
int findInterfaces();
void selectInterface();


syntax highlighted by Code2HTML, v. 0.9.1