www.pudn.com > PIPMasq.zip > PIPMasq.h


#include  
#include  
#include  
#include  
#include  
 
#include "packet32.h" 
 
#define PROGRAMNAME		"Pseud IP Masquerade on Win32" 
#define VERSION			"0.32"  
 
#define Max_Num_Adapter 10 
#define ETH_ALEN		6		/* Octets in one ethernet addr	 */ 
 
#define UDP				0x11 
#define TCP				0x06 
#define ICMP			0x01		 
 
#define	FTP				21 
#define FTP_DATA		20 
	 
#define EXPIRE_PERIOD	900		// Seconds (15 mins) 
#define ICMP_EXPIRE_PERIOD 20	// Seconds 
#define	MAX_ETH_SIZE	1514 
 
#define RECV_BUF		512000 
 
typedef unsigned int __u32; 
typedef unsigned short __u16; 
typedef unsigned char __u8; 
 
 
DWORD	ServiceThread(LPDWORD param); 
void	install(void); 
void	remove(void); 
 
 
///// ThreadMgr ////// 
 
class ThreadMgr 
{ 
public: 
	ThreadMgr(); 
	~ThreadMgr(); 
 
	void	signalCatch(int sig); 
 
	bool			m_lifeFlag; 
}; 
 
///// PsudeoIF ////// 
 
class PseudIF 
{ 
public: 
	PseudIF( 
		const char* wanIPAddr,  
		const char* pseudIPAddr, 
		const char*	subWanIPAddr, 
		unsigned const char* defaultGWMacAddr); 
 
	~PseudIF(); 
 
	bool releasePacket(void* packet, int dataLen); 
 
	__u32			m_wanIPAddr_u32; // Real IP Network byte 
	__u32			m_pseudIPAddr_u32;	// Pseud IP Network byte 
	__u32			m_subWanIPAddr_u32; // Subnet IP Network byte 
	__u32			m_netWanAddr_u32; // ( = m_wanIPAddr_u32 & m_subWanIPAddr_u32); 
 
	unsigned char	m_pseudMacAddr[ETH_ALEN]; 
	unsigned char	m_defaultGWMacAddr[ETH_ALEN]; 
 
 
private: 
	char			m_wanIPAddr[16]; 
	char			m_wanAdapterName[512]; 
	unsigned char	m_wanMacAddr[ETH_ALEN]; 
	char			m_message[1024]; 
 
	LPADAPTER		m_pseudLpAdapter; 
	LPPACKET		m_pseudLpPacket; 
	char			m_pseudBuffer[5000]; 
	HANDLE			m_pseudIFLock; 
}; 
 
///// CheckSumCalc /////// 
 
class CheckSumCalc 
{ 
protected: 
	CheckSumCalc(){}; 
	~CheckSumCalc(){}; 
 
	unsigned short in_cksum( 
		unsigned short *addr, int len); 
	 
	unsigned short tcpchecksum( 
		struct tcphdr *_tcphdr,  
		struct iphdr *_iphdr,  
		int tcpDataLenInPacket); 
 
	unsigned short udpchecksum( 
		struct udphdr *_udphdr,  
		struct iphdr *_iphdr,  
		int udpDataLenInPacket); 
}; 
 
 
///// ArpMgr ///// 
class ArpMgr 
{ 
public: 
	ArpMgr(PseudIF* pseudIF); 
	~ArpMgr(); 
 
	bool arpSendRecv(__u32 hostTypeIPAddr32, char* mac_ethAlen); 
 
	bool analizeArpPacket(char* pChar, int dataLen); 
	bool analizeArpPacket2(char* pChar, int dataLen); 
 
 
private: 
	PseudIF* m_pseudIF; 
 
	unsigned char	m_getMacAddr[ETH_ALEN]; 
	__u32			_ipAddr_u32_n; 
	__u32			_ipAddr_u32_h; 
	bool			m_waitFlag; 
	HANDLE			m_arpLock_out,m_arpLock_in; 
}; 
 
 
///// PingServer ///// 
class PingServer: public CheckSumCalc 
{ 
public: 
	PingServer(PseudIF* pseudIF); 
	~PingServer(); 
 
	bool analizePingPacket(char* pChar, int dataLen); 
 
private: 
	PseudIF* m_pseudIF; 
}; 
 
 
 
 
///// Port Mgr ////////// 
 
 
#define PORT_IGNORED	-1 
#define BEGIN_RSV_PORT	60000 
#define	RSV_PORT_ENTRY	5000 
 
class PortMgr 
{ 
public: 
	PortMgr(); 
	~PortMgr(); 
	 
	bool reservPort(__u8 Protocol, __u16 *port); 
	bool cancelPort(__u8 Protocol, __u16 port); 
 
private: 
	int pUDPSocketIndex; 
	int pTCPSocketIndex; 
	int pICMPIndex; 
 
	bool UDPSocketTable[RSV_PORT_ENTRY]; 
	bool TCPSocketTable[RSV_PORT_ENTRY]; 
	bool ICMPTable[RSV_PORT_ENTRY]; 
}; 
 
 
///// Table Mgr ////////// 
 
typedef enum refLevel 
{ 
	L0, 
	L1, 
	L2 
} RefLevel; 
 
 
typedef struct TableEntry 
{ 
	time_t			expireTime;				// Expire Time 
 
	__u8			Protocol;				// TCP or UDP 
 
	__u16			masqPort;				// Masqurate Port 
	 
	__u16			destPort;				// Destination Port 
	__u32			destIPAddr;				// Destination IP Address 
	unsigned char	destMACAddr[ETH_ALEN];	// Destination Mac Address 
			 
	__u16			srcPort;				// Source Port 
	__u32			srcIPAddr;				// Source IP Address 
	unsigned char	srcMACAddr[ETH_ALEN];	// Source Mac Address 
 
	int				diff_ack;				// Only for FTP 
 
	TableEntry *p_before; 
	TableEntry *p_after; 
 
} TableEntry; 
 
 
class TableMgr 
{ 
public: 
 
	TableMgr(PortMgr* portMgr); 
	~TableMgr(); 
 
	RefLevel refEntry( 
		__u8			Protocol,				// TCP or UDP 
		__u16			srcPort,				// Source Port 
		__u32			srcIPAddr,				// Source IP Address 
		__u16			destPort,				// Destination Port 
		__u32			destIPAddr,				// Destination IP Address 
		TableEntry*		*entry 
	); 
 
	bool	 
	TableMgr::refEntry2( 
			__u8			Protocol,				// TCP or UDP 
			__u16			masqPort,				// Masq Port 
			TableEntry*		*tableEntry				 
	); 
 
	bool addEntry(TableEntry *tableEntry); 
	bool delEntry(time_t time); 
	bool browseEntry(void); 
 
	TableEntry	*top_of_TableEntry ; 
	TableEntry	*end_of_TableEntry; 
	HANDLE		tableLock; 
 
private: 
	PortMgr* m_portMgr; 
 
	struct EntryPointer 
	{ 
	    TableEntry *_entry; 
	}; 
	 
	int countEntry(void); 
	void printOneEntry(TableEntry *entry); 
	bool sortEntry(EntryPointer* entries, int num); 
}; 
	 
 
///// Time Mgr ///// 
 
#define TABLE_CHECK_TIME	60 
#define TABLE_BROWSE_LOOP	5 
 
class TimeMgr 
{ 
public: 
	TimeMgr(TableMgr*	tableMgr, 
			ThreadMgr*	threadMgr); 
 
	~TimeMgr(); 
 
	start(); 
private: 
	TableMgr*		m_tableMgr; 
	int				m_tableBrowseCounter; 
	ThreadMgr*		m_threadMgr; 
}; 
 
 
class FtpMgr 
{ 
public: 
 
	FtpMgr::FtpMgr( 
		TableMgr*	tableMgr, 
		PortMgr*	portMgr, 
		const char* pseudIPAddr 
	); 
 
	void activeMode_out(char *pChar, int *dataLen, TableEntry* m_table); 
 
	~FtpMgr(); 
 
private: 
	TableMgr	*m_tableMgr; 
	PortMgr		*m_portMgr; 
	char		m_pseudIPAddr[16]; 
}; 
 
 
 
class COutward : public CheckSumCalc 
{ 
public: 
	COutward( 
		TableMgr*	tableMgr,  
		PortMgr*	portMgr,  
		ArpMgr*		arpMgr, 
		PseudIF*	pseudIF, 
		ThreadMgr*	threadMgr, 
		FtpMgr*		ftpMgr, 
 
		const char* lanIPAddr, 
		const char* wanIPAddr,  
		const char* subWanIPAddr,  
		const char* defaultWanGWAddr); 
	 
	~COutward(); 
 
	start(); 
 
	__u32			m_wanIPAddr_u32;	// Host byte 
	unsigned char	m_wanMacAddr[ETH_ALEN]; 
 
private: 
	bool			packetDelimiter(); 
	bool			analizeRawPacket(char* pChar, int dataLen); 
 
	char			m_message[1024]; 
	 
	char			m_lanIPAddr[16]; 
	char			m_wanIPAddr[16]; 
 
	__u32			m_lanIPAddr_u32;	// Host byte 
 
	char			m_lanAdapterName[512]; 
	char			m_wanAdapterName[512]; 
	 
	unsigned char	m_lanMacAddr[ETH_ALEN];	 
 
	LPADAPTER		m_lanLpAdapter; 
 
	LPPACKET		m_lanLpPacket; 
	 
	char			m_lanBuffer[256000]; 
 
	TableMgr*		m_tableMgr; 
	PortMgr*		m_portMgr; 
	PseudIF*		m_pseudIF; 
	ArpMgr*			m_arpMgr; 
	ThreadMgr*		m_threadMgr; 
	FtpMgr*			m_ftpMgr; 
}; 
 
class CInward : public CheckSumCalc 
{ 
public: 
	CInward( 
		TableMgr*	tableMgr,  
		PortMgr*	portMgr, 
		ArpMgr*		arpMgr, 
		PingServer* pingSvr, 
		PseudIF*	pseudIF, 
		ThreadMgr*	threadMgr,		 
		const char* lanIPAddr, 
		const char* wanIPAddr, 
		bool pingDown 
		); 
 
	~CInward(); 
 
	start(); 
 
private: 
	bool			packetDelimiter(); 
	bool			analizeRawPacket(char* pChar, int dataLen); 
 
	char			m_message[1024]; 
	 
	char			m_lanIPAddr[16]; 
	char			m_wanIPAddr[16]; 
 
	__u32			m_lanIPAddr_u32;	// Host byte	 
	__u32			m_wanIPAddr_u32;	// Host byte	 
	 
	char			m_lanAdapterName[512]; 
	char			m_wanAdapterName[512]; 
	 
	unsigned char	m_lanMacAddr[ETH_ALEN];	 
	unsigned char	m_wanMacAddr[ETH_ALEN]; 
	 
	LPADAPTER		m_lanLpAdapter; 
	LPADAPTER		m_wanLpAdapter; 
 
	LPPACKET		m_lanLpPacket; 
	LPPACKET		m_wanLpPacket; 
	 
	char			m_lanBuffer[MAX_ETH_SIZE]; 
	char			m_wanBuffer[256000]; 
 
	TableMgr*		m_tableMgr; 
	PortMgr*		m_portMgr; 
	ArpMgr*			m_arpMgr; 
	PingServer*		m_pingServer; 
	PseudIF*		m_pseudIF; 
	bool			m_pingDown; 
	ThreadMgr*		m_threadMgr; 
}; 
 
 
 
 
///// Network ////////// 
 
#define ETH_P_IP	0x0800		/* Internet Protocol packet	*/ 
 
struct ethhdr  
{ 
	unsigned char	h_dest[ETH_ALEN];	/* destination eth addr	*/ 
	unsigned char	h_source[ETH_ALEN];	/* source ether addr	*/ 
	unsigned short	h_proto;			/* packet type ID field	*/ 
}; 
 
struct iphdr  
{ 
	__u8	ihl:4,  
		version:4;	// LITTLE_ENDIAN_BITFIELD ( for INTEL chip ) 
 
	__u8	tos; 
	__u16	tot_len; 
	__u16	id; 
	__u16	frag_off; 
	__u8	ttl; 
	__u8	protocol; 
	__u16	check; 
	__u32	saddr; 
	__u32	daddr; 
}; 
 
 
struct pesudeIphdr 
{ 
	__u32	saddr; 
	__u32	daddr; 
	__u8	zero;		// should be 0 
	__u8	protocol; 
	__u16	len;		// UDP/TCP data length 
}; 
 
 
 
struct udphdr { 
	__u16	source; 
	__u16	dest; 
	__u16	len; 
	__u16	check; 
}; 
 
struct tcphdr { 
	__u16	source; 
	__u16	dest; 
	__u32	seq; 
	__u32	ack_seq; 
	__u16	res1:4, 
		doff:4, 
		fin:1, 
		syn:1, 
		rst:1, 
		psh:1, 
		ack:1, 
		urg:1, 
		res2:2; 
	__u16	window; 
	__u16	check; 
	__u16	urg_ptr; 
}; 
 
 
#define ICMP_ECHOREPLY		0	/* Echo Reply			*/ 
#define ICMP_ECHO			8	/* Echo Request			*/ 
 
struct icmphdr { 
  __u8		type; 
  __u8		code; 
  __u16		checksum; 
  union { 
	struct { 
		__u16	id; 
		__u16	sequence; 
	} echo; 
	__u32	gateway; 
	struct { 
		__u16	__unused; 
		__u16	mtu; 
	} frag; 
  } un; 
}; 
 
 
 
 
 
#define ETH_P_ARP	0x0806		/* Address Resolution packet	*/ 
#define ETH_P_802_3	0x0001		/* Dummy type for 802.3 frames  */ 
#define	ARPOP_REQUEST	1		/* ARP request			*/ 
#define	ARPOP_REPLY	2			/* ARP reply			*/ 
 
struct arphdr 
{ 
	unsigned short	ar_hrd;		/* format of hardware address	*/ 
	unsigned short	ar_pro;		/* format of protocol address	*/ 
	unsigned char	ar_hln;		/* length of hardware address	*/ 
	unsigned char	ar_pln;		/* length of protocol address	*/ 
	unsigned short	ar_op;		/* ARP opcode (command)		*/ 
 
	unsigned char	ar_sha[ETH_ALEN];	/* sender hardware address	*/ 
	unsigned char	ar_sip[4];			/* sender IP address		*/ 
	unsigned char	ar_tha[ETH_ALEN];	/* target hardware address	*/ 
	unsigned char	ar_tip[4];			/* target IP address		*/ 
}; 
 
struct arpPacket 
{ 
	struct ethhdr	ethhdr; 
	struct arphdr	arphdr; 
}; 
 
 
#define	ARP_WAIT_TIME	500		/* Arp Response waiting time (ms) */ 
 
const char *_hostnameToDotIP(const char *IPAddr); 
 
// This class is exported from the Arp.dll 
class CArp { 
public: 
	CArp::CArp( 
		const char* srcIPAddr, 
		const char* subnetIPAddr, 
		const char* defaultGWAddr, 
		unsigned long waitTime = ARP_WAIT_TIME // 500 
		); 
 
	~CArp(); 
 
	bool isArpVaild(); 
 
	char* getLastMessage(); 
 
	bool arpSendRecv(const char* ipAddr, char* macAddr); 
	bool arpSendRecv(__u32 hostTypeIPAddr32, char* mac_ethAlen); 
 
private: 
 
	bool			m_CArpFlag; 
 
	bool getAdapterInfo( 
		const char* nicIPAddress,	// input 
		char* AdapterName,			// output 
		unsigned char*	macAddr		// output 
		); 
	 
	bool packetDelimiter( 
		struct arpPacket *p_arp, unsigned char* ar_tip); 
 
	bool analizeRawPacket( 
		char *pChar, u_int dataLen, struct arpPacket *p_arp, unsigned char* ar_tip); 
 
	LPADAPTER		m_lpAdapter;  
	LPPACKET		m_lpPacket; 
 
	LPADAPTER		m_lpAdapter2;  
	LPPACKET		m_lpPacket2; 
 
	char			m_buffer2[25600];  // buffer to hold the data coming from the driver 
 
	char			m_message[1024]; 
 
	// string that contains a list of the network adapters 
	char			m_adapterName[512]; 
	 
	// local MAC Address 
	unsigned char	m_macAddr[ETH_ALEN]; 
	char			m_ipAddr[16]; 
	char			m_subAddr[16]; 
	char			m_defgAddr[16]; 
 
	char			m_defgMacAddr[18]; 
	char			m_localMacAddr[18]; 
 
	__u32			m_subAddr_u32; 
	__u32			m_defgAddr_u32; 
	__u32			m_netAddr_u32; 
 
	unsigned long	m_waitTime; 
 
}; 
 
 
class ConsoleMgr 
{ 
public: 
	ConsoleMgr::ConsoleMgr( 
		TableMgr *tableMgr,  
		ThreadMgr *threadMgr, 
					    
		char* pseudIPAddr, 
		char* lanIPAddr, 
		char* wanIPAddr, 
		char* subWanIPAddr, 
		char* defaultWanGWAddr, 
		bool  pingDown 
	); 
 
	~ConsoleMgr(); 
 
	start(); 
 
private: 
 
	TableMgr *m_tableMgr; 
	ThreadMgr *m_threadMgr; 
 
	char*	 m_pseudIPAddr; 
	char*	 m_lanIPAddr; 
	char*	 m_wanIPAddr; 
	char*	 m_subWanIPAddr; 
	char*	 m_defaultWanGWAddr; 
	bool	 m_pingDown; 
}; 
 
 
 
 
 
 
class panic 
{ 
public: 
	panic(){}; 
	virtual ~panic(){}; 
}; 
 
 
 
struct wardInfo 
{ 
	TableMgr*	tableMgr; 
	PortMgr*	portMgr; 
	PseudIF*	psuedIF; 
	ArpMgr*		arpMgr; 
	PingServer* pingSvr; 
	ThreadMgr*	threadMgr; 
	FtpMgr*		ftpMgr; 
 
	char*		pseudIPAddr; 
	char*		lanIPAddr; 
	char*		wanIPAddr; 
	char*		subWanIPAddr; 
	char*		defaultWanGWAddr; 
	 
	bool		pingDown; 
};