www.pudn.com > 网络入侵检测系统(源码).rar > snort.h


/* 
** Copyright (C) 1998,1999,2000,2001 Martin Roesch  
** 
** This program is free software; you can redistribute it and/or modify 
** it under the terms of the GNU General Public License as published by 
** the Free Software Foundation; either version 2 of the License, or 
** (at your option) any later version. 
** 
** This program is distributed in the hope that it will be useful, 
** but WITHOUT ANY WARRANTY; without even the implied warranty of 
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
** GNU General Public License for more details. 
** 
** You should have received a copy of the GNU General Public License 
** along with this program; if not, write to the Free Software 
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 
*/ 
 
/* $Id: snort.h,v 1.19 2001/01/04 11:33:41 fygrave Exp $ */ 
 
#ifndef __SNORT_H__ 
#define __SNORT_H__ 
 
#ifdef HAVE_CONFIG_H 
    #include "config.h" 
#endif 
 
/*  I N C L U D E S  **********************************************************/ 
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#ifndef WIN32 
	#include  
	#include  
	#include  
	#include  
	#include  
	#include  
	#include  
	#include  
	#include  
#endif 
#include  
#include  
#include  
#include  
#include  
#include  
#include  
#ifdef HAVE_SYS_SOCKIO_H 
    #include  
#endif 
#include  
#include  
#include  
#include  
#include  
/*#include */ 
#ifndef WIN32 
	#include  
	#include  
	#include  
	#include  
#else 
	#include "syslog.h" 
#endif 
 
#ifdef HAVE_PATHS_H 
    #include  
#endif 
 
#ifdef USE_PTHREADS 
    #include  
#endif 
 
/* This is basically everything needed to make snort work under WIN32. -- Mike Davis */ 
#ifdef WIN32 
	#include  
	#include  
	#include  
	#include  
	#include  
	#include  
	#include  
	typedef unsigned char  u_int8_t; 
	typedef unsigned short u_int16_t; 
	typedef unsigned int   u_int32_t; 
	typedef int	pid_t; 
 
	#undef TCP_NODELAY 
	#undef interface 
	#define SIGKILL         9       /* kill (cannot be caught or ignored) */ 
	#define SIGQUIT         3       /* quit */ 
	#define SIGHUP          1       /* hangup */ 
	#define SIGUSR1 30      /* user defined signal 1 */ 
	#define SIGPIPE 13      /* write on a pipe with no one to read it */ 
	#define EEXIST          17              /* File exists */ 
	#define W_OK            0x02    /* test for write permission */ 
	#define S_ISDIR(x)      (((x) & 0170000) == 0040000)    /* directory */ 
	#define S_IRWXU         0000700                 /* RWX mask for owner */ 
	#define S_IRWXG         0000070                 /* RWX mask for group */ 
	#define S_IROTH         0000004                 /* R for other */ 
	#define S_IXOTH         0000001                 /* X for other */ 
	#define strncasecmp strnicmp 
	#define strcasecmp stricmp 
	#define snprintf _snprintf 
	#define vsnprintf _vsnprintf 
	#define bzero(x, y) memset((x), 0, (y)) 
	#define execv _execv 
	#define getpid _getpid 
	#define index strchr 
	#define bcopy(x, y, z) memcpy((void *)x, (const void *)y, (size_t) z) 
	#define mkdir(x, y) _mkdir(x) 
	#define IXDR_GET_LONG(buf)                ((long)ntohl((u_long)*(buf)++)) 
	#define IXDR_GET_ENUM(buf, t)             ((t)IXDR_GET_LONG(buf)) 
	#define RPC_MSG_VERSION         ((u_long) 2) 
 
	/* 
	 * Definitions for UNIX IPC domain. 
	 */ 
	struct  sockaddr_un { 
			u_char  sun_len;                /* sockaddr len including null */ 
			u_char  sun_family;             /* AF_UNIX */ 
			char    sun_path[104];          /* path name (gag) */ 
	}; 
 
	struct timezone { 
			int     tz_minuteswest; /* minutes west of Greenwich */ 
			int     tz_dsttime;     /* type of dst correction */ 
	}; 
 
	/* 
	 * Interface request structure used for socket 
	 * ioctl's.  All interface ioctl's must have parameter 
	 * definitions which begin with ifr_name.  The 
	 * remainder may be interface specific. 
	 */ 
	struct  ifreq { 
			char    ifr_name[128];             /* if name, e.g. "en0" */ 
			union { 
					struct  sockaddr ifru_addr; 
					struct  sockaddr ifru_dstaddr; 
					struct  sockaddr ifru_broadaddr; 
					short   ifru_flags; 
					int     ifru_metric; 
					caddr_t ifru_data; 
			} ifr_ifru; 
	#define ifr_addr        ifr_ifru.ifru_addr      /* address */ 
	#define ifr_dstaddr     ifr_ifru.ifru_dstaddr   /* other end of p-to-p link */ 
	#define ifr_broadaddr   ifr_ifru.ifru_broadaddr /* broadcast address */ 
	#define ifr_flags       ifr_ifru.ifru_flags     /* flags */ 
	#define ifr_metric      ifr_ifru.ifru_metric    /* metric */ 
	#define ifr_mtu         ifr_ifru.ifru_metric    /* mtu (overload) */ 
	#define ifr_media       ifr_ifru.ifru_metric    /* media options (overload) */ 
	#define ifr_data        ifr_ifru.ifru_data      /* for use by interface */ 
	}; 
 
	int gettimeofday(struct timeval *,struct timezone *); 
	void *GetAdapterFromList(void *, int); 
	char *print_interface(char *); 
	void PrintDeviceList(const char *); 
	int init_winsock(void); 
	int geteuid(void); 
#endif 
 
#include "decode.h" 
#include "plugbase.h" 
#include "rules.h" 
#include "log.h" 
#include "mstring.h" 
#include "parser.h" 
#include "checksum.h" 
 
#ifndef HAVE_SNPRINTF 
    #include "snprintf.h" 
#endif 
 
#ifdef HAVE_CONFIG_H  
/* otherwise it will cause errors */ 
    #include "prototypes.h" 
#endif 
 
 
/*  D E F I N E S  ************************************************************/ 
#define STD_BUF  1024 
 
#define RF_ANY_SIP    0x01 
#define RF_ANY_DIP    0x02 
#define RF_ANY_SP     0x04 
#define RF_ANY_DP     0x10 
#define RF_ANY_FLAGS  0x20 
 
/* 
 * you may need to ajust this on the systems which don't have standard 
 * paths defined 
 */ 
#ifndef _PATH_VARRUN 
char _PATH_VARRUN[STD_BUF]; 
#endif 
 
#ifdef WIN32 
	#define DEFAULT_LOG_DIR   "log" 
	#define DEFAULT_DAEMON_ALERT_FILE  "log/alert.ids" 
	#define UNSOCK_FILE       "snort_alert" 
#else 
	#define DEFAULT_LOG_DIR   "/var/log/snort" 
	#define DEFAULT_DAEMON_ALERT_FILE  "alert" 
	#define UNSOCK_FILE       "/dev/snort_alert" 
#endif 
 
/* you can redefine the user ID which is allowed to 
 * initialize interfaces using pcap and read from them 
 */ 
#ifndef SNIFFUSER 
    #define SNIFFUSER 0 
#endif 
 
#define MAX_INTERFACES	10 
 
#define ALERT_FULL     0x01 
#define ALERT_FAST     0x02 
#define ALERT_NONE     0x03 
#define ALERT_UNSOCK   0x04 
 
/*  D A T A  S T R U C T U R E S  *********************************************/ 
/* struct to contain the program variables and command line args */ 
typedef struct _progvars 
{ 
    int alert_interface_flag; 
    int verbose_bytedump_flag; 
    int obfuscation_flag; 
    int log_cmd_override; 
    int alert_cmd_override; 
    int char_data_flag; 
    int data_flag; 
    int verbose_flag; 
    int showarp_flag; 
    int showipv6_flag; 
    int showipx_flag; 
    int readmode_flag; 
    int logbin_flag; 
    int log_flag; 
    int nolog_flag; 
    int show2hdr_flag; 
    int syslog_flag; 
#ifdef WIN32 
	int syslog_remote_flag; 
	char syslog_server[STD_BUF]; 
	int syslog_server_port; 
#endif 
    int promisc_flag; 
    int rules_order_flag; 
    int smbmsg_flag; 
    int track_flag; 
    int daemon_flag; 
    int quiet_flag; 
    int pkt_cnt; 
    int pkt_snaplen; 
    u_long homenet; 
    u_long netmask; 
    int use_rules; 
    int alert_mode; 
    int log_plugin_active; 
    int alert_plugin_active; 
    char pid_filename[STD_BUF]; 
    char config_file[STD_BUF]; 
    char log_dir[STD_BUF]; 
    char readfile[STD_BUF]; 
    char smbmsg_dir[STD_BUF]; 
    char pid_path[STD_BUF]; 
    char *interfaces[MAX_INTERFACES];  
    int   mtus[MAX_INTERFACES]; 
#define interface interfaces[0] /* backwards compatibility */ 
    char *pcap_cmd; 
    char *alert_filename; 
    char *binLogFile; 
    int use_utc; 
} PV; 
 
/* struct to collect packet statistics */ 
typedef struct _PacketCount 
{ 
    u_long other; 
    u_long tcp; 
    u_long udp; 
    u_long icmp; 
    u_long arp; 
    u_long ipv6; 
    u_long ipx; 
    u_long discards; 
    u_long alert_pkts; 
    u_long log_pkts; 
    u_long pass_pkts; 
 
    u_long frags;           /* number of frags that have come in */ 
    u_long rebuilt_frags;   /* number of packets rebuilt */ 
    u_long frag_incomp;     /* number of frags cleared due to memory issues */ 
    u_long frag_timeout;    /* number of frags cleared due to timeout */ 
    u_long rebuild_element; /* frags that were element of rebuilt pkt */ 
 
    u_long tcp_stream_pkts; /* number of packets tcp reassembly touches */ 
    u_long rebuilt_tcp;     /* number of phoney tcp packets generated */ 
    u_long tcp_streams;     /* number of tcp streams created */ 
} PacketCount; 
 
/*  G L O B A L S  ************************************************************/ 
PV pv;                 /* program vars (command line args) */ 
int datalinks[MAX_INTERFACES];          /* the datalink value */ 
#define datalink datalinks[0] 
int ifr_count;         /* number of interfaces to monitor */ 
char *progname;        /* name of the program (from argv[0]) */ 
char **progargs; 
char *username; 
char *groupname; 
char *chrootdir; 
unsigned long userid; 
unsigned long groupid; 
struct passwd *pw; 
struct group *gr; 
char *pcap_cmd;        /* the BPF command string */ 
char *pktidx;          /* index ptr for the current packet */ 
pcap_t *pds[MAX_INTERFACES]; /* array of packet descriptors per interface */ 
 
#define pd pds[0] 
 
/* backwards compatibility */ 
pcap_dumper_t *dumpd;  /* the pcap dumper descriptor */ 
FILE *log_ptr;         /* log file ptr */ 
FILE *alert;           /* alert file ptr */ 
FILE *binlog_ptr;      /* binary log file ptr */ 
int flow;              /* flow var (probably obsolete) */ 
int thiszone;          /* time zone info */ 
PacketCount pc;        /* packet count information */ 
u_long netmasks[33];   /* precalculated netmask array */ 
struct pcap_pkthdr *g_pkthdr; /* packet header ptr */ 
u_char *g_pkt;         /* ptr to the packet data */ 
u_long g_caplen;       /* length of the current packet */ 
char *protocol_names[256]; 
u_int snaplen; 
int alertsd;           /* socket descriptor for unix-socket logging */ 
struct sockaddr_un alertaddr; /* where we send all alert packets */ 
 
 
#ifdef USE_PTHREADS 
pthread_mutex_t pt_lock; 
pthread_t pt[MAX_INTERFACES]; 
#endif 
 
typedef void (*grinder_t)(Packet *, struct pcap_pkthdr *, u_char *);  /* ptr to the packet processor */ 
 
grinder_t grinders[MAX_INTERFACES]; 
#define grinder grinders[0] 
 
/*  P R O T O T Y P E S  ******************************************************/ 
int ParseCmdLine(int, char**); 
void InitializeInterfaces(void); 
void *InterfaceThread(void *); 
int OpenPcap(char *, int); 
int GetIfrMTU(char *); 
void DefineIfaceVar(char *,u_char *, u_char *); 
int DisplayBanner(); 
int SetPktProcessor(); 
void SetPktProcessors(); 
void GetTime(char *); 
int gmt2local(time_t); 
void ts_print(register const struct timeval *, char *); 
void CleanExit(int); 
void exit_or_exec(int, int); 
char *copy_argv(char **); 
int strip(char *); 
int ShowUsage(char *); 
float CalcPct(float, float); 
void ReadPacketsFromFile(); 
void GenHomenet(char *); 
void InitNetmasks(); 
void InitBinFrag(); 
void GoDaemon(); 
void SanityChecks(); 
char *read_infile(char *); 
void InitProtoNames(); 
void ProcessPacket(char *, struct pcap_pkthdr *, u_char *); 
void PrintError(char *); 
void ErrorMessage(const char *, ...); 
void LogMessage(const char *, ...); 
void FatalError(const char *, ...); 
void FatalPrintError(char *); 
void CreatePidFile(char *); 
void SetUidGid(void); 
void DropStats(int); 
 
#endif  /* __SNORT_H__ */