亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

基于套接字的網(wǎng)絡(luò)嗅探器及其方法_2

文檔序號:9491726閱讀:來源:國知局
r> 圖1為無連接套接字應(yīng)用程序時序圖;
圖2為面向連接套接字應(yīng)用程序時序圖;
圖3為UDP報文頭結(jié)構(gòu)圖; 圖4為TCP報文段頭結(jié)構(gòu)圖;
圖5為IP數(shù)據(jù)報頭結(jié)構(gòu)圖;
圖6為本發(fā)明基于套接字的網(wǎng)絡(luò)嗅探器的結(jié)構(gòu)框圖;
圖7為本發(fā)明基于套接字的網(wǎng)絡(luò)嗅探器嗅探方法的流程圖;
圖8初始化Windows Sockets DLL的流程圖;
圖9設(shè)置原始套接字流程圖;
圖10數(shù)據(jù)包解析模塊的數(shù)據(jù)包解析流程圖;
圖11子協(xié)議解析流程圖;
圖12數(shù)據(jù)包內(nèi)容輸出流程圖;
圖13為本發(fā)明基于套接字的TCP端口嗅探方法的流程圖。
【具體實施方式】
[0027]為使本發(fā)明的目的、技術(shù)方案和優(yōu)點更加清楚明了,下面結(jié)合【具體實施方式】并參照附圖,對本發(fā)明進一步詳細說明。應(yīng)該理解,這些描述只是示例性的,而并非要限制本發(fā)明的范圍。此外,在以下說明中,省略了對公知結(jié)構(gòu)和技術(shù)的描述,以避免不必要地混淆本發(fā)明的概念。
[0028]實施例:
具體到網(wǎng)絡(luò)嗅探器的編程實現(xiàn)上,對網(wǎng)卡混雜模式的設(shè)置是通過原始套接字rawsocket來實現(xiàn)的,這也有別于通常經(jīng)常使用的數(shù)據(jù)流套接字和數(shù)據(jù)報套接字。在創(chuàng)建了原始套接字后,需要通過setsockopt ()函數(shù)來設(shè)置IP數(shù)據(jù)報頭操作選項,然后再通過綁定函數(shù)bind()函數(shù)將原始套接字綁定到本地網(wǎng)卡。為了讓原始套接字能接受所有的數(shù)據(jù),還需要通過函數(shù)1ctlsocketO來進行設(shè)置,而且還可以指定是否親自處理IP頭。
[0029]至此,實際就可以開始對網(wǎng)絡(luò)數(shù)據(jù)包進行嗅探了,對數(shù)據(jù)包的獲取仍像流式套接字或數(shù)據(jù)報套接字那樣通過接收函數(shù)recvO函數(shù)來完成。但是與其他兩種套接字不同的是,原始套接字此時捕獲到的數(shù)據(jù)包并不僅僅是單純的數(shù)據(jù)信息,而是包含有IP頭、TCP頭等信息頭的最原始的數(shù)據(jù)信息,這些信息保留了它在網(wǎng)絡(luò)傳輸時的原貌。通過對這些在低層傳輸?shù)脑夹畔⒌姆治隹梢缘玫接嘘P(guān)網(wǎng)絡(luò)的一些信息。由于這些數(shù)據(jù)經(jīng)過了網(wǎng)絡(luò)層和傳輸層的打包,因此需要根據(jù)其附加的幀頭對數(shù)據(jù)包進行分析。
[0030]數(shù)據(jù)在從應(yīng)用層到達傳輸層時,將添加TCP報文段頭,或是UDP報文頭。其中UDP報文頭比較簡單,由一個8字節(jié)的頭和數(shù)據(jù)部分組成,具體格式如圖3所示。
[0031]對于此UDP報文頭的分析在編程實現(xiàn)中可通過數(shù)據(jù)結(jié)構(gòu)UDPPacketHead來定義: typedef struct _tagUDPHEADER //8 Bytes
{
unsigned short uh_sport; //16 位源端口 unsigned short uh_dport; //16位目的端口 unsigned short uh_len; //16位長度 unsigned short uh_sum; //16位校驗和 } UDP_HEADER;
而TCP報文段頭則比較復(fù)雜,以20個固定字節(jié)開始,在固定頭后面還可以有一些長度不固定的可選項,圖4給出TCP報文段頭的組成格式。
[0032]對于此TCP報文段頭的分析在編程實現(xiàn)中可通過數(shù)據(jù)結(jié)構(gòu)TCPPacketHead來定義:
typedef struct _tagTCPHEADER //20 Bytes{
unsigned short th_sport; //源端口unsigned short th_dport; //目的端口unsigned int th—seq; //32位序列號unsigned int th—ack; //32位確認號unsigned char th—lenres; //4位首部長度unsigned char th_flag; //6位標(biāo)志位unsigned short th—win; //16位窗口大小unsigned short th—sum; //16位校驗和unsigned short th—urp; //16位緊急數(shù)據(jù)偏移量}TCP—HEADER;
在網(wǎng)絡(luò)層,還要給TCP報文段添加一個IP數(shù)據(jù)報頭以組成IP數(shù)據(jù)報。IP數(shù)據(jù)報頭格式如圖5所示。
[0033]同樣,在實際編程中也需要通過一個數(shù)據(jù)結(jié)構(gòu)來表示此IP數(shù)據(jù)報頭,下面給出此數(shù)據(jù)結(jié)構(gòu)的定義:
typedef struct —taglPHEADER//20 Bytes
{ unsigned char h—lenver;//4位首部長度
unsigned char tos;//8位服務(wù)類型
unsigned short total—len;//16位總長度
unsigned short ident;//16位標(biāo)識符
unsigned short frag—and—flags; //3位標(biāo)志位unsigned char ttl;//8位生存時間
unsigned char proto;//8位協(xié)議(IP,TCP,UDP etc)
unsigned short checksum;//16位 IP首部校驗和
unsigned int sourcelP;//32 位源 IP地址
unsigned int destIP;//32位目的 IP地址
}IP—HEADER, *PIP—HEADER。
[0034]如圖6所示,網(wǎng)絡(luò)嗔探器的開發(fā)分為三大模塊:數(shù)據(jù)包捕獲模塊、數(shù)據(jù)包解析模塊、數(shù)據(jù)包顯示模塊。
[0035]其中數(shù)據(jù)包捕獲模塊中包含套接字設(shè)定和包捕獲功能,數(shù)據(jù)包解析模塊中包含數(shù)據(jù)包頭解析和子協(xié)議解析,數(shù)據(jù)包顯示模塊中包含List輸出控件和Edit輸出控件。
[0036]如圖7所示,利用套接字開發(fā)網(wǎng)絡(luò)嗔探器程序時的一般步驟是:首先,創(chuàng)建原始套接字,并設(shè)置其操作選項;其次將原始套接字綁定到本地網(wǎng)卡地址上;設(shè)置網(wǎng)卡為混雜模式,這樣網(wǎng)卡就可以收到任何在網(wǎng)絡(luò)中傳輸?shù)臄?shù)據(jù)包;在以上條件下開始對數(shù)據(jù)包進行捕獲和分析;當(dāng)接收到數(shù)據(jù)包時先解析數(shù)據(jù)包頭,再根據(jù)數(shù)據(jù)包協(xié)議進行子協(xié)議解析;解析完以后分別通過List和Edit兩個控件將解析的內(nèi)容數(shù)據(jù)輸出??梢圆东@到所有經(jīng)過本地網(wǎng)卡的數(shù)據(jù)包,并可從中分析出協(xié)議、IP源地址、IP目標(biāo)地址、TCP源端口號、TCP目標(biāo)端口號、包的數(shù)據(jù)部分等信息。
[0037]在捕獲數(shù)據(jù)包前,由于Windows Sockets的服務(wù)是以動態(tài)連接庫WINSOCK.DLL形式實現(xiàn)的,所以必須要先調(diào)用WSAStartup ()函數(shù)。本函數(shù)必須是應(yīng)用程序或DLL調(diào)用的第一個Windows Sockets函數(shù),它允許應(yīng)用程序或DLL指明Windows Sockets API的版本號及獲得特定Windows Sockets實現(xiàn)的細節(jié)。應(yīng)用程序或DLL只能在一次成功的WSAStartup ()調(diào)用之后才能調(diào)用進一步的Windows Sockets API函數(shù)。
[0038]為支持日后可能和Windows Sockets 1.1有功能上差異的Windows Sockets實現(xiàn)及應(yīng)用程序,在WSAStartup ()中規(guī)定了一個協(xié)議。WSAStartup ()的調(diào)用方和動態(tài)數(shù)據(jù)庫鏈接文件Windows Sockets DLL互相通知對方它們可以支持的最高版本,并且互相確認對方的最高版本是可接受的。在WSAStartup ()函數(shù)的入口,Windows Sockets DLL檢查了應(yīng)用程序所需的版本。如果版本高于DLL支持的最低版本,則調(diào)用成功并且DLL在wHighVers1n中返回它所支持的最高版本,在wVers1n中返回它的高版本和wVers1nRequested中的較小者。然后Windows Sockets DLL就會假設(shè)應(yīng)用程序?qū)⑹褂脀Vers1n。如果WSDATA結(jié)構(gòu)中的wVers1n域?qū)φ{(diào)用方來說不可接收,它就應(yīng)調(diào)用WSACleanup 0函數(shù)并且要么去另一個Windows Sockets DLL中搜索,要么初始化失敗。具體流程如圖8所示。
[0039]在捕獲數(shù)據(jù)包前,還要對原始套接字進行設(shè)置,流程如圖9。
[0040]其中設(shè)置原始套接字為S10_RCVALL就是將網(wǎng)卡設(shè)置為混雜模式,實現(xiàn)代碼如下: //把網(wǎng)卡置于混雜模式。獲取10操作的相關(guān)信息
DWORD dwBufferLen[10];
DWORD dwBufferlnLen = 1 ;
DWORD dwBytesReturned = 0 ; err=WSA1ctl (m_RawSock,
S10_RCVALL, //設(shè)置 S0CK_RAW為 S10_RCVALL,以便接收所有的 IP包
&dwBufferInLen,
sizeof(dwBufferlnLen),
&dwBu
當(dāng)前第2頁1 2 3 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1