计算机网络课程设计之网络嗅探器的设计与实现
前言
本實(shí)驗(yàn)難點(diǎn)是在于Windows下的raw socket有太多的限制,因此用winpcap編程功能更加強(qiáng)大,但是根據(jù)指導(dǎo)書(shū)要求要用原始套接字,原始套接字在Linux系統(tǒng)下也十分強(qiáng)大,結(jié)尾附上Linuxraw socket源碼 ,但是因?yàn)槲冶救讼胍獙⒄n設(shè)全部寫在同一個(gè)軟件中,只能查詢資料實(shí)現(xiàn)Windows。
參考博客 :(感謝大佬)
https://www.writebug.com/git/codes?owner=Schoolleave&repo=RawSocket_Test
不過(guò)需要指出的是,大佬的代碼對(duì)于TCP的解析是有問(wèn)題的,第一是TCP報(bào)文長(zhǎng)度,第二個(gè)是TCP數(shù)據(jù)部分的解析,由于課設(shè)時(shí)間和本人的能力有限,僅做了部分修改。再次感謝大佬的開(kāi)源!!!
白嫖容易,創(chuàng)作不易,本文原創(chuàng),轉(zhuǎn)載請(qǐng)注明!!!
源碼和可運(yùn)行程序:
鏈接:https://pan.baidu.com/s/1A9KctmpP2JJgyW2wLrehIg
提取碼:Lin2
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì):
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)之網(wǎng)絡(luò)聊天程序的設(shè)計(jì)與實(shí)現(xiàn)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)之Tracert與Ping程序設(shè)計(jì)與實(shí)現(xiàn)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)之基于 IP 多播的網(wǎng)絡(luò)會(huì)議程序
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)之網(wǎng)絡(luò)嗅探器的設(shè)計(jì)與實(shí)現(xiàn)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)之電子郵件客戶端程序設(shè)計(jì)與實(shí)現(xiàn)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)之TELNET 終端設(shè)計(jì)與實(shí)現(xiàn)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)之網(wǎng)絡(luò)代理服務(wù)器的設(shè)計(jì)與實(shí)現(xiàn)
計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)之簡(jiǎn)單 Web Server 程序的設(shè)計(jì)與實(shí)現(xiàn)
Qt入門系列:
Qt學(xué)習(xí)之C++基礎(chǔ)
Qt學(xué)習(xí)之Qt安裝
Qt學(xué)習(xí)之Qt基礎(chǔ)入門(上)
Qt學(xué)習(xí)之Qt基礎(chǔ)入門(中)
Qt學(xué)習(xí)之Qt基礎(chǔ)入門(下)
創(chuàng)作不易,整個(gè)課程設(shè)計(jì)程序3000多行代碼,所有實(shí)驗(yàn)都寫在了一個(gè)程序中,時(shí)間有限,能力不足,轉(zhuǎn)載望注明!!!
本文鏈接
個(gè)人博客:https://ronglin.fun/archives/270
PDF鏈接:見(jiàn)博客網(wǎng)站
CSDN: https://blog.csdn.net/RongLin02/article/details/122510398
實(shí)驗(yàn)題目
網(wǎng)絡(luò)嗅探器的設(shè)計(jì)與實(shí)現(xiàn)
實(shí)驗(yàn)?zāi)康?/h1>
參照附錄 4 raw socket 編程例子,設(shè)計(jì)一個(gè)可以監(jiān)視網(wǎng)絡(luò)的狀態(tài)、數(shù)據(jù)流動(dòng)情況以及網(wǎng)絡(luò)上傳輸?shù)男畔⒌木W(wǎng)絡(luò)嗅探器。
總體設(shè)計(jì)
(含背景知識(shí)或基本原理與算法、或模塊介紹、設(shè)計(jì)步驟等)
主要用到的是RawSocket
主要是思路是:
創(chuàng)建RawSocket套接字-> 綁定到對(duì)應(yīng)的網(wǎng)卡上 -> 設(shè)置混雜模式(為了抓到所有包) -> 調(diào)用recvfrom()接受數(shù)據(jù) ->解析數(shù)據(jù)
主要的難點(diǎn)是要根據(jù)抓到的數(shù)據(jù)報(bào)解析協(xié)議,然后根據(jù)不同的協(xié)議解析對(duì)應(yīng)的數(shù)據(jù),注意的是要根據(jù)不用的協(xié)議的不同的首部長(zhǎng)度來(lái)提取數(shù)據(jù)內(nèi)容
背景知識(shí)
原始套接字是一種不同于 SOCK_STREAM 和 SOCK_DGRAM 的套接字,它實(shí)現(xiàn)于系統(tǒng)核心。它的創(chuàng)建方式跟 TCP/UDP 創(chuàng)建方法幾乎是一模一樣,例如,通過(guò)
這兩句程序你就可以創(chuàng)建一個(gè)原始套接字。這種類型套接字的功能與 TCP 或者 UDP 類型套接字的功能有很大的不同:TCP/UDP 類型的套接字只能夠訪問(wèn)傳輸層以及傳輸層以上的數(shù)據(jù),因?yàn)楫?dāng) IP層把數(shù)據(jù)傳遞給傳輸層時(shí),下層的數(shù)據(jù)包頭已經(jīng)被丟掉了。而原始套接字卻可以訪問(wèn)傳輸層以下的數(shù)據(jù),所以使用 raw 套接字你可以實(shí)現(xiàn)上至應(yīng)用層的數(shù)據(jù)操作,也可以實(shí)現(xiàn)下至鏈路層的數(shù)據(jù)操作。比如:通過(guò)
sock=socket(PF_PACKET,SOCK_RAW,htons(ETH_P_IP))方式創(chuàng)建的 rawsocket 就能直接讀取鏈路層的數(shù)據(jù)。
1)使用原始套接字時(shí)應(yīng)該注意的問(wèn)題(參考<<unix 網(wǎng)絡(luò)編程>>以及網(wǎng)上的優(yōu)秀文檔)
(1):對(duì)于 UDP/TCP 產(chǎn)生的 IP 數(shù)據(jù)包,內(nèi)核不將它傳遞給任何原始套接字,而只是將這些數(shù)據(jù)交給對(duì)應(yīng)的 UDP/TCP 數(shù)據(jù)處理句柄(所以,如果你想要通過(guò)原始套接字來(lái)訪問(wèn) TCP/UDP 或者其它類型的數(shù)據(jù),調(diào)用 socket 函數(shù)創(chuàng)建原始套接字第三個(gè)參數(shù)應(yīng)該指定為 htons(ETH_P_IP),也就是通過(guò)直接訪問(wèn)數(shù)據(jù)鏈路層來(lái)實(shí)現(xiàn)。(我們后面的密碼竊取器就是基于這種類型的)。
(2):對(duì)于 ICMP 和 EGP 等使用 IP 數(shù)據(jù)包承載數(shù)據(jù)但又在傳輸層之下的協(xié)議類型的 IP 數(shù)據(jù)包,內(nèi)核不管是否已經(jīng)有注冊(cè)了的句柄來(lái)處理這些數(shù)據(jù),都會(huì)將這些 IP 數(shù)據(jù)包復(fù)制一份傳遞給協(xié)議類型匹配的原始套接字。
(3):對(duì)于不能識(shí)別協(xié)議類型的數(shù)據(jù)包,內(nèi)核進(jìn)行必要的校驗(yàn),然后會(huì)查看是否有類型匹配的原始套接字負(fù)責(zé)處理這些數(shù)據(jù),如果有的話,就會(huì)將這些 IP 數(shù)據(jù)包復(fù)制一份傳遞給匹配的原始套接字,否則,內(nèi)核將會(huì)丟棄這個(gè) IP 數(shù)據(jù)包,并返回一個(gè) ICMP 主機(jī)不可達(dá)的消息給源主機(jī)。
(4):如果原始套接字 bind 綁定了一個(gè)地址,核心只將目的地址為本機(jī) IP 地址的數(shù)據(jù)包傳遞給原始套接字,如果某個(gè)原始套接字沒(méi)有 bind 地址,核心就會(huì)把收到的所有 IP 數(shù)據(jù)包發(fā)給這個(gè)原始套接字。
(5):如果原始套接字調(diào)用了 connect 函數(shù),則核心只將源地址為 connect 連接的 IP 地址的 IP 數(shù)據(jù)包傳遞給這個(gè)原始套接字。
(6):如果原始套接字沒(méi)有調(diào)用 bind 和 connect 函數(shù),則核心會(huì)將所有協(xié)議匹配的 IP 數(shù)據(jù)包傳遞給這個(gè)原始套接字。
2. 編程選項(xiàng)
原始套接字是直接使用 IP 協(xié)議的非面向連接的套接字,在這個(gè)套接字上可以調(diào)用 bind 和 connect函數(shù)進(jìn)行地址綁定。說(shuō)明如下:
(1)bind 函數(shù):調(diào)用 bind 函數(shù)后,發(fā)送數(shù)據(jù)包的源 IP 地址將是 bind 函數(shù)指定的地址。如果不調(diào)用bind,則內(nèi)核將以發(fā)送接口的主IP地址填充IP頭 。 如 果 使 用 setsockopt 設(shè)置了IP_HDRINCL(headerincluding)選項(xiàng),就必須手工填充每個(gè)要發(fā)送的數(shù)據(jù)包的源 IP 地址,否則,內(nèi)核將
自動(dòng)創(chuàng)建 IP 首部。
(2)connetc 函數(shù):調(diào)用 connect 函數(shù)后,就可以使用 write 和 send 函數(shù)來(lái)發(fā)送數(shù)據(jù)包,而且內(nèi)核將會(huì)用這個(gè)綁定的地址填充 IP 數(shù)據(jù)包的目的 IP 地址,否則的話,則應(yīng)使用 sendto 或 sendmsg 函數(shù)來(lái)發(fā)送數(shù)據(jù)包,并且要在函數(shù)參數(shù)中指定對(duì)方的 IP 地址。
綜合以上種種功能和特點(diǎn),我們可以使用原始套接字來(lái)實(shí)現(xiàn)很多功能,比如最基本的數(shù)據(jù)包分析,主機(jī)嗅探等。其實(shí)也可以使用原始套接字作一個(gè)自定義的傳輸層協(xié)議
詳細(xì)設(shè)計(jì)
(含主要的數(shù)據(jù)結(jié)構(gòu)、程序流程圖、關(guān)鍵代碼等)
核心的功能方法主要有兩個(gè)
1.轉(zhuǎn)化結(jié)果
此方法是用來(lái)將一個(gè)字節(jié)數(shù)組轉(zhuǎn)化為一個(gè)可輸出的字符串,int iPrintType有兩個(gè)參數(shù),一個(gè)是按照16進(jìn)制輸出,還有一個(gè)是按照ASCII碼輸出。
前者用到的主要解析代碼如下
主要是用系統(tǒng)的格式化輸出到字符串中,用到%x輸出
后者解析ASCII碼用的是強(qiáng)制類型轉(zhuǎn)化,如下
這個(gè)方法是核心,當(dāng)然主要是參考了大佬的解析代碼,下邊進(jìn)行簡(jiǎn)單的說(shuō)明
主要流程有兩個(gè),一個(gè)是先分析IP包的協(xié)議類型,第二個(gè)是根據(jù)協(xié)議類型分析首部和數(shù)據(jù)部分,代碼如下:
需要注意的是,數(shù)據(jù)報(bào)的格式定義在了一個(gè)packetstruct.h的文件中,其中定義了IPV4、IPV6、ARP字段結(jié)構(gòu)體、以太網(wǎng)幀頭格式結(jié)構(gòu)體、TCP、UDP的結(jié)構(gòu)體
實(shí)驗(yàn)結(jié)果與分析
點(diǎn)擊保存到文件,然后把數(shù)據(jù)保存到,軟件運(yùn)行路徑下
打開(kāi)txt文件,可以看到數(shù)據(jù)格式
可以注意到,TCP格式的解析有問(wèn)題,UDP的首部是固定8字節(jié),解析起來(lái)就比較簡(jiǎn)單,所以沒(méi)啥問(wèn)題,但是TCP首部復(fù)雜,問(wèn)題主要出現(xiàn)在長(zhǎng)度解析和內(nèi)容解析,精力有限,如果還有時(shí)間就再次深入的修改一下代碼。
根據(jù)TCP首部,做了部分修改
小結(jié)與心得體會(huì)
通常我們都是使用類似WireShark的抓包軟件嗅探數(shù)據(jù)包,這些抓包工具大部分都是基于WinPcap庫(kù)實(shí)現(xiàn)的數(shù)據(jù)包嗅探功能。而現(xiàn)在,本實(shí)驗(yàn)是使用原始套接字的RawSocket方式實(shí)現(xiàn)數(shù)據(jù)包的嗅探。當(dāng)然,和WinPcap相比,Raw Socket有很大的局限性。,它只能抓到IP層及以上的數(shù)據(jù)包,抓不到MAC層的數(shù)據(jù)包。而且還需要管理員權(quán)限,但是本次實(shí)驗(yàn)對(duì)于TCP/UDP的數(shù)據(jù)格式有了很深的理解,獲益匪淺。
=w=
總結(jié)
以上是生活随笔為你收集整理的计算机网络课程设计之网络嗅探器的设计与实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: RTX5 | 消息队列02 - 放入与取
- 下一篇: windowswps怎么以文件形式发送_