⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sniffer.h

📁 监听分析流量中的http流量
💻 H
字号:
// Sniffer.h: interface for the CSniffer class.
//
//////////////////////////////////////////////////////////////////////
#include <vector>
#include <string>
#include <WinSock2.h>


#include "HttpParse.h"

#if !defined(AFX_SNIFFER_H__00683B77_64F1_4994_855C_4D6A37454902__INCLUDED_)
#define AFX_SNIFFER_H__00683B77_64F1_4994_855C_4D6A37454902__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000



/************************************************************************/
/*						 抓包类TCP/IP协议结构(begin)                    */
/************************************************************************/

#define STATUS_FAILED 0xFFFF		//定义异常出错代码
#define MAX_PACK_LEN  65535			//接收的最大IP报文	
#define MAX_ADDR_LEN  16			//点分十进制地址的最大长度
#define MAX_PROTO_TEXT_LEN	16		//子协议名称(如"TCP")最大长度
#define MAX_PROTO_NUM 12			//子协议数量
#define MAX_HOSTNAME_LAN 255		//最大主机名长度
#define CMD_PARAM_HELP true

//协议分析
#define TELNET_MAX_PACK 10			//Telnet最大抓包数

typedef struct _tagPROTOMAP
{
	int  ProtoNum;
	char ProtoText[MAX_PROTO_TEXT_LEN];
}PROTOMAP;

static PROTOMAP ProtoMap[MAX_PROTO_NUM] =
{
	{ IPPROTO_IP   , "IP "  },
	{ IPPROTO_ICMP , "ICMP" }, 
	{ IPPROTO_IGMP , "IGMP" },
	{ IPPROTO_GGP  , "GGP " }, 
	{ IPPROTO_TCP  , "TCP " }, 
	{ IPPROTO_PUP  , "PUP " }, 
	{ IPPROTO_UDP  , "UDP " }, 
	{ IPPROTO_IDP  , "IDP " }, 
	{ IPPROTO_ND   , "NP "  }, 
	{ IPPROTO_RAW  , "RAW " }, 
	{ IPPROTO_MAX  , "MAX " },
	{ NULL         , ""     }
};
	

typedef struct _iphdr 
{
	unsigned char	h_lenver;		//4位首部长度+4位IP版本号
	unsigned char	tos;			//8位服务类型TOS
	unsigned short	total_len;		//16位总长度(字节)
	unsigned short	ident;			//16位标识
	unsigned short	frag_and_flags;	//3位标志位
	unsigned char	ttl;			//8位生存时间 TTL
	unsigned char	proto;			//8位协议 (TCP, UDP 或其他)
	unsigned short	checksum;		//16位IP首部校验和
	unsigned int	sourceIP;		//32位源IP地址
	unsigned int	destIP;			//32位目的IP地址
}IP_HEADER;

typedef struct _tcphdr				//定义TCP首部
{
	USHORT th_sport;				//16位源端口
	USHORT th_dport;				//16位目的端口
	unsigned int  th_seq;			//32位序列号
	unsigned int  th_ack;			//32位确认号
	unsigned char th_lenres;		//4位首部长度/6位保留字
	unsigned char th_flag;			//6位标志位
	USHORT th_win;					//16位窗口大小
	USHORT th_sum;					//16位校验和
	USHORT th_urp;					//16位紧急数据偏移量
}TCP_HEADER;

typedef struct _icmphdr				//定义ICMP首部
{
	BYTE   i_type;					//8位类型
	BYTE   i_code;					//8位代码
	USHORT i_cksum;					//16位校验和 
	USHORT i_id;					//识别号(一般用进程号作为识别号)
	USHORT i_seq;					//报文序列号	
	ULONG  timestamp;				//时间戳
}ICMP_HEADER;

typedef struct _udphdr				//定义UDP首部
{
    unsigned short uh_sport;		//16位源端口
    unsigned short uh_dport;		//16位目的端口
    unsigned short uh_len;			//16位长度
    unsigned short uh_sum;			//16位校验和
} UDP_HEADER;

typedef struct _ipdata				//定义
{
	int len;
	char *buf;
}IPDATA;


/************************************************************************/
/*						 抓包类TCP/IP协议结构(end)                      */
/************************************************************************/


//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////


using namespace std;

class CSniffer  
{
public:
	CSniffer();
	virtual ~CSniffer();

public:
	//变量

	SOCKET	m_RawSock; //SOCK

	vector<string> m_strIPInfoList;		//存放IP数据包信息的链表
	vector<DWORD> m_strIPDataList;		//存放IP数据包数据的链表

//用于协议分析
public:
	//协议分析变量

	CHttpParse m_HttpParse;

private:
	BOOL	m_bWSAStartup;	//用于判断是否进行sock的初始化
	BOOL	m_IsAllProto;	//选中全部协议
	BOOL	m_IsAllIp;		//选中全部IP
	BOOL	m_IsAllPort;	//选中全部端口
	char	m_szProto[16];	//得到用户选择的协议
	char	m_strAddr[64];	//指定地址
	UINT	m_uPort;		//指定端口
	char	*m_HostIp;		//本机IP


	HANDLE m_hThread;	//用于保存线程


	int  m_ihLen;			 //IP包头长度
	char m_szDestPort[16];	 //得到IP包中目标协议
	char m_szSourcePort[16]; //得到IP包中源协议
	char m_szTTL[16];		 //得到IP包中TTL
	char m_szDestIP[16];	 //得到IP包中目标IP
	char m_szSourceIP[16];	 //得到IP包中源IP
	char m_szProtocol[16];	 //得到IP包中协议

	CRITICAL_SECTION m_ls; //临界区结构

	BOOL m_bIsRun;	//用于控制抓包线程的开启和关闭

public:

	//函数
	BOOL SnifferInit(LPSTR lpStrAddr, UINT uPort);
	void StopSniffer();	//停止嗅探
	BOOL CreateSock();	//建立原始套接字
	void SplitIpPack(char *pData, int len);	//拆分IP包
	char* CheckProtocol(int iProtocol);	//得到协议名
	void ShowIpInfo(char *pData, int len);	//将IP包拆分后进行显示
	void ShowIpData(char *pData, int len);	//格式化显示IP包
	void DelListBuf();	//用于释放堆内存

	void TCPProtocolParse(char *pData, int len);	//这个函数用于统一处理协议分析
	void ConfigProtocolParsePack(vector<DWORD> &Parse_List);	//组装Telnet抓包数据

	char* GetIp();
	void GetNowTime(char *pCurTime);
	bool WriteLogFile(char *strInfo, int nBuffer, char *strFileName);


public:
	inline UINT GetPort()
			{return m_uPort;}
	

public:
	static DWORD CALLBACK RecvIpPro(LPVOID lpParam);

	
	
	
	

};

#endif // !defined(AFX_SNIFFER_H__00683B77_64F1_4994_855C_4D6A37454902__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -