成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

使用Sniffer截獲流經(jīng)本機網(wǎng)卡的IP數(shù)據(jù)包

安全
從事網(wǎng)絡安全的技術(shù)人員和相當一部分準黑客(指那些使用現(xiàn)成的黑客軟件進行攻擊而不是根據(jù)需要去自己編寫代碼的人)都一定不會對網(wǎng)絡嗅探器(sniffer)感到陌生,網(wǎng)絡嗅探器無論是在網(wǎng)絡安全還是在黑客攻擊方面均扮演了很重要的角色。

從事網(wǎng)絡安全的技術(shù)人員和相當一部分準黑客(指那些使用現(xiàn)成的黑客軟件進行攻擊而不是根據(jù)需要去自己編寫代碼的人)都一定不會對網(wǎng)絡嗅探器(sniffer)感到陌生,網(wǎng)絡嗅探器無論是在網(wǎng)絡安全還是在黑客攻擊方面均扮演了很重要的角色。

通過使用網(wǎng)絡嗅探器可以把網(wǎng)卡設(shè)置于混雜模式,并可實現(xiàn)對網(wǎng)絡上傳輸?shù)臄?shù)據(jù)包的捕獲與分析。此分析結(jié)果可供網(wǎng)絡安全分析之用,但如為黑客所利用也可以為其發(fā)動進一步的攻擊提供有價值的信息。可見,嗅探器實際是一把雙刃劍。 雖然網(wǎng)絡嗅探器技術(shù)被黑客利用后會對網(wǎng)絡安全構(gòu)成一定的威脅,但嗅探器本身的危害并不是很大,主要是用來為其他黑客軟件提供網(wǎng)絡情報,真正的攻擊主要是由其他黑軟來完成的。而在網(wǎng)絡安全方面,網(wǎng)絡嗅探手段可以有效地探測在網(wǎng)絡上傳輸?shù)臄?shù)據(jù)包信息,通過對這些信息的分析利用是有助于網(wǎng)絡安全維護的。權(quán)衡利弊,有必要對網(wǎng)絡嗅探器的實現(xiàn)原理進行介紹。

嗅探器設(shè)計原理

嗅探器作為一種網(wǎng)絡通訊程序,也是通過對網(wǎng)卡的編程來實現(xiàn)網(wǎng)絡通訊的,對網(wǎng)卡的編程也是使用通常的套接字(socket)方式來進行。但是,通常的套接字程序只能響應與自己硬件地址相匹配的或是以廣播形式發(fā)出的數(shù)據(jù)幀,對于其他形式的數(shù)據(jù)幀比如已到達網(wǎng)絡接口但卻不是發(fā)給此地址的數(shù)據(jù)幀,網(wǎng)絡接口在驗證投遞地址并非自身地址之后將不引起響應,也就是說應用程序無法收取到達的數(shù)據(jù)包。而網(wǎng)絡嗅探器的目的恰恰在于從網(wǎng)卡接收所有經(jīng)過它的數(shù)據(jù)包,這些數(shù)據(jù)包即可以是發(fā)給它的也可以是發(fā)往別處的。顯然,要達到此目的就不能再讓網(wǎng)卡按通常的正常模式工作,而必須將其設(shè)置為混雜模式。

具體到編程實現(xiàn)上,這種對網(wǎng)卡混雜模式的設(shè)置是通過原始套接字(raw socket)來實現(xiàn)的,這也有別于通常經(jīng)常使用的數(shù)據(jù)流套接字和數(shù)據(jù)報套接字。在創(chuàng)建了原始套接字后,需要通過setsockopt()函數(shù)來設(shè)置IP頭操作選項,然后再通過bind()函數(shù)將原始套接字綁定到本地網(wǎng)卡。為了讓原始套接字能接受所有的數(shù)據(jù),還需要通過ioctlsocket()來進行設(shè)置,而且還可以指定是否親自處理IP頭。至此,實際就可以開始對網(wǎng)絡數(shù)據(jù)包進行嗅探了,對數(shù)據(jù)包的獲取仍象流式套接字或數(shù)據(jù)報套接字那樣通過recv()函數(shù)來完成。但是與其他兩種套接字不同的是,原始套接字此時捕獲到的數(shù)據(jù)包并不僅僅是單純的數(shù)據(jù)信息,而是包含有 IP頭、 TCP頭等信息頭的最原始的數(shù)據(jù)信息,這些信息保留了它在網(wǎng)絡傳輸時的原貌。通過對這些在低層傳輸?shù)脑夹畔⒌姆治隹梢缘玫接嘘P(guān)網(wǎng)絡的一些信息。由于這些數(shù)據(jù)經(jīng)過了網(wǎng)絡層和傳輸層的打包,因此需要根據(jù)其附加的幀頭對數(shù)據(jù)包進行分析。下面先給出結(jié)構(gòu).數(shù)據(jù)包的總體結(jié)構(gòu):

數(shù)據(jù)包
 
IP頭 TCP頭(或其他信息頭) 數(shù)據(jù)

數(shù)據(jù)在從應用層到達傳輸層時,將添加TCP數(shù)據(jù)段頭,或是UDP數(shù)據(jù)段頭。其中UDP數(shù)據(jù)段頭比較簡單,由一個8字節(jié)的頭和數(shù)據(jù)部分組成,具體格式如下:

16位 16位
源端口 目的端口
UDP長度 UDP校驗和

而TCP數(shù)據(jù)頭則比較復雜,以20個固定字節(jié)開始,在固定頭后面還可以有一些長度不固定的可選項,下面給出TCP數(shù)據(jù)段頭的格式組成:

16位  16位
源端口 目的端口
順序號
確認號
TCP頭長 (保留)7位 URG ACK  PSH RST SYN FIN  窗口大小
校驗和  緊急指針
可選項(0或更多的32位字)
數(shù)據(jù)(可選項)

對于此TCP數(shù)據(jù)段頭的分析在編程實現(xiàn)中可通過數(shù)據(jù)結(jié)構(gòu)_TCP來定義:

typedef struct _TCP{ WORD SrcPort; // 源端口
WORD DstPort; // 目的端口
DWORD SeqNum; // 順序號
DWORD AckNum; // 確認號
BYTE DataOff; // TCP頭長
BYTE Flags; // 標志(URG、ACK等)
WORD Window; // 窗口大小
WORD Chksum; // 校驗和
WORD UrgPtr; // 緊急指針
} TCP;
typedef TCP *LPTCP;
typedef TCP UNALIGNED * ULPTCP;

在網(wǎng)絡層,還要給TCP數(shù)據(jù)包添加一個IP數(shù)據(jù)段頭以組成IP數(shù)據(jù)報。IP數(shù)據(jù)頭以大端點機次序傳送,從左到右,版本字段的高位字節(jié)先傳輸(SPARC是大端點機;Pentium是小端點機)。如果是小端點機,就要在發(fā)送和接收時先行轉(zhuǎn)換然后才能進行傳輸。IP數(shù)據(jù)段頭格式如下:

16位 16位
版本  IHL  服務類型 總長
標識  標志 分段偏移
生命期 協(xié)議  頭校驗和
源地址
目的地址
選項(0或更多)

同樣,在實際編程中也需要通過一個數(shù)據(jù)結(jié)構(gòu)來表示此IP數(shù)據(jù)段頭,下面給出此數(shù)據(jù)結(jié)構(gòu)的定義:

typedef struct _IP{
union{ BYTE Version; // 版本
BYTE HdrLen; // IHL
};
BYTE ServiceType; // 服務類型
WORD TotalLen; // 總長
WORD ID; // 標識
union{ WORD Flags; // 標志
WORD FragOff; // 分段偏移
};
BYTE TimeToLive; // 生命期
BYTE Protocol; // 協(xié)議
WORD HdrChksum; // 頭校驗和
DWORD SrcAddr; // 源地址
DWORD DstAddr; // 目的地址
BYTE Options; // 選項
} IP;
typedef IP * LPIP;
typedef IP UNALIGNED * ULPIP;

在明確了以上幾個數(shù)據(jù)段頭的組成結(jié)構(gòu)后,就可以對捕獲到的數(shù)據(jù)包進行分析了。

嗅探器的具體實現(xiàn)

根據(jù)前面的設(shè)計思路,不難寫出網(wǎng)絡嗅探器的實現(xiàn)代碼,下面就給出一個簡單的示例,該示例可以捕獲到所有經(jīng)過本地網(wǎng)卡的數(shù)據(jù)包,并可從中分析出協(xié)議、IP源地址、IP目標地址、TCP源端口號、TCP目標端口號以及數(shù)據(jù)包長度等信息。由于前面已經(jīng)將程序的設(shè)計流程講述的比較清楚了,因此這里就不在贅述了,下面就結(jié)合注釋對程序的具體是實現(xiàn)進行講解,同時為程序流程的清晰起見,去掉了錯誤檢查等保護性代碼。主要代碼實現(xiàn)清單為:

// 檢查 Winsock 版本號,WSAData為WSADATA結(jié)構(gòu)對象
WSAStartup(MAKEWORD(2, 2), &WSAData);
// 創(chuàng)建原始套接字
sock = socket(AF_INET, SOCK_RAW, IPPROTO_RAW));
// 設(shè)置IP頭操作選項,其中flag 設(shè)置為ture,親自對IP頭進行處理
setsockopt(sock, IPPROTO_IP, IP_HDRINCL, (char*)&flag, sizeof(flag));
// 獲取本機名
gethostname((char*)LocalName, sizeof(LocalName)-1);
// 獲取本地 IP 地址
pHost = gethostbyname((char*)LocalName));
// 填充SOCKADDR_IN結(jié)構(gòu)
addr_in.sin_addr = *(in_addr *)pHost->h_addr_list[0]; //IP
addr_in.sin_family = AF_INET;
addr_in.sin_port = htons(57274);
// 把原始套接字sock 綁定到本地網(wǎng)卡地址上
bind(sock, (PSOCKADDR)&addr_in, sizeof(addr_in));
// dwValue為輸入輸出參數(shù),為1時執(zhí)行,0時取消
DWORD dwValue = 1;
// 設(shè)置 SOCK_RAW 為SIO_RCVALL,以便接收所有的IP包。其中SIO_RCVALL
// 的定義為: #define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)
ioctlsocket(sock, SIO_RCVALL, &dwValue);

前面的工作基本上都是對原始套接字進行設(shè)置,在將原始套接字設(shè)置完畢,使其能按預期目的工作時,就可以通過recv()函數(shù)從網(wǎng)卡接收數(shù)據(jù)了,接收到的原始數(shù)據(jù)包存放在緩存RecvBuf[]中,緩沖區(qū)長度BUFFER_SIZE定義為65535。然后就可以根據(jù)前面對IP數(shù)據(jù)段頭、TCP數(shù)據(jù)段頭的結(jié)構(gòu)描述而對捕獲的數(shù)據(jù)包進行分析:

while (true)
{
// 接收原始數(shù)據(jù)包信息
int ret = recv(sock, RecvBuf, BUFFER_SIZE, 0);
if (ret > 0)
{
// 對數(shù)據(jù)包進行分析,并輸出分析結(jié)果
ip = *(IP*)RecvBuf;
tcp = *(TCP*)(RecvBuf + ip.HdrLen);
TRACE("協(xié)議: %s\r\n",GetProtocolTxt(ip.Protocol));
TRACE("IP源地址: %s\r\n",inet_ntoa(*(in_addr*)&ip.SrcAddr));
TRACE("IP目標地址: %s\r\n",inet_ntoa(*(in_addr*)&ip.DstAddr));
TRACE("TCP源端口號: %d\r\n",tcp.SrcPort);
TRACE("TCP目標端口號:%d\r\n",tcp.DstPort);
TRACE("數(shù)據(jù)包長度: %d\r\n\r\n\r\n",ntohs(ip.TotalLen));
}
}

其中,在進行協(xié)議分析時,使用了GetProtocolTxt()函數(shù),該函數(shù)負責將IP包中的協(xié)議(數(shù)字標識的)轉(zhuǎn)化為文字輸出,該函數(shù)實現(xiàn)如下:

#define PROTOCOL_STRING_ICMP_TXT "ICMP"
#define PROTOCOL_STRING_TCP_TXT "TCP"
#define PROTOCOL_STRING_UDP_TXT "UDP"
#define PROTOCOL_STRING_SPX_TXT "SPX"
#define PROTOCOL_STRING_NCP_TXT "NCP"
#define PROTOCOL_STRING_UNKNOW_TXT "UNKNOW"
……
CString CSnifferDlg::GetProtocolTxt(int Protocol)
{
switch (Protocol){
case IPPROTO_ICMP : //1 /* control message protocol */
return PROTOCOL_STRING_ICMP_TXT;
case IPPROTO_TCP : //6 /* tcp */
return PROTOCOL_STRING_TCP_TXT;
case IPPROTO_UDP : //17 /* user datagram protocol */
return PROTOCOL_STRING_UDP_TXT;
default:
return PROTOCOL_STRING_UNKNOW_TXT;
}

最后,為了使程序能成功編譯,需要包含頭文件winsock2.h和ws2tcpip.h。在本示例中將分析結(jié)果用TRACE()宏進行輸出,在調(diào)試狀態(tài)下運行,得到的一個分析結(jié)果如下:

協(xié)議: UDP
IP源地址: 172.168.1.5
IP目標地址: 172.168.1.255
TCP源端口號: 16707
TCP目標端口號:19522
數(shù)據(jù)包長度: 78
……
協(xié)議: TCP
IP源地址: 172.168.1.17
IP目標地址: 172.168.1.1
TCP源端口號: 19714
TCP目標端口號:10
數(shù)據(jù)包長度: 200
……

從分析結(jié)果可以看出,此程序完全具備了嗅探器的數(shù)據(jù)捕獲以及對數(shù)據(jù)包的分析等基本功能。

小結(jié)

本文介紹的以原始套接字方式對網(wǎng)絡數(shù)據(jù)進行捕獲的方法實現(xiàn)起來比較簡單,尤其是不需要編寫VxD虛擬設(shè)備驅(qū)動程序就可以實現(xiàn)抓包,使得其編寫過程變的非常簡便,但由于捕獲到的數(shù)據(jù)包頭不包含有幀信息,因此不能接收到與 IP 同屬網(wǎng)絡層的其它數(shù)據(jù)包, 如 ARP數(shù)據(jù)包、RARP數(shù)據(jù)包等。在前面給出的示例程序中考慮到安全因素,沒有對數(shù)據(jù)包做進一步的分析,而是僅僅給出了對一般信息的分析方法。通過本文的介紹,可對原始套接字的使用方法以及TCP/IP協(xié)議結(jié)構(gòu)原理等知識有一個基本的認識。本文所述代碼在Windows 2000下由Microsoft Visual C++ 6.0編譯調(diào)試通過。

責任編輯:Oo小孩兒 來源: pcdog.com
相關(guān)推薦

2014-07-09 09:43:59

2021-05-12 00:07:27

TCPIP協(xié)議

2021-07-15 09:57:39

Wireshark數(shù)據(jù)包長度

2011-01-12 19:31:54

IP FilterUnix數(shù)據(jù)包過濾器

2020-11-23 10:25:44

tcpdump數(shù)據(jù)包Linux

2011-11-28 16:03:49

wireshark數(shù)據(jù)包

2022-01-14 10:59:07

數(shù)據(jù)包tcpdump

2023-03-27 00:13:26

數(shù)據(jù)包Kubernete網(wǎng)絡

2021-05-26 08:01:25

數(shù)據(jù)包Scapy數(shù)據(jù)安全

2023-03-27 00:17:21

eBPF技術(shù)網(wǎng)絡

2019-08-21 05:48:06

TCPIP協(xié)議棧

2025-07-03 07:59:22

tcpdump網(wǎng)絡抓包網(wǎng)絡

2015-03-31 11:24:02

2019-03-28 13:34:22

IP TCP握手

2020-11-18 07:54:31

太網(wǎng)數(shù)據(jù)包架構(gòu)

2017-08-22 11:30:15

LinuxWireshark過濾數(shù)據(jù)包

2017-04-07 09:30:49

Linux網(wǎng)絡數(shù)據(jù)包

2019-04-29 07:53:11

TCP數(shù)據(jù)包TCP網(wǎng)絡編程

2012-12-04 09:54:33

路由器數(shù)據(jù)包TCP

2017-03-28 13:25:14

Linux網(wǎng)絡數(shù)據(jù)包
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产成人免费一区二区60岁 | 国产精品一区视频 | 久久国产婷婷国产香蕉 | 黄免费观看视频 | 久久夜视频 | 国产精品久久久久久久久久久久 | 亚洲国产中文在线 | 欧美日一区| 午夜资源 | 黄色中文字幕 | 99爱在线视频 | 蜜桃视频在线观看免费视频网站www | 男女免费视频网站 | 青青草在线播放 | 一区二区三区四区不卡视频 | 亚洲欧美中文日韩在线v日本 | 中文字幕第一页在线 | 日韩视频中文字幕 | 成人福利视频 | 国产98在线 | 免费, | 一区二区三区网站 | 午夜免费视频 | 亚洲视频免费观看 | av一区二区三区 | 欧美日韩国产一区二区三区不卡 | 在线国产一区 | 黄色一级大片在线免费看产 | 91精品国产乱码久久久久久久久 | 天天干天天爱天天操 | 日日噜噜噜夜夜爽爽狠狠视频97 | 国产精品毛片无码 | 欧美做暖暖视频 | 成人午夜免费视频 | 日本亚洲欧美 | 成人免费黄色片 | 久久久久久99 | 成人综合一区二区 | 我要看一级片 | 国产小视频精品 | 天天天插 | 日韩一区二区av |