亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? rawsocketsniffer.cpp

?? “網絡安全技術實踐與代碼詳解”實例代碼
?? CPP
字號:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#pragma  comment (lib, "ws2_32.lib")
#define SIO_RCVALL      _WSAIOW(IOC_VENDOR,1)
#define MAX_PACK_LEN 65535 // 最大包長度
#define MAX_ADDR_LEN 16 // 最大地址長度
#define MAX_PROTO_TEXT_LEN 16 // 子協議名稱最大長度
#define MAX_PROTO_NUM 12 // 子協議數量
#define MAX_HOSTNAME_LEN 255 // 最大主機名長度

// 定義IP首部格式
typedef struct _IPHeader      
{ 
    unsigned char h_verlen;    // 版本和首部長度  
    unsigned char tos;         // 服務類型       
    unsigned short total_len;  // 總長度 
    unsigned short ident;      // 標識號     
    unsigned short frag_and_flags;  // 段偏移量
    unsigned char ttl;         // 生存時間       
    unsigned char proto;       // 協議   
    unsigned short checksum;   // 首部校驗和
    unsigned int sourceIP;     // 源IP地址  
    unsigned int destIP;       // 目的地址   
}IPHEADER;

// 定義TCP首部格式
typedef struct _TCPHeader 
{ 
    unsigned short th_sport;  // 源端口號        
    unsigned short th_dport;  // 目的端口號       
    unsigned int th_seq;  // SEQ序號    
    unsigned int th_ack;  // ACK序號
    unsigned char th_lenres;  //  首部長度    
    unsigned char th_flag;   // 控制位  
    unsigned short th_win;  // 窗口大小        
    unsigned short th_sum;  // 校驗和        
    unsigned short th_urp;  // 緊急指針         
}TCPHEADER;

// 定義UDP首部格式
typedef struct _UDPHeader
{
	unsigned short uh_sport; // 16位源端口
	unsigned short uh_dport; // 16位目的端口
	unsigned short uh_len; // 16位長度
	unsigned short uh_sum; // 16位校驗和
}UDPHEADER;

// 定義ICMP首部格式
typedef struct _ICMPHeader
{
	BYTE i_type; // 8位類型
	BYTE i_code; // 8位代碼
	unsigned short i_cksum; // 16位校驗和
	unsigned short i_id; // 識別號
	unsigned short i_seq; // 報文序列號
	unsigned long timestamp; // 時間戳
}ICMPHEADER;

// 定義子協議映射表
typedef struct _protomap 
{
	int ProtoNum;
	char ProtoText[MAX_PROTO_TEXT_LEN];
}PROTOMAP;

// 為子協議映射表賦值
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,"ND"},
	{IPPROTO_RAW,"RAW"},
	{IPPROTO_MAX,"MAX"},
	{NULL,""}
};

SOCKET SockRaw; // 全局套接字
char TcpFlag[6]={'F','S','R','P','A','U'}; // TCP標志位
bool paramAll = false; // 嗅探所有的數據包
bool paramTcp = false; // 嗅探TCP數據包
bool paramUdp = false; // 嗅探UDP數據包
bool paramIcmp = false; // 嗅探ICMP數據包
int paramkeyword = 0; // 是否進行關鍵字查詢

int packet_totallen = 0; // 數據包總長度

char paramHostAddr_A[20]; // 嗅探的主機A
char paramHostAddr_B[20]; // 嗅探的主機B
char keyword[100]; // 嗅探的關鍵信息

// IP數據包解析函數
int DecodeIpPack(char *);
// TCP數據包解析函數
int DecodeTcpPack(char *);
// UDP數據包解析函數
int DecodeUdpPack(char *);
// ICMP數據包解析函數
int DecodeIcmpPack(char *);
// 顯示數據包信息
void ShowPackInfo(char *buf, int iProtocol, 
				  char *szSoueceIP, char *szDestIP, char *szProtocol);
// 顯示子協議數據包函數
void ShowSubPackInfo(char *, int);
// 錯誤檢測函數
void CheckSockError(int, char*);
// 協議檢測函數
char *CheckProtocol(int);
// 設置嗅探器參數函數
bool SetSnifferParam();

// SOCK錯誤處理函數
void CheckSockError(int iErrorCode, char *pErrorMsg)
{
	if(iErrorCode == SOCKET_ERROR)
	{
		printf("%s Error : %d",pErrorMsg,GetLastError());
		closesocket(SockRaw);
		exit(0);
	}
}

// 協議識別函數
char *CheckProtocol(int iProtocol)
{
	for(int i=0; i<MAX_PROTO_NUM;i++)
	{
		// 如果找到對應的子協議,則返回名稱
		if(ProtoMap[i].ProtoNum == iProtocol)
		{
			return ProtoMap[i].ProtoText;
		}
	}
	return "";
}

// TCP解包函數
int DecodeTcpPack(char *TcpBuf)
{
	TCPHEADER *pTcpHeader;
	char data[MAX_PACK_LEN];
	int i;
	// 轉換成TCP首部格式
	pTcpHeader = (TCPHEADER*)TcpBuf;
	// 輸出源端口和目的端口
	printf("  Port : %d-->%d  ",ntohs(pTcpHeader->th_sport),ntohs(pTcpHeader->th_dport));
	unsigned char FlagMask = 1;
	// 輸出標志位
	for(i=0;i<6;i++)
	{
		if((pTcpHeader->th_flag) & FlagMask)
		{
			printf("%c",TcpFlag[i]);
		}
		else
		{
			printf("-");
		}
		FlagMask = FlagMask<<1;
	}
	printf("\n");
    // 求數據段長度
	int totalheadlen = sizeof(IPHEADER)+sizeof(TCPHEADER);
	int tcpheadlen = sizeof(TCPHEADER);
	memcpy(data,TcpBuf+tcpheadlen,packet_totallen-totalheadlen);
	// 進行關鍵字尋求和輸出
	if(paramkeyword == 1)
	{
		// 如果找到關鍵字,則輸出數據段
		if(strstr(data,keyword))
		{
			printf("\n************************DATA******************************\n");
			for(i =0 ;i<packet_totallen-totalheadlen;i++)
			{
				printf("%c",data[i]);
			}
			printf("\n************************DATA******************************\n");
		}
	}

	return true;
}

// UDP 解包函數
int DecodeUdpPack(char *UdpBuf)
{
	UDPHEADER *pUdpHeader;
	char data[MAX_PACK_LEN];
	pUdpHeader = (UDPHEADER *)UdpBuf;
	// 輸出端口和數據長度
	printf("  Port : %d-->%d ",ntohs(pUdpHeader->uh_sport),ntohs(pUdpHeader->uh_dport));
	printf("  Len = %d\n",ntohs(pUdpHeader->uh_len));
	int totalheadlen = sizeof(IPHEADER)+sizeof(UDPHEADER);
	int udpheadlen = sizeof(UDPHEADER);
	memcpy(data,UdpBuf+udpheadlen,packet_totallen-totalheadlen);
	// 進行關鍵字尋求和輸出
	if(paramkeyword == 1)
	{
		// 如果找到關鍵字,則輸出數據段
		if(strstr(data,keyword))
		{
			printf("\n************************DATA******************************\n");
			for(int i =0 ;i<packet_totallen-totalheadlen;i++)
			{
				printf("%c",data[i]);
			}
			printf("\n************************DATA******************************\n");
		}
	}
	return true;
}

// ICMP 解包函數
int DecodeIcmpPack(char *IcmpBuf)
{
	ICMPHEADER *pIcmpHeader;
	pIcmpHeader = (ICMPHEADER *)IcmpBuf;
	// 輸出ICMP數據包類型、ID和SEQ
	printf("  Type : %d,%d",pIcmpHeader->i_type,pIcmpHeader->i_code);
	printf("  ID = %d SEQ = %d\n",pIcmpHeader->i_id,pIcmpHeader->i_seq);
	return true;
}
// 根據過濾條件顯示數據包信息
void ShowPackInfo(char *buf, int iProtocol, char *szSoueceIP, char *szDestIP, char *szProtocol)
{
	// 如果設置了主機B的IP,沒有設置主機A的IP
	if((!strcmp(paramHostAddr_A,"all")) && (strcmp(paramHostAddr_B,"all")))
	{
		if((!strcmp(paramHostAddr_B,szSoueceIP)) 
			|| (!strcmp(paramHostAddr_B,szDestIP)))
		{
			printf("\n%s  ",szProtocol);
			printf("%s-->%s",szSoueceIP,szDestIP);
			// 顯示子協議數據包相關信息
			ShowSubPackInfo(buf,iProtocol);
		}
	}
	// 如果設置主機A的IP,沒有設置主機B的IP
	else if((strcmp(paramHostAddr_A,"all")) && (!strcmp(paramHostAddr_B,"all")))
	{
		if((!strcmp(paramHostAddr_A,szSoueceIP)) 
			|| (!strcmp(paramHostAddr_A,szDestIP)))
		{
			printf("\n%s  ",szProtocol);
			printf("%s-->%s",szSoueceIP,szDestIP);
			ShowSubPackInfo(buf,iProtocol);
		}
	}
	// 如果主機A和B的IP都進行了設置
	else if((strcmp(paramHostAddr_A,"all")) && (strcmp(paramHostAddr_B,"all")))
	{
		if((!strcmp(paramHostAddr_A,szSoueceIP) 
			&& !strcmp(paramHostAddr_B,szDestIP))
			|| (!strcmp(paramHostAddr_B,szSoueceIP) 
			&& !strcmp(paramHostAddr_A,szDestIP)))
		{
			
			printf("\n%s  ",szProtocol);
			printf("%s-->%s",szSoueceIP,szDestIP);
			ShowSubPackInfo(buf,iProtocol);
		}
	}
	// 如果主機A和B的IP都沒有進行設置
	else
	{
		printf("\n%s  ",szProtocol);
		printf("%s-->%s",szSoueceIP,szDestIP);
		ShowSubPackInfo(buf,iProtocol);
	}
}
// 顯示子協議數據包信息
void ShowSubPackInfo(char *buf, int iProtocol)
{
	switch(iProtocol)
	{
	case IPPROTO_TCP: // TCP數據包
		DecodeTcpPack(buf);
		break;
	case IPPROTO_UDP: // UDP數據包
		DecodeUdpPack(buf);
		break;
	case IPPROTO_ICMP: // ICMP數據包
		DecodeIcmpPack(buf);
		break;
	default:
		break;
	}
}
// IP 解包函數
int DecodeIpPack(char *buf)
{
	IPHEADER *pIpHeader;
	int iProtocol;
	// 定義協議
	char szProtocol[MAX_PROTO_TEXT_LEN];
	char szSourceIP[MAX_ADDR_LEN];
	char szDestIP[MAX_ADDR_LEN];
	SOCKADDR_IN saSource,saDest;
	pIpHeader = (IPHEADER *)buf;
	// 檢測協議是哪種類型
	iProtocol = pIpHeader->proto;
	strncpy(szProtocol,CheckProtocol(iProtocol),MAX_PROTO_TEXT_LEN);
	// 檢測源地址
	saSource.sin_addr.s_addr = pIpHeader->sourceIP;
	strncpy(szSourceIP,inet_ntoa(saSource.sin_addr),MAX_ADDR_LEN);
	// 檢測目的地址
	saDest.sin_addr.s_addr = pIpHeader->destIP;
	strncpy(szDestIP,inet_ntoa(saDest.sin_addr),MAX_ADDR_LEN);

	int iIpLen = sizeof(unsigned long)*(pIpHeader->h_verlen & 0xf);
	packet_totallen = ntohs(pIpHeader->total_len);

	// 下面顯示過濾信息
	if(paramAll) // 顯示所有協議類型數據包
	{
		ShowPackInfo(buf+iIpLen,iProtocol,szSourceIP,szDestIP,szProtocol);
	}
	// 顯示TCP類型數據包
	else if(paramTcp && (iProtocol == IPPROTO_TCP))
	{ 
		ShowPackInfo(buf+iIpLen,iProtocol,szSourceIP,szDestIP,szProtocol);
	}
	// 顯示UDP類型數據包
	else if(paramUdp && (iProtocol == IPPROTO_UDP))
	{
		ShowPackInfo(buf+iIpLen,iProtocol,szSourceIP,szDestIP,szProtocol);
	}
	// 顯示ICMP類型數據包
	else if(paramIcmp && (iProtocol == IPPROTO_ICMP))
	{
		ShowPackInfo(buf+iIpLen,iProtocol,szSourceIP,szDestIP,szProtocol);
	}
	return true;
}
// 設置嗅探器參數
bool SetSnifferParam()
{
	int ret;
	bool check_input = false;
	while(!check_input)
	{
		printf("請選擇要嗅探的數據包類型 0->全部 1->TCP 2->UDP 3->ICMP : ");
		scanf("%d",&ret);
		switch(ret)
		{
		case 0:
			paramAll = true;
			check_input = true;
			break;
		case 1:
			paramTcp = true;
			check_input = true;
			break;
		case 2:
			paramUdp = true;
			check_input = true;
			break;
		case 3:
			paramIcmp = true;
			check_input = true;
			break;
		default:
			printf("輸入錯誤!!!\n");
			check_input = false;
			break;
		}
	}

	printf("\n請輸入嗅探的主機A的IP地址(輸入all即為全部主機):");
	scanf("%s",paramHostAddr_A);
	printf("\n請輸入嗅探的主機B的IP地址(輸入all即為全部主機):");
    scanf("%s",paramHostAddr_B);
	printf("\n是否進行關鍵字搜索? 0->否 1->是 : ");
	scanf("%d",&paramkeyword);
	if( paramkeyword == 1)
	{
		printf("\n請輸入關鍵字:");
		scanf("%s",keyword);
	}
	return true;
}

void main(int argc, char **argv)
{
	int iErrorCode;
	char RecvBuf[MAX_PACK_LEN] = {0};
	SetSnifferParam();
	WSADATA wsaData;
	// 初始化Winsock庫
	iErrorCode = WSAStartup(MAKEWORD(2,1),&wsaData);
	CheckSockError(iErrorCode, "WSAStartup");
	SockRaw = socket(AF_INET, SOCK_RAW, IPPROTO_IP);
	CheckSockError(SockRaw, "socket");
	// 獲取本機IP地址,并且判斷Socket版本,建立原始套接字
	char FAR name[MAX_HOSTNAME_LEN];
	iErrorCode = gethostname(name, MAX_HOSTNAME_LEN);
	CheckSockError(iErrorCode, "gethostname");
	struct hostent FAR *pHostent;
	pHostent = (struct hostent *)malloc(sizeof(struct hostent));
	pHostent = gethostbyname(name);
	// 設置地址結構,端口為本地的6000
	SOCKADDR_IN sa;
	sa.sin_family = AF_INET;
	sa.sin_port = htons(6000);
	memcpy(&sa.sin_addr.S_un.S_addr,pHostent->h_addr_list[0],pHostent->h_length);
	// 綁定地址結構
	iErrorCode = bind(SockRaw, (PSOCKADDR)&sa, sizeof(sa));
	CheckSockError(iErrorCode, "bind");
	// 設置套接字為SIO_RCVALL,以便接收所有的IP包
	DWORD dwBufferLen[10];
	DWORD dwBufferInLen = 1;
	DWORD dwBytesReturned = 0;
	iErrorCode = WSAIoctl(SockRaw, SIO_RCVALL , &dwBufferInLen, sizeof(dwBufferInLen),
		&dwBufferLen, sizeof(dwBufferLen), &dwBytesReturned, NULL, NULL);
	CheckSockError(iErrorCode, "Ioctl");
	// 監聽IP報文
	while(1)
	{
		// 每次將接收緩沖區清零
		memset(RecvBuf, 0, sizeof(RecvBuf));
		// 開始接收緩沖區的數據
		iErrorCode = recv(SockRaw, RecvBuf, sizeof(RecvBuf),0);
		CheckSockError(iErrorCode, "recv");
		// 對接收到的數據包進行解析
		iErrorCode = DecodeIpPack(RecvBuf);
		CheckSockError(iErrorCode, "Decode");
		Sleep(10);
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久精品久久久精品美女| 国产精品小仙女| 日本乱码高清不卡字幕| 亚洲三级在线播放| 色久优优欧美色久优优| 午夜精品久久久久久久久久| 欧美亚洲国产一区二区三区va| 亚洲成人一区二区在线观看| 3d成人h动漫网站入口| 精品一区二区三区蜜桃| 国产麻豆成人传媒免费观看| 国产日韩欧美精品电影三级在线| 国产 日韩 欧美大片| 中文一区二区在线观看| 91亚洲男人天堂| 日韩国产成人精品| 337p日本欧洲亚洲大胆精品 | 精品国产免费一区二区三区香蕉 | 久久久久久亚洲综合| 懂色av一区二区三区蜜臀 | 成人动漫在线一区| 亚洲精品乱码久久久久久黑人 | 国产亚洲一区二区三区四区| 91小视频免费看| 肉色丝袜一区二区| 成人av网站免费观看| 久久久噜噜噜久久中文字幕色伊伊| 丁香一区二区三区| 亚洲国产精品一区二区久久恐怖片| 91精品在线观看入口| 精品在线播放午夜| 日韩丝袜美女视频| 成人国产免费视频| 午夜精品视频在线观看| 欧美videossexotv100| 风间由美中文字幕在线看视频国产欧美 | 91麻豆精品久久久久蜜臀| 美女久久久精品| 中文在线资源观看网站视频免费不卡 | 91精品国产综合久久精品| 男女激情视频一区| 中文无字幕一区二区三区| 91在线一区二区三区| 欧美www视频| 成人免费观看av| 亚洲免费观看高清完整版在线| 欧美日韩国产综合一区二区 | 亚洲成人av一区二区三区| 777久久久精品| 高清不卡一区二区| 午夜电影网亚洲视频| 国产三级三级三级精品8ⅰ区| 91亚洲精华国产精华精华液| 日韩电影在线一区二区三区| 中文字幕+乱码+中文字幕一区| 在线观看av一区二区| 韩国女主播成人在线| 一二三区精品福利视频| 欧美成人aa大片| 欧美亚洲丝袜传媒另类| 国产成人啪免费观看软件| 肉色丝袜一区二区| 亚洲精品乱码久久久久久黑人| 久久众筹精品私拍模特| 久久国产福利国产秒拍| 高潮精品一区videoshd| 偷偷要91色婷婷| 国产精品夫妻自拍| 精品国内二区三区| 欧美视频精品在线观看| 粉嫩一区二区三区性色av| 毛片av一区二区| 亚洲一本大道在线| 国产精品对白交换视频| 欧美不卡一区二区三区| 91网站在线观看视频| 成人app网站| 国产盗摄一区二区| 蜜臀av一区二区三区| 亚洲一区免费在线观看| 国产精品久久午夜夜伦鲁鲁| 精品99999| 欧美丝袜第三区| 国产麻豆欧美日韩一区| 婷婷成人激情在线网| 午夜精品久久久久久久99樱桃| 亚洲欧洲精品成人久久奇米网 | 日韩欧美中文字幕公布| 欧美亚日韩国产aⅴ精品中极品| 视频一区国产视频| 樱花草国产18久久久久| 亚洲少妇最新在线视频| 国产精品人成在线观看免费| 国产欧美精品一区二区色综合| 久久夜色精品国产欧美乱极品| 欧美一区二区三区四区视频| 欧美精品久久99久久在免费线| 在线精品视频一区二区三四| 色哟哟精品一区| 欧美性生交片4| 欧美日韩免费电影| 91免费看片在线观看| av福利精品导航| 色综合一区二区| 欧洲av一区二区嗯嗯嗯啊| 色婷婷一区二区三区四区| 欧美亚洲禁片免费| 91精品国产手机| 精品国产一区二区精华| 国产三级精品视频| 综合中文字幕亚洲| 亚洲国产中文字幕在线视频综合 | 久久综合中文字幕| 欧美在线影院一区二区| 欧美做爰猛烈大尺度电影无法无天| 97se亚洲国产综合自在线| 色狠狠桃花综合| 欧美日韩国产首页| 精品国产一区二区三区av性色| 久久久蜜桃精品| 综合色中文字幕| 丝袜美腿一区二区三区| 麻豆精品视频在线| 成人看片黄a免费看在线| 色女孩综合影院| 6080yy午夜一二三区久久| 欧美精品欧美精品系列| 欧美视频一二三区| 欧美一区二区免费视频| 日韩欧美国产成人一区二区| 久久久久成人黄色影片| 亚洲天堂精品视频| 麻豆成人免费电影| 97精品国产露脸对白| 91精品国产综合久久久久| 久久精品日韩一区二区三区| 一区二区三区精品| 韩国av一区二区三区四区| 欧美自拍偷拍午夜视频| 久久www免费人成看片高清| 国产精品一级二级三级| 色香蕉久久蜜桃| 精品国产三级a在线观看| 亚洲欧美偷拍另类a∨色屁股| 一级中文字幕一区二区| 视频在线在亚洲| 国产99精品视频| 欧美一区二区三区啪啪| 亚洲视频1区2区| 激情av综合网| 91丨porny丨最新| www激情久久| 青青草视频一区| 欧美日韩精品一区二区三区四区| 亚洲国产激情av| 久久不见久久见免费视频7| 91行情网站电视在线观看高清版| 亚洲精品一区二区三区四区高清 | 中文字幕免费不卡在线| 亚洲丝袜另类动漫二区| 国模少妇一区二区三区| 在线不卡a资源高清| 亚洲视频免费观看| 狠狠色丁香久久婷婷综合_中 | 久久精品夜色噜噜亚洲aⅴ| 国产精品毛片高清在线完整版| 视频一区免费在线观看| 国产成人午夜电影网| 欧美一卡2卡三卡4卡5免费| 一区二区三区在线播| 国产毛片精品视频| 成人h版在线观看| 欧美不卡在线视频| 亚洲国产精品久久久久婷婷884| 国产一区二三区| 91精品国产高清一区二区三区| 中文字幕在线不卡一区二区三区| 国产一区免费电影| 精品伦理精品一区| 热久久国产精品| 欧美视频一区二区三区在线观看 | 成人一区在线观看| 亚洲图片欧美一区| 国产成人精品免费一区二区| 欧美肥妇bbw| 自拍av一区二区三区| 偷窥少妇高潮呻吟av久久免费| 成人亚洲精品久久久久软件| 久久人人爽爽爽人久久久| 美女www一区二区| 日韩精品91亚洲二区在线观看| 成人高清视频在线| 亚洲色图一区二区| 粗大黑人巨茎大战欧美成人| 中文字幕精品综合| 成人精品国产福利| 亚洲毛片av在线| 欧美色大人视频| 亚洲bdsm女犯bdsm网站| 欧美丰满嫩嫩电影|