#define USI_VERSION 163 #ifndef _USIPP_H #define _USIPP_H 1 #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include "pcap/pcap.h" #include "usi-structs.h" #define ICMP_PORT 0 #ifdef USI_FREEBSD #define PPP_LEN 24 #else #define PPP_LEN 4 #endif #define SLIP_LEN 24 #define MAXHOSTLEN 1000 class Datalink { private: int datalink, framelen; pcap_t *pd; bpf_u_int32 localnet, netmask; struct bpf_program filter; struct pcap_pkthdr phdr; bool initialized; protected: char host[MAXHOSTLEN]; struct usipp::ether_header ether; char filter_string[1000]; public: Datalink(); Datalink(char *); virtual ~Datalink(); char *get_hwsrc(char *, int); char *get_hwdst(char *, int); int get_etype(); int get_datalink(); int get_framelen(); const char *set_host(const char *); virtual int init_device(char *, int, int); virtual int setfilter(char *); virtual int sniffpack(char *, int); }; class ARP : public Datalink { private: struct usipp::ether_arp arphdr; public: ARP(char *, int); // device, promisc virtual ~ARP(); char *get_sha(char *, int); // get source hardware-address char *get_tha(char *, int); // get target char *get_spa(int, char *, int);// get source protocol-adress char *get_tpa(int, char *, int);// get target protcol-address int get_op(); // get ARP-command virtual int sniffpack(); }; class IP : public Datalink { private: struct usipp::iphdr iph; char ipOptions[40]; struct sockaddr_in saddr; int rawfd; bool socketOpen; char *reassemble(char *, int, int *); public: IP(const char*, u_int8_t); // IP("foo.foo"); IP(u_int32_t, u_int8_t); virtual ~IP(); u_int8_t get_hlen(); u_int8_t get_vers(); u_int8_t get_tos(); u_int16_t get_totlen(); u_int16_t get_id(); u_int16_t get_fragoff(); u_int16_t get_fflags(); u_int8_t get_ttl(); u_int8_t get_proto(); u_int16_t get_sum(); u_int32_t get_src(); u_int32_t get_dst(); char *get_src(int, char *, int); char *get_dst(int, char *, int); int set_hlen(u_int8_t); int set_vers(u_int8_t); int set_tos(u_int8_t); int set_totlen(u_int16_t); int set_id(u_int16_t); int set_fragoff(u_int16_t); int set_fflags(u_int16_t); int set_ttl(u_int8_t); int set_proto(u_int8_t); int set_sum(u_int16_t); // should NOT be used; just to be complete... int set_src(u_int32_t); int set_dst(u_int32_t); int set_src(const char*); int set_dst(const char*); virtual int sendpack(void*, int); virtual int sendpack(char*); virtual int recvpack(void*, int); virtual int sniffpack(void*, int); virtual int init_device(char*, int, int); friend unsigned short in_cksum(unsigned short*, int); }; class ICMP : public IP { private: struct usipp::icmphdr icmphdr; public: ICMP(const char*); virtual int sendpack(void*, int); virtual int sendpack(char*); virtual int recvpack(void*, int); virtual int sniffpack(void*, int); virtual int init_device(char*, int, int); int set_type(u_int8_t); int set_code(u_int8_t); int set_icmpId(u_int16_t); int set_seq(u_int16_t); int set_gateway(u_int32_t); int set_mtu(u_int16_t); u_int8_t get_type(); u_int8_t get_code(); u_int16_t get_icmpId(); u_int16_t get_seq(); u_int32_t get_gateway(); u_int16_t get_mtu(); }; class UDP : public IP { private: struct usipp::udphdr udph; struct usipp::pseudohdr pseudo; public: UDP(const char*); u_int16_t get_srcport(); u_int16_t get_dstport(); u_int16_t get_len(); u_int16_t get_udpsum(); int set_srcport(u_int16_t); int set_dstport(u_int16_t); int set_len(u_int16_t); int set_udpsum(u_int16_t); virtual int sendpack(void*, int); virtual int sendpack(char*); virtual int recvpack(void*, int); virtual int sniffpack(void*, int); virtual int init_device(char*, int, int); }; class TCP : public IP { private: struct usipp::tcphdr tcph; char tcpOptions[40]; struct usipp::pseudohdr pseudo; public: TCP(const char*); u_int16_t get_srcport(); u_int16_t get_dstport(); u_int32_t get_seq(); u_int32_t get_ack(); u_int8_t get_off(); u_int8_t get_flags(); u_int16_t get_win(); u_int16_t get_tcpsum(); u_int16_t get_urg(); int set_srcport(u_int16_t); int set_dstport(u_int16_t); int set_seq(u_int32_t); int set_ack(u_int32_t); int set_off(u_int8_t); int set_flags(u_int8_t); int set_win(u_int16_t); int set_tcpsum(u_int16_t); int set_urg(u_int16_t); virtual int recvpack(void*, int); virtual int sniffpack(void*, int); virtual int sendpack(void*, int); virtual int sendpack(char*); virtual int init_device(char*, int, int); }; class usifault { public: usifault() {} ~usifault() {} }; typedef enum { PERROR = 0, HERROR, PCAP, STDERR } errorFuncs; extern bool exceptions; extern int useException(bool); extern void die(const char *, errorFuncs, int); extern char *getMAC(const char *, char *, int); extern char *setMAC(const char *, char *); #endif // _USIPP_H