![網(wǎng)絡(luò)課設(shè)-端口掃描與抓包分析報告_第1頁](http://file4.renrendoc.com/view/53b14ff1a49ea654f9a405cab7c622f1/53b14ff1a49ea654f9a405cab7c622f11.gif)
![網(wǎng)絡(luò)課設(shè)-端口掃描與抓包分析報告_第2頁](http://file4.renrendoc.com/view/53b14ff1a49ea654f9a405cab7c622f1/53b14ff1a49ea654f9a405cab7c622f12.gif)
![網(wǎng)絡(luò)課設(shè)-端口掃描與抓包分析報告_第3頁](http://file4.renrendoc.com/view/53b14ff1a49ea654f9a405cab7c622f1/53b14ff1a49ea654f9a405cab7c622f13.gif)
![網(wǎng)絡(luò)課設(shè)-端口掃描與抓包分析報告_第4頁](http://file4.renrendoc.com/view/53b14ff1a49ea654f9a405cab7c622f1/53b14ff1a49ea654f9a405cab7c622f14.gif)
![網(wǎng)絡(luò)課設(shè)-端口掃描與抓包分析報告_第5頁](http://file4.renrendoc.com/view/53b14ff1a49ea654f9a405cab7c622f1/53b14ff1a49ea654f9a405cab7c622f15.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
網(wǎng)絡(luò)課設(shè)CENTRALSOUTHUNIVERSITY計算機(jī)網(wǎng)絡(luò)課程設(shè)計報告題目端口檢測與數(shù)據(jù)包捕獲解析學(xué)生姓名班級學(xué)號指導(dǎo)教師劉麗敏設(shè)計時間2015年9月目錄CENTRALSOUTHUNIVERSITY 1第一章設(shè)計目的、任務(wù)與要求 31.1設(shè)計的目的 31.2設(shè)計的任務(wù)與要求 3第二章系統(tǒng)總體分析設(shè)計 42.1總體需求分析 42.2實(shí)驗(yàn)環(huán)境 4第三章端口掃描模塊分析設(shè)計 43.1端口的基本概念 43.2常見端口了解 53.3掃描端口的基本原理 63.4掃描端口的常用技術(shù) 63.5功能設(shè)計與流程圖 8第四章端口掃描模塊實(shí)現(xiàn) 84.1輸入要掃描的網(wǎng)段并將其排序 84.2ScanIP掃描 94.3清理結(jié)束后進(jìn)程 104.4輸出結(jié)果 104.5計算時間 11第五章抓包模塊分析設(shè)計 115.1IP包知識 115.2功能設(shè)計與流程圖 14第六章抓包模塊實(shí)現(xiàn) 166.1數(shù)據(jù)結(jié)構(gòu)的定義 166.2初始化工作 176.3套接字的創(chuàng)建和設(shè)置 186.4數(shù)據(jù)包的捕獲與分析 196.5信息的輸出 20第七章程序運(yùn)行結(jié)果與分析 21第八章心得體會 26參考文獻(xiàn) 27附錄程序源代碼 28第一章設(shè)計目的、任務(wù)與要求 1.1設(shè)計的目的現(xiàn)今,計算機(jī)網(wǎng)絡(luò)已經(jīng)徹徹底底地改變了人們的生活。大量的數(shù)據(jù)都是經(jīng)過計算機(jī)網(wǎng)絡(luò)傳輸?shù)?,而TCP/IP協(xié)議是計算機(jī)網(wǎng)絡(luò)中最重要的協(xié)議之一。計算機(jī)網(wǎng)絡(luò)中絕大多數(shù)數(shù)據(jù)都是以IP數(shù)據(jù)包的形式發(fā)送和接受的。所以IP數(shù)據(jù)包的捕獲是很多計算機(jī)安全技術(shù)的基礎(chǔ)。在本次課程實(shí)際中,通過編程實(shí)現(xiàn)網(wǎng)卡截取標(biāo)準(zhǔn)IP包,并解析IP數(shù)據(jù)包,以了解IP包結(jié)構(gòu)中各個字段的含義與用途,更好掌握網(wǎng)絡(luò)層的基本原理,這是第一點(diǎn)。本課程設(shè)計的另一個目的是運(yùn)用漏洞、端口的基礎(chǔ)知識,設(shè)計并實(shí)現(xiàn)一個網(wǎng)絡(luò)掃描器,它通過與目標(biāo)主機(jī)TCP/IP端口建立連接并請求某些服務(wù),記錄目標(biāo)主機(jī)的應(yīng)答,分析目標(biāo)主機(jī)相關(guān)信息,從而發(fā)現(xiàn)目標(biāo)主機(jī)某些內(nèi)在的安全弱點(diǎn)。1.2設(shè)計的任務(wù)與要求本次實(shí)驗(yàn)的要求在網(wǎng)絡(luò)環(huán)境,實(shí)現(xiàn)端口檢測以及捕獲網(wǎng)絡(luò)中的IP數(shù)據(jù)包,解析數(shù)據(jù)包的內(nèi)容,將結(jié)果顯示在標(biāo)準(zhǔn)輸出上,并同時寫入日志文件。程序的具體要求如下:l)實(shí)現(xiàn)本機(jī)以及局域網(wǎng)內(nèi)計算機(jī)的端口監(jiān)控。2)在標(biāo)準(zhǔn)輸出和日志文件中寫入捕獲的IP包的版本、頭長度、服務(wù)類型、數(shù)據(jù)包總長度、數(shù)據(jù)包標(biāo)識、分段標(biāo)志、分段偏移值、生存時間、上層協(xié)議類型、頭校驗(yàn)和、源IP地址和目的IP地址等內(nèi)容。3)形成記錄結(jié)果的日志文件。第二章系統(tǒng)總體分析設(shè)計2.1總體需求分析可以將本實(shí)驗(yàn)分為兩個獨(dú)立的模塊來解決,具體兩個模塊的設(shè)計實(shí)現(xiàn)在后面單獨(dú)章節(jié)里詳述,從總體而言,可以設(shè)計一個界面,將兩個功能整合到一起,然后讓用戶選擇所要實(shí)驗(yàn)的功能。而對于掃描本機(jī)端口,用自己寫的端口掃描器也可以完成,但速度較cmd指令慢,所以將其單獨(dú)出來作為一項(xiàng)功能。其中,cmd中查本機(jī)端口號指令為netstat–no。總體系統(tǒng)功能如下圖:2.2實(shí)驗(yàn)環(huán)境本實(shí)驗(yàn)采用Windows操作系統(tǒng)平臺,利用Windows提供的WindowsSocketsAPI實(shí)現(xiàn)IP數(shù)據(jù)包的捕獲與分析。采用WinSock2.2版本,編程語言選用C++,編程開發(fā)采用Code::Blocks13.12。第三章端口掃描模塊分析設(shè)計3.1端口的基本概念我們這里所說的端口,不是計算機(jī)硬件的i/o端口,而是軟件形式上的概念。服務(wù)器可以向外提供多種服務(wù),比如,一臺服務(wù)器可以同時是web服務(wù)器,也可以是ftp服務(wù)器,同時,它也可以是郵件服務(wù)器。為什么一臺服務(wù)器可以同時提供那么多的服務(wù)呢?其中一個很主要的方面,就是各種服務(wù)采用不同的端口分別提供不同的服務(wù)。根據(jù)提供服務(wù)類型的不同,端口分為兩種,一種是TCP端口,一種是UDP端口。計算機(jī)之間相互通信的時候,分為兩種方式:一種是發(fā)送信息以后,可以確認(rèn)信息是否到達(dá),也就是有應(yīng)答的方式,這種方式大多采用TCP協(xié)議;一種是發(fā)送以后就不管了,不去確認(rèn)信息是否到達(dá),這種方式大多采用UDP協(xié)議。對應(yīng)這兩種協(xié)議的服務(wù)提供的端口,也就分為TCP端口和UDP端口。那么,如果攻擊者使用軟件掃描目標(biāo)計算機(jī),得到目標(biāo)計算機(jī)打開的端口,也就了解了目標(biāo)計算機(jī)提供了那些服務(wù)。3.2常見端口了解端口是一個16bit的地址,用端口號進(jìn)行標(biāo)識不同作用的端口。端口一般分為兩類。熟知端口號:范圍從0到1023,這些端口號一般固定的分配給一些服務(wù),所以,這些端口分別對應(yīng)哪些服務(wù)也是我們要關(guān)注的,以下是一些常見的熟知端口號的介紹:1)端口:21服務(wù):FTP
說明:FTP服務(wù)器所開放的端口,用于上傳、下載。最常見的攻擊者用于尋找打開anonymous的FTP服務(wù)器的方法。這些服務(wù)器帶有可讀寫的目錄。木馬DolyTrojan、Fore、InvisibleFTP、WebEx、WinCrash和BladeRunner所開放的端口。
2)端口:23服務(wù):Telnet
說明:遠(yuǎn)程登錄,入侵者在搜索遠(yuǎn)程登錄UNIX的服務(wù)。大多數(shù)情況下掃描這一端口是為了找到機(jī)器運(yùn)行的*作系統(tǒng)。還有使用其他技術(shù),入侵者也會找到密碼。木馬TinyTelnetServer就開放這個端口3)端口:25服務(wù):SMTP
說明:SMTP服務(wù)器所開放的端口,用于發(fā)送郵件。入侵者尋找SMTP服務(wù)器是為了傳遞他們的SPAM。入侵者的帳戶被關(guān)閉,他們需要連接到高帶寬的E-MAIL服務(wù)器上,將簡單的信息傳遞到不同的地址。木馬Antigen、EmailPasswordSender、HaebuCoceda、ShtrilitzStealth、WinPC、WinSpy都開放這個端口4)端口:80服務(wù):HTTP
說明:用于網(wǎng)頁瀏覽。木馬Executor開放此端口。動態(tài)端口號:動態(tài)端口的范圍從1024到65535,這些端口號一般不固定的分配給某個服務(wù),也就是說許多服務(wù)都可以使用這些端口。只要運(yùn)行的程序向系統(tǒng)提出訪問網(wǎng)絡(luò)的申請,那么系統(tǒng)就可以從這些端口號中分配一個供該程序使用。比如8080端口就是分配給第一個向系統(tǒng)發(fā)出申請的程序。在關(guān)閉程序進(jìn)程后,就會釋放所占用的端口號。3.3掃描端口的基本原理端口分為源端口和目的端口,源端口是本機(jī)打開的,目的端口是在和本機(jī)通信的另一臺計算機(jī)的端口。端口是由計算機(jī)的通信協(xié)議TCP/IP協(xié)議定義的。其中規(guī)定,用IP地址和端口作為套接字,它代表TCP連接的一個連接端,一般稱為Socket。具體來說,就是用IP端口來定位一臺主機(jī)中的進(jìn)程??梢宰鲞@樣的比喻,端口相當(dāng)于兩臺計算機(jī)進(jìn)程間的大門,可以隨便定義,其目的只是為了讓兩臺計算機(jī)能夠找到對方的進(jìn)程。計算機(jī)就像一座大樓,這個大樓有好多入口(端口),進(jìn)到不同的入口中就可以找到不同的公司(進(jìn)程)。如果要和遠(yuǎn)程主機(jī)A的程序通信,那么只要把數(shù)據(jù)發(fā)向A端口就可以實(shí)現(xiàn)通信了。可見,端口與進(jìn)程是一一對應(yīng)的,如果某個進(jìn)程正在等待連接,稱之為該進(jìn)程正在監(jiān)聽,那么就會出現(xiàn)與它相對應(yīng)的端口。由此可見,通過掃描端口,便可以判斷出目標(biāo)計算機(jī)有哪些通信進(jìn)程正在等待連接。服務(wù)器上所開放的端口就是潛在的通信通道,也就是一個入侵通道。對目標(biāo)計算機(jī)進(jìn)行端口掃描[5],能得到許多有用的信息,進(jìn)行端口掃描的方法很多,可以是手工進(jìn)行掃描、也可以用端口掃描軟件進(jìn)行。掃描器通過選用遠(yuǎn)程TCP/IP不同的端口的服務(wù),并記錄目標(biāo)給予的回答,通過這種方法可以搜集到很多關(guān)于目標(biāo)主機(jī)的各種有用的信息,例如遠(yuǎn)程系統(tǒng)是否支持匿名登陸、是否存在可寫的FTP目錄、是否開放TELNET服務(wù)和HTTPD服務(wù)等。3.4掃描端口的常用技術(shù)1、TCPconnect()掃描:
這是最基本的TCP掃描,操作系統(tǒng)提供的connect()系統(tǒng)調(diào)用可以用來與每一個感興趣的目標(biāo)計算機(jī)的端口進(jìn)行連接。如果端口處于偵聽狀態(tài),那么connect()就能成功。否則,這個端口是不能用的,即沒有提供服務(wù)。這個技術(shù)的一個最大的優(yōu)點(diǎn)是,你不需要任何權(quán)限。系統(tǒng)中的任何用戶都有權(quán)利使用這個調(diào)用。另一個好處就是速度,如果對每個目標(biāo)端口以線性的方式,使用單獨(dú)的connect()調(diào)用,那么將會花費(fèi)相當(dāng)長的時間,使用者可以通過同時打開多個套接字來加速掃描。使用非阻塞I/O允許你設(shè)置一個低的時間用盡周期,同時觀察多個套接字。但這種方法的缺點(diǎn)是很容易被察覺,并且被防火墻將掃描信息包過濾掉。目標(biāo)計算機(jī)的logs文件會顯示一連串的連接和連接出錯消息,并且能很快使它關(guān)閉。
2、TCPSYN掃描:
這種技術(shù)通常認(rèn)為是“半開放”掃描,這是因?yàn)閽呙璩绦虿槐匾蜷_一個完全的TCP連接。掃描程序發(fā)送的是一個SYN數(shù)據(jù)包,好象準(zhǔn)備打開一個實(shí)際的連接并等待反應(yīng)一樣(參考TCP的三次握手建立一個TCP連接的過程)。一個SYN|ACK的返回信息表示端口處于偵聽狀態(tài):返回RST表示端口沒有處于偵聽?wèi)B(tài)。如果收到一個SYN|ACK,則掃描程序必須再發(fā)送一個RST信號,來關(guān)閉這個連接過程。這種掃描技術(shù)的優(yōu)點(diǎn)在于一般不會在目標(biāo)計算機(jī)上留下記錄,但這種方法的缺點(diǎn)是必須要有root權(quán)限才能建立自己的SYN數(shù)據(jù)包。
3、TCPFIN掃描:
SYN掃描雖然是“半開放”方式掃描,但在某些時候也不能完全隱藏掃描者的動作,防火墻和包過濾器會對管理員指定的端口進(jìn)行監(jiān)視,有的程序能檢測到這些掃描。相反,F(xiàn)IN數(shù)據(jù)包在掃描過程中卻不會遇到過多問題,這種掃描方法的思想是關(guān)閉的端口會用適當(dāng)?shù)腞ST來回復(fù)FIN數(shù)據(jù)包。另一方面,打開的端口會忽略對FIN數(shù)據(jù)包的回復(fù)。這種方法和系統(tǒng)的實(shí)現(xiàn)有一定的關(guān)系,有的系統(tǒng)不管端口是否打開都會回復(fù)RST,在這種情況下此種掃描就不適用了。另外這種掃描方法可以非常容易的區(qū)分服務(wù)器是運(yùn)行Unix系統(tǒng)還是NT系統(tǒng)。
4、IP段掃描:
這種掃描方式并不是新技術(shù),它并不是直接發(fā)送TCP探測數(shù)據(jù)包,而是將數(shù)據(jù)包分成兩個較小的IP段。這樣就將一個TCP頭分成好幾個數(shù)據(jù)包,從而過濾器就很難探測到。但必須小心:一些程序在處理這些小數(shù)據(jù)包時會有些麻煩。
5、TCP反向ident掃描:
ident協(xié)議允許(rfc1413)看到通過TCP連接的任何進(jìn)程的擁有者的用戶名,即使這個連接不是由這個進(jìn)程開始的。例如掃描者可以連接到http端口,然后用identd來發(fā)現(xiàn)服務(wù)器是否正在以root權(quán)限運(yùn)行。這種方法只能在和目標(biāo)端口建立了一個完整的TCP連接后才能看到。
6、FTP返回攻擊:
FTP協(xié)議的一個有趣的特點(diǎn)是它支持代理(proxy)FTP連接,即入侵者可以從自己的計算機(jī)和目標(biāo)主機(jī)的FTPserver-PI(協(xié)議解釋器)連接,建立一個控制通信連接。然后請求這個server-PI激活一個有效的server-DTP(數(shù)據(jù)傳輸進(jìn)程)來給Internet上任何地方發(fā)送文件。對于一個User-DTP,盡管RFC明確地定義請求一個服務(wù)器發(fā)送文件到另一個服務(wù)器是可以的,但現(xiàn)在這個方法并不是非常有效。這個協(xié)議的缺點(diǎn)是“能用來發(fā)送不能跟蹤的郵件和新聞,給許多服務(wù)器造成打擊,用盡磁盤,企圖越過防火墻”。3.5功能設(shè)計與流程圖第四章端口掃描模塊實(shí)現(xiàn)4.1輸入要掃描的網(wǎng)段并將其排序//功能:輸入一個IP段,輸出該IP段內(nèi)的端口開放情況信息intScanIp(conststring&start_Ip,conststring&endIp,multimap<unsignedlong,string>&ouputMap){//分解IP段內(nèi)的IP到全局?jǐn)?shù)組中去GetIpToScan(start_Ip,endIp,g_vec_IpToScan);intscanNum=g_vec_IpToScan.size();//線程總數(shù)g_runThreadNum=scanNum;cout<<endl;cout<<endl;cout<<"********************************************************************************";cout<<"共有"<<scanNum<<"個IP要掃描"<<endl;//對每個IP開一個線程for(inti=0;i<scanNum;++i){CreateThread(NULL,0,ThreadFunc,&g_vec_IpToScan[i],0,NULL);//要是不間隔時間的話,同時創(chuàng)建socket會出現(xiàn)10093錯誤Sleep(50);}return0;}4.2ScanIP掃描建立多個線程,每個線程掃描一個ip。每個線程內(nèi)先建立數(shù)據(jù)流套接字,然后綁定ip端口進(jìn)行掃描。將掃描端口保存到g_map_ScanResult。//保存IP掃描的結(jié)果multimap<unsignedlong,string>g_map_ScanResult;//線程函數(shù),掃描每一個IPDWORDWINAPIThreadFunc(LPVOIDth_para){//獲取需要掃描的IP//char*pStrIp=(char*)th_para;unsignedlongulScanIp=*(unsignedlong*)th_para;intindex=0;//端口索引SOCKETlink_sock;//SOCKETFD_SETset_flag;//SOCKET描述shortselect_ret;//select異步返回值shortport;//正在掃描的端口while(index<PORTSNUM){port=g_portsTOscan[index];//創(chuàng)建數(shù)據(jù)流套接字link_sock=socket(AF_INET,SOCK_STREAM,0);if(link_sock==INVALID_SOCKET)//cout<<"創(chuàng)建link_socksocket失敗:錯誤號為:"<<GetLastError()<<endl;WaitForSingleObject(g_ThreadNumMutex,INFINITE);g_runThreadNum--;ReleaseMutex(g_ThreadNumMutex);//cout<<"***還有_"<<g_runThreadNum<<"_個掃描線程進(jìn)行中**"<<endl;return-1;}4.3清理結(jié)束后進(jìn)程//清理voidCleanProc(){//線程都執(zhí)行完后清理socket相關(guān)信息while(1){WaitForSingleObject(g_ThreadNumMutex,INFINITE);if(g_runThreadNum==0){break;}ReleaseMutex(g_ThreadNumMutex);Sleep(100);}//清理socket相關(guān)信息WSACleanup();}4.4輸出結(jié)果//輸出掃描結(jié)果intOutPutScanInfo(){ cout<<"掃描到"<<g_map_ScanResult.size()<<"條記錄"<<endl;multimap<unsignedlong,string>::iteratoriter=g_map_ScanResult.begin();ofstreamout("out.txt");cout<<"顯示總"<<g_map_ScanResult.size()<<"條記錄"<<endl; cout<<endl;for(;iter!=g_map_ScanResult.end();++iter){out<<iter->second<<endl;cout<<iter->second<<endl;}return0;}4.5計算時間//計算程序運(yùn)行時間end_time=clock();cost_time=(double)(end_time-start_time)/CLOCKS_PER_SEC;cout<<"使用時間為:"<<cost_time<<"秒"<<endl;第五章抓包模塊分析設(shè)計 5.1IP包知識要能捕獲并解析IP數(shù)據(jù)包,首先要了解IP數(shù)據(jù)包的格式?;ヂ?lián)網(wǎng)絡(luò)層是TCP/IP協(xié)議參考模型中的關(guān)鍵部分。IP協(xié)議把傳輸層送來的消息組裝成IP數(shù)據(jù)包,并把IP數(shù)據(jù)包傳送給數(shù)據(jù)鏈層。IP協(xié)議在TCP/IP協(xié)議族中處于核心地位,IP協(xié)議制定了統(tǒng)一的IP數(shù)據(jù)包格式,以消除個通信子網(wǎng)中的差異,從而為信息發(fā)送方和接收方提供了透明的傳輸通道。所以編制本程序前,首先要對IP包的格式有一定了解。下圖給出了IP協(xié)議的數(shù)據(jù)包格式:.IP數(shù)據(jù)包由首部和數(shù)據(jù)兩部分組成。首部的前一部分是固定長度,共20字節(jié),是所有IP數(shù)據(jù)報必須具有的。在首部的固定部分的后面是一些可選字段,其長度是可變的,可選字段之后是數(shù)據(jù)部分。其中,首部固定部分中的各字段的長度及意義如下:(1)版本占4位,指IP協(xié)議的版本。通信雙方使用的IP協(xié)議版本必須一致。目前廣泛使用的IP協(xié)議版本號為4(即IPv4)。關(guān)于IPv6,目前還處于草案階段。(2)首部長度占4位,可表示的最大十進(jìn)制數(shù)值是15。請注意,這個字段所表示數(shù)的單位是32位字長(1個32位字長是4字節(jié)),因此,當(dāng)IP的首部長度為1111時(即十進(jìn)制的15),首部長度就達(dá)到60字節(jié)。當(dāng)IP分組的首部長度不是4字節(jié)的整數(shù)倍時,必須利用最后的填充字段加以填充。因此數(shù)據(jù)部分永遠(yuǎn)在4字節(jié)的整數(shù)倍開始,這樣在實(shí)現(xiàn)IP協(xié)議時較為方便。首部長度限制為60字節(jié)的缺點(diǎn)是有時可能不夠用。但這樣做是希望用戶盡量減少開銷。最常用的首部長度就是20字節(jié)(即首部長度為0101),這時不使用任何選項(xiàng)。(3)區(qū)分服務(wù)占8位,用來獲得更好的服務(wù)。這個字段在舊標(biāo)準(zhǔn)中叫做服務(wù)類型,但實(shí)際上一直沒有被使用過。1998年IETF把這個字段改名為區(qū)分服務(wù)DS(DifferentiatedServices)。只有在使用區(qū)分服務(wù)時,這個字段才起作用。(4)總長度總長度指首部和數(shù)據(jù)之和的長度,單位為字節(jié)??傞L度字段為16位,因此數(shù)據(jù)報的最大長度為2^16-1=65535字節(jié)。在IP層下面的每一種數(shù)據(jù)鏈路層都有自己的幀格式,其中包括幀格式中的數(shù)據(jù)字段的最大長度,這稱為最大傳送單元MTU(MaximumTransferUnit)。當(dāng)一個數(shù)據(jù)報封裝成鏈路層的幀時,此數(shù)據(jù)報的總長度(即首部加上數(shù)據(jù)部分)一定不能超過下面的數(shù)據(jù)鏈路層的MTU值。(5)標(biāo)識(identification)占16位。IP軟件在存儲器中維持一個計數(shù)器,每產(chǎn)生一個數(shù)據(jù)報,計數(shù)器就加1,并將此值賦給標(biāo)識字段。但這個“標(biāo)識”并不是序號,因?yàn)镮P是無連接服務(wù),數(shù)據(jù)報不存在按序接收的問題。當(dāng)數(shù)據(jù)報由于長度超過網(wǎng)絡(luò)的MTU而必須分片時,這個標(biāo)識字段的值就被復(fù)制到所有的數(shù)據(jù)報的標(biāo)識字段中。相同的標(biāo)識字段的值使分片后的各數(shù)據(jù)報片最后能正確地重裝,成為原來的數(shù)據(jù)報。(6)標(biāo)志(flag)占3位,但目前只有2位有意義。標(biāo)志字段中的最低位記為MF(MoreFragment)。MF=1即表示后面“還有分片”的數(shù)據(jù)報。MF=0表示這已是若干數(shù)據(jù)報片中的最后一個。標(biāo)志字段中間的一位記為DF(Don’tFragment),意思是“不能分片”。只有當(dāng)DF=0時才允許分片。(7)片偏移占13位。片偏移指出:較長的分組在分片后,某片在原分組中的相對位置。也就是說,相對用戶數(shù)據(jù)字段的起點(diǎn),該片從何處開始。片偏移以8個字節(jié)為偏移單位。這就是說,每個分片的長度一定是8字節(jié)(64位)的整數(shù)倍。(8)生存時間占8位,生存時間字段常用的的英文縮寫是TTL(TimeToLive),表明是數(shù)據(jù)報在網(wǎng)絡(luò)中的壽命。由發(fā)出數(shù)據(jù)報的源點(diǎn)設(shè)置這個字段。其目的是防止無法交付的數(shù)據(jù)報無限制地在因特網(wǎng)中兜圈子,因而白白消耗網(wǎng)絡(luò)資源。最初的設(shè)計是以秒作為TTL的單位。每經(jīng)過一個路由器時,就把TTL減去數(shù)據(jù)報在路由器消耗掉的一段時間。若數(shù)據(jù)報在路由器消耗的時間小于1秒,就把TTL值減1。當(dāng)TTL值為0時,就丟棄這個數(shù)據(jù)報。后來把TTL字段的功能改為“跳數(shù)限制”(但名稱不變)。路由器在轉(zhuǎn)發(fā)數(shù)據(jù)報之前就把TTL值減1.若TTL值減少到零,就丟棄這個數(shù)據(jù)報,不再轉(zhuǎn)發(fā)。因此,現(xiàn)在TTL的單位不再是秒,而是跳數(shù)。TTL的意義是指明數(shù)據(jù)報在網(wǎng)絡(luò)中至多可經(jīng)過多少個路由器。顯然,數(shù)據(jù)報在網(wǎng)絡(luò)上經(jīng)過的路由器的最大數(shù)值是255.若把TTL的初始值設(shè)為1,就表示這個數(shù)據(jù)報只能在本局域網(wǎng)中傳送。(9)協(xié)議占8位,協(xié)議字段指出此數(shù)據(jù)報攜帶的數(shù)據(jù)是使用何種協(xié)議,以便使目的主機(jī)的IP層知道應(yīng)將數(shù)據(jù)部分上交給哪個處理過程。(10)頭部檢驗(yàn)和占16位。用于存放檢查報頭錯誤的校驗(yàn)碼。檢驗(yàn)的范圍是整個IP包的報頭。校驗(yàn)和按如下方法計算:1)將頭校驗(yàn)和的字段置為0。2)將報頭部分的所有數(shù)據(jù)以16位為單位進(jìn)行累加,累加方式是求異或。3)將累加的結(jié)果取反碼,就是頭校驗(yàn)和。當(dāng)收到一個IP包時,要檢查報頭是否出錯,就把報頭中的所有數(shù)據(jù)以16位為單位進(jìn)行累加,若累加的結(jié)果為0,則報文沒有出錯。(11)源地址占32位。為發(fā)送方的IP地址。(12)目的地址占32位。為接收方的IP地址。5.2功能設(shè)計與流程圖為了獲取網(wǎng)絡(luò)中的IP數(shù)據(jù)包,必須對網(wǎng)卡進(jìn)行編程,在這里我們使用套接字(socket)進(jìn)行編程。但是,在通常情況下,網(wǎng)絡(luò)通信的套接字程序只能響應(yīng)與自己硬件地址相匹配的數(shù)據(jù)包或是以廣播形式出發(fā)的數(shù)據(jù)包。對于其他形式的數(shù)據(jù)包,如已到達(dá)網(wǎng)絡(luò)接口但卻不是發(fā)送到此地址的數(shù)據(jù)包,網(wǎng)絡(luò)接口在驗(yàn)證投遞地址并非自身地址之后將不引起響應(yīng),也就是說應(yīng)用程序無法收取與自己無關(guān)的數(shù)據(jù)包。我們要想獲取流經(jīng)網(wǎng)絡(luò)設(shè)備的所有數(shù)據(jù)包,就需要將網(wǎng)卡設(shè)置為混雜模式。整個系統(tǒng)可以分為四個模塊,分別為套接字模塊、捕獲IP數(shù)據(jù)包模塊、解析IP數(shù)據(jù)包模塊和輸出模塊。下面是程序流程圖和各模塊功能簡介。套接字模塊套接字模塊主要包括原始套接字的創(chuàng)建和原始套接字的設(shè)置。此模塊先創(chuàng)建一個原始套接字,然后將此套接字綁定到一個本機(jī)的網(wǎng)絡(luò)接口,再設(shè)置套接字使其能捕獲經(jīng)過此網(wǎng)絡(luò)接口的所有IP數(shù)據(jù)包。IP數(shù)據(jù)包的捕獲模塊此模塊主要負(fù)責(zé)捕獲IP數(shù)據(jù)包,然后將捕獲的數(shù)據(jù)包提交給IP數(shù)據(jù)包解析模塊。此模塊利用設(shè)置好的原始套接字捕獲IP數(shù)據(jù)包,然后將數(shù)據(jù)包提交給解析模塊,直到鍵盤輸入Ctrl+C時結(jié)束。IP數(shù)據(jù)包分析模塊此模塊主要負(fù)責(zé)對IP數(shù)據(jù)包進(jìn)行分析,即根據(jù)IP數(shù)據(jù)包的格式把信息從捕獲到的IP數(shù)據(jù)包中提取出來,然后再提交給輸出模塊。輸出模塊此模塊負(fù)責(zé)輸出IP數(shù)據(jù)包信息的輸出,包括輸出到標(biāo)準(zhǔn)輸出和日志文件。第六章抓包模塊實(shí)現(xiàn) 6.1數(shù)據(jù)結(jié)構(gòu)的定義本程序主要用到了兩個數(shù)據(jù)結(jié)構(gòu),一個是IP頭的結(jié)構(gòu)體,一個是常用IP協(xié)議號與協(xié)議名的映射,為使程序代碼更加美觀,將這兩個數(shù)據(jù)結(jié)構(gòu)寫在了頭文件里。IP頭結(jié)構(gòu)體根據(jù)IP數(shù)據(jù)包的格式,定義IP頭結(jié)構(gòu)體如下:structIPHead{u_charihl:4;//頭長度u_charversion:4;//版本u_chartos;//服務(wù)類型u_shortlen;//IP包的總長度u_shortid;//標(biāo)識u_shortoff;//分段偏移量u_charttl;//生存期u_charprotocol;//協(xié)議u_shortcksum;//頭校驗(yàn)和structin_addrsaddr;//源IP地址structin_addrdaddr;//目的IP地址};常用IP協(xié)議號與協(xié)議名的映射為了通過協(xié)議號得到協(xié)議名,于是定義了一些常見的協(xié)議號與其協(xié)議名的映射關(guān)系,如下:pair<int,string>common_ip[]={make_pair(1,"ICMP"),make_pair(2,"IGMP"),make_pair(3,"GGP"),make_pair(4,"IPinIP"),make_pair(6,"TCP"),make_pair(8,"EGP"),make_pair(17,"UDP"),make_pair(35,"IDPR"),make_pair(45,"IDRP"),make_pair(46,"RSVP"),make_pair(47,"GRE"),make_pair(54,"NHRP"),make_pair(88,"IGRP"),make_pair(89,"OSPF"),};//常見的IP協(xié)議編號和名稱constmap<int,string>IP_PROTOCOL(common_ip,common_ip+14);6.2初始化工作命令行參數(shù)檢查if(argc!=2){cerr<<"命令行參數(shù)錯誤!"<<endl;return1;}如果命令行參數(shù)的數(shù)目不是2的話,程序?qū)o法正確進(jìn)行,需打印錯誤信息,然后退出。初始化動態(tài)鏈接庫WSADATAwsa_data;if(WSAStartup(MAKEWORD(2,2),&wsa_data)!=0){cerr<<"WSAStartup()error!"<<endl;return1;}如果初始化失敗,則退出程序。6.3套接字的創(chuàng)建和設(shè)置1套接字的創(chuàng)建創(chuàng)建一個原始套接字,用來捕獲數(shù)據(jù)包。SOCKETs=socket(AF_INET,SOCK_RAW,IPPROTO_IP);if(s==INVALID_SOCKET){WSACleanup();cerr<<"socket()error!"<<endl;return1;}如果創(chuàng)建失敗,則退出程序。綁定本機(jī)地址將剛剛建立的套接字與本機(jī)IP地址綁定。structsockaddr_inhostaddr;hostaddr.sin_family=AF_INET;hostaddr.sin_port=htons(0);hostaddr.sin_addr.s_addr=gethostid();if(bind(s,(sockaddr*)&hostaddr,sizeof(sockaddr))!=0){closesocket(s);WSACleanup();cerr<<"bind()error!"<<endl;exit(-1);}WinSock提供的bind()函數(shù)用于將一個套接字與一個地址綁定。綁定之后,原始套接字就能接收流經(jīng)該IP地址所屬網(wǎng)絡(luò)接口的全部IP數(shù)據(jù)包。設(shè)置套接字為SIO_RCVALLDWORDin_buffer=1,n_returned;intret=WSAIoctl(s,SIO_RCVALL,&in_buffer,sizeof(in_buffer),NULL,0,&n_returned,NULL,NULL);if(ret!=0){closesocket(s);WSACleanup();cerr<<"WSAIoctl()error!"<<endl;exit(-1);}將套接字設(shè)置為SIO_RCVALL之后,套接字就能捕獲局域網(wǎng)內(nèi)所有的IP數(shù)據(jù)包,如果設(shè)置失敗,就退出程序。6.4數(shù)據(jù)包的捕獲與分析前面的步驟完成之后就可以進(jìn)行數(shù)據(jù)包的捕獲了。主要用到WinSock提供的recv函數(shù),recv函數(shù)的原型為:size_trecv(SOCKETsockfd,void*buf,size_tlen,intflags);recv()如果執(zhí)行成功,則捕獲的數(shù)據(jù)包存儲在buf中。主要代碼如下:for(;;){intn_recv=recv(s,buf,sizeof(buf),0);SYSTEMTIMEcur_time;GetLocalTime(&cur_time);//獲得捕獲數(shù)據(jù)包的時間if(n_recv>0){IPHead*lp_iphead=(IPHead*)buf;charbuf[20];sprintf(buf,"%02d:%02d:%02d:%03d",cur_time.wHour,cur_time.wMinute,cur_time.wSecond,cur_time.wMilliseconds);//輸出到標(biāo)準(zhǔn)輸出cout<<"捕包時間\t"<<buf<<endl;output_ip(lp_iphead,cout);cout<<endl<<endl;//輸出到文件fout<<"捕包時間\t"<<buf<<endl;output_ip(lp_iphead,fout);fout<<endl<<endl;fout.flush();}}其中,output_ip是一個自定義函數(shù),該函數(shù),將lp_iphead所向的IP信息輸出到輸出流fout。6.5信息的輸出信息的輸出用函數(shù)output_ip函數(shù)完成,其定義如下:/***將IP數(shù)據(jù)包信息輸出到out流**ip_iphead為指向IPHead類型的指針*/voidoutput_ip(IPHead*lp_iphead,ostream&out){out<<"版本\t\t"<<(int)lp_iphead->version<<endl;out<<"頭長度\t\t"<<(int)(lp_iphead->ihl*4)<<endl;out<<"服務(wù)類型\t"<<(int)lp_iphead->tos<<endl;out<<"總長度\t\t"<<lp_iphead->len<<endl;out<<"標(biāo)識\t\t"<<lp_iphead->id<<endl;u_shortunserved=(lp_iphead->off)>>15;u_shortDF=((lp_iphead->off)>>14)&0x0001;u_shortMF=((lp_iphead->off)>>13)&0x0001;out<<"標(biāo)志位\t\t"<<unserved<<DF<<MF<<endl;out<<"偏移量\t\t"<<((lp_iphead->off)&0x1fff)<<endl;out<<"生存期\t\t"<<(int)lp_iphead->ttl<<endl;out<<"協(xié)議\t\t"<<(int)lp_iphead->protocol;map<int,string>::const_iteratorit=IP_PROTOCOL.find(lp_iphead->protocol);if(it!=IP_PROTOCOL.end())out<<"("<<it->second<<")"<<endl;out<<"校驗(yàn)和\t\t"<<lp_iphead->cksum<<endl;out<<"源IP地址\t"<<inet_ntoa(lp_iphead->saddr)<<endl;out<<"目的IP地址\t"<<inet_ntoa(lp_iphead->daddr)<<endl;}第七章程序運(yùn)行結(jié)果與分析圖7-1程序運(yùn)行菜單界面圖7-2捕獲并解析IP包的標(biāo)準(zhǔn)輸出截圖說明:沒有寫過濾規(guī)則,短時間抓包的數(shù)量就非常大了,這是抓了一小段時間的情況,Ctrl+C退出,所捕獲的IP數(shù)據(jù)包的詳細(xì)信息可在日志文件中查看。圖7-3捕獲并解析IP包的日志文件截圖說明:日志文件采用整頁刷新寫入。圖7-4本機(jī)端口掃描截圖圖7-5局域網(wǎng)內(nèi)端口掃描中截圖圖7-6局域網(wǎng)內(nèi)端口掃描結(jié)果截圖說明:這是之前在實(shí)驗(yàn)室局域網(wǎng)內(nèi)測試的結(jié)果,局域網(wǎng)的IP可以通過cmd命令ipconfig查到。圖7-7局域網(wǎng)內(nèi)端口掃描結(jié)果截圖說明:這是在寢室測試時的數(shù)據(jù),雖然只要掃60個IP的端口,但仍舊花費(fèi)了不少時間。圖7-8退出程序界面第八章心得體會 首先、綜合考慮各種技術(shù)及背景,發(fā)現(xiàn)用connect()函數(shù)去連接這個方法更加可靠且易于實(shí)現(xiàn)和調(diào)試,在出現(xiàn)問題后可相對容易的對其解決。而且在本學(xué)期學(xué)過網(wǎng)絡(luò)安全TCP/IP的課程,對connect()函數(shù)的連接過程有些許掌握,更有利于軟件的開發(fā)。在面對幾千甚至上萬個端口需要掃描時,需要考慮到并發(fā)處理端口,我想到了多線程,在對其多線程設(shè)計中,要注意控制線程的數(shù)量,如果線程數(shù)量過多,會造成程序的崩潰,若太少,則程序運(yùn)行太慢。所以用多線程并發(fā)技術(shù)并加以最大線程數(shù)量來控制。但是盡管如此,掃描的速度還是很慢,后來思考,可以嘗試多IP并行掃描的同時,同一IP多端口并行掃描,這也是我這個程序需要進(jìn)步的地方。其次、在此實(shí)驗(yàn)中,我把IP協(xié)議學(xué)了好多遍,知道了IP頭中每一個字段的意思。對IP數(shù)據(jù)包的捕獲,我使用的是原始套接字,在Windows操作系統(tǒng)中實(shí)現(xiàn)的。在做實(shí)驗(yàn)的過程中,我把Windowssocket大概學(xué)了一遍,重點(diǎn)學(xué)習(xí)了其中的原始套接字。在學(xué)習(xí)的過程中,對OSI七層模型有了更深的了解。對Windowssocket的學(xué)習(xí),讓我對網(wǎng)絡(luò)編程的基本方法和步驟有了一定的了解,相信這次的學(xué)習(xí)對我以后網(wǎng)絡(luò)編程的學(xué)習(xí)會很有幫助。我感覺Windowssocket確實(shí)是一個很強(qiáng)大的工具,但是由于是C語言的接口,用起來也有一些的繁瑣。最后、通過完成本次課程設(shè)計深化了我關(guān)于信息對抗,信息安全的意識。在學(xué)習(xí)《計算機(jī)網(wǎng)絡(luò)》這門課程的時候,我感覺這門課比較枯燥乏味,因?yàn)楹芏嗍呛艹橄?、晦澀的理論知識。但是,在做課程設(shè)計的時候,我才發(fā)現(xiàn)學(xué)的那些理論知識也是非常有用的。所以,這次課程設(shè)計的經(jīng)歷有一次告訴我,理論和實(shí)際相結(jié)合是非常重要的。而且這次設(shè)計,不僅是對以前只是的鞏固,也學(xué)習(xí)到了許多新知識。感謝實(shí)驗(yàn)老師這三個星期的陪伴和指導(dǎo)。參考文獻(xiàn)AndrewS.Tanenbaum,DavidJ.Wetherall.計算機(jī)網(wǎng)絡(luò)(第五版)[M].北京:清華大學(xué)出版社,2012.3BobQuinn,DaveShute.WindowsSockets網(wǎng)絡(luò)編程[M].北京:機(jī)械工業(yè)出版社,2012.8劉文濤,網(wǎng)絡(luò)安全編程技術(shù)與實(shí)例[M].北京:機(jī)械工業(yè)出版社2008.附錄程序源代碼頭文件#ifndefHEADER_H_INCLUDED#defineHEADER_H_INCLUDED#include<iostream>#include<map>#include<string>#include<utility>#include<WinSock2.h>usingnamespacestd;intconstMAX_IP_LEN=65535;pair<int,string>common_ip[]={make_pair(1,"ICMP"),make_pair(2,"IGMP"),make_pair(3,"GGP"),make_pair(4,"IPinIP"),make_pair(6,"TCP"),make_pair(8,"EGP"),make_pair(17,"UDP"),make_pair(35,"IDPR"),make_pair(45,"IDRP"),make_pair(46,"RSVP"),make_pair(47,"GRE"),make_pair(54,"NHRP"),make_pair(88,"IGRP"),make_pair(89,"OSPF"),};constmap<int,string>IP_PROTOCOL(common_ip,common_ip+14);structIPHead{u_charihl:4;//頭長度u_charversion:4;//版本u_chartos;//服務(wù)類型u_shortlen;//IP包的總長度u_shortid;//標(biāo)識u_shortoff;//分段偏移量u_charttl;//生存期u_charprotocol;//協(xié)議u_shortcksum;//頭校驗(yàn)和structin_addrsaddr;//源IP地址structin_addrdaddr;//目的IP地址};u_longgethostid();//獲取本機(jī)地址voidoutput_ip(IPHead*lp_iphead,std::ostream&out);//把IP信息輸出到流outvoidset_socket(SOCKETs);//設(shè)置套接字#endif//HEADER_H_INCLUDED源文件#include<iostream>#include<fstream>#include<strstream>#include<winsock2.h>#include<string>#include<vector>#include<map>#include<fstream>#include<time.h>#include"mstcpip.h"#include"header.h"#pragmacomment(lib,"ws2_32.lib")usingnamespacestd;//**************檢測端口部分****************//shortg_portsTOscan[]={20,21,22,23,25,42,43,47,53,63,67,68,79,80,95,106,107,109,110,113,135,137,138,139,143,144,161,162,443,445,1024,1080,1433,1434,1755,3306,4000,5010,5190,5631,5632,8000,8080,8081};constshortPORTSNUM=sizeof(g_portsTOscan)/sizeof(short);//端口個數(shù)//等掃描的IPvector<unsignedlong>g_vec_IpToScan;stringg_startIp;stringg_endIp;//開啟的線程數(shù),目前為1個IP1個線程longg_runThreadNum;//socket相關(guān)TIMEVALg_timeout;//阻塞等待時間//FD_SETg_mask;//socket模式設(shè)置,儲存socket信息constshortTIMEOUT=1;//阻塞等待時間WSADATAg_wsadata;//socket版本信息//線程中的互斥體HANDLEg_PortMutex;HANDLEg_ThreadNumMutex;HANDLEg_ResultMutex;//輸入結(jié)果的互斥量//保存IP掃描的結(jié)果multimap<unsignedlong,string>g_map_ScanResult;//線程函數(shù),掃描每一個IPDWORDWINAPIThreadFunc(LPVOIDth_para){//獲取需要掃描的IP//char*pStrIp=(char*)th_para;unsignedlongulScanIp=*(unsignedlong*)th_para;intindex=0;//端口索引SOCKETlink_sock;//SOCKETFD_SETset_flag;//SOCKET描述shortselect_ret;//select異步返回值shortport;//正在掃描的端口while(index<PORTSNUM){port=g_portsTOscan[index];//創(chuàng)建數(shù)據(jù)流套接字link_sock=socket(AF_INET,SOCK_STREAM,0);if(link_sock==INVALID_SOCKET){//cout<<"創(chuàng)建link_socksocket失敗:錯誤號為:"<<GetLastError()<<endl;WaitForSingleObject(g_ThreadNumMutex,INFINITE);g_runThreadNum--;ReleaseMutex(g_ThreadNumMutex);//cout<<"***還有_"<<g_runThreadNum<<"_個掃描線程進(jìn)行中**"<<endl;return-1;}FD_ZERO(&set_flag);//將指定文件描述符清空FD_SET(link_sock,&set_flag);//用于在文件描述符集合中增加一個新的文件描述符//設(shè)置連接地址SOCKADDR_INscan_addr;scan_addr.sin_family=AF_INET;scan_addr.sin_addr.s_addr=ulScanIp;scan_addr.sin_port=htons(port);unsignedlongsock_set=1;ioctlsocket(link_sock,FIONBIO,&sock_set);//設(shè)置套接字為非阻塞模式,第3個參數(shù)非0為非阻塞connect(link_sock,(structsockaddr*)&scan_addr,sizeof(scan_addr));//連接指定IP端口select_ret=select(0,NULL,&set_flag,NULL,&g_timeout);//異步返回值if(select_ret==0||select_ret==-1){++index;continue;}else{strstreamstream_result;structin_addripaddr;ipaddr.s_addr=ulScanIp;char*pStrIp=inet_ntoa(ipaddr);stream_result<<"\t主機(jī)地址為:"<<pStrIp<<"\t找到開放的端口:"<<port<<'\0';stringstr_result(stream_result.str());//將掃描結(jié)果儲存到輸出變量中去WaitForSingleObject(g_ResultMutex,INFINITE);g_map_ScanResult.insert(make_pair(ulScanIp,str_result));ReleaseMutex(g_ResultMutex);}++index;}//掃描完一個線程shutdown(link_sock,0);closesocket(link_sock);WaitForSingleObject(g_ThreadNumMutex,INFINITE);g_runThreadNum--;ReleaseMutex(g_ThreadNumMutex);return0;}//將IP轉(zhuǎn)化成能直接遞增和遞減的地址unsignedlongInvertIp(unsignedlongsrcIp){unsignedcharfirst;unsignedcharsecond;unsignedcharthird;unsignedcharfourth;first=srcIp&0x00FF;second=(srcIp>>8)&0x00FF;third=(srcIp>>16)&0x00FF;fourth=(srcIp>>24)&0x00FF;return(first<<24)|(second<<16)|(third<<8)|fourth;}//將IP內(nèi)的IP轉(zhuǎn)化成一個一個unsignedlong類型存在數(shù)組中intGetIpToScan(conststring&StartIp,conststring&EndIp,vector<unsignedlong>&vec_ip){//判斷輸入的IP是否合法unsignedlongulStartIp=inet_addr(StartIp.c_str());unsignedlongulEndIp=inet_addr(EndIp.c_str());if(INADDR_NONE==ulStartIp||INADDR_NONE==ulEndIp){cout<<"請輸入合法的IP"<<endl;return-1;}//判斷查詢的是一個IP還是IP段if(ulStartIp==ulEndIp&&ulStartIp!=0){vec_ip.push_back(ulStartIp);return0;}if(ulStartIp==0&&ulEndIp==0){return0;}if(ulStartIp==0){vec_ip.push_back(ulEndIp);return0;}if(ulEndIp==0){vec_ip.push_back(ulStartIp);return0;}//將IP轉(zhuǎn)換成可以遞增比較的類型ulStartIp=InvertIp(ulStartIp);ulEndIp=InvertIp(ulEndIp);//指定前后順序,ulEndIp較大unsignedlongmax_ip;if(ulStartIp>ulEndIp){max_ip=ulStartIp;ulStartIp=ulEndIp;ulEndIp=max_ip;}intipnums=ulEndIp-ulStartIp;for(inti=0;i<=ipnums;++i){//將每個IP的unsignedlong型存到數(shù)組中供掃描vec_ip.push_back(InvertIp(ulStartIp++));}return0;}//功能:輸入一個IP段,輸出該IP段內(nèi)的端口開放情況信息intScanIp(conststring&start_Ip,conststring&endIp,multimap<unsignedlong,string>&ouputMap){//分解IP段內(nèi)的IP到全局?jǐn)?shù)組中去GetIpToScan(start_Ip,endIp,g_vec_IpToScan);intscanNum=g_vec_IpToScan.size();//線程總數(shù)g_runThreadNum=scanNum; cout<<endl; cout<<endl;cout<<"********************************************************************************";cout<<"\t共有"<<scanNum<<"個IP要掃描"<<endl;//對每個IP開一個線程for(inti=0;i<scanNum;++i){CreateThread(NULL,0,ThreadFunc,&g_vec_IpToScan[i],0,NULL);//要是不間隔時間的話,同時創(chuàng)建socket會出現(xiàn)10093錯誤Sleep(50);}return0;}//輸出掃描結(jié)果intOutPutScanInfo(){ cout<<"掃描到"<<g_map_ScanResult.size()<<"條記錄"<<endl;multimap<unsignedlong,string>::iteratoriter=g_map_ScanResult.begin();ofstreamout("out.txt");cout<<"顯示總"<<g_map_ScanResult.size()<<"條記錄"<<endl; cout<<endl;for(;iter!=g_map_ScanResult.end();++iter){out<<iter->second<<endl;cout<<iter->second<<endl;}return0;}voidUserInput(){system("CLS");cout<<"**********************************************************************"<<endl;cout<<"\t可掃描一個或多個IP,輸入同一網(wǎng)段的兩個IP"<<endl;cout<<"\t格式為54"<<endl;cout<<"**********************************************************************"<<endl;cout<<"現(xiàn)在請輸入需要掃描的IP"<<endl; cout<<"起始IP為:";cin>>g_startIp;cout<<"結(jié)束IP為:";cin>>g_endIp;cout<<"********************************************************************************"<<endl;}//初始化相關(guān)信息voidInitProc(){//初始化socket相關(guān)信息intws_result;ws_result=WSAStartup(MAKEWORD(2,2),&g_wsadata);if(ws_result!=0){cout<<"socketWSAStartup初始化失敗"<<endl;}//設(shè)置阻塞函數(shù)的超時時間g_timeout.tv_sec=TIMEOUT;g_PortMutex=CreateMutex(NULL,FALSE,"portmutex");g_ThreadNumMutex=CreateMutex(NULL,FALSE,"threadnumsmutex");g_ResultMutex=CreateMutex(NULL,FALSE,"resultmutex");}//清理voidCleanProc(){//線程都執(zhí)行完后清理socket相關(guān)信息while(1){WaitForSingleObject(g_ThreadNumMutex,INFINITE);if(g_runThreadNum==0){break;}ReleaseMutex(g_ThreadNumMutex);Sleep(100);}//清理socket相關(guān)信息WSACleanup();}intmain(intargc,char**argv){cout<<"\t歡迎來到抓包小程序!"<<endl;cout<<"**************************************"<<endl;cout<<"\t1.捕獲并解析IP數(shù)據(jù)包"<<endl;cout<<"\t2.檢測本機(jī)中的端口號"<<endl;cout<<"\t3.檢測局域網(wǎng)中端口號"<<endl;cout<<"\t4.沒什么可做的了退出"<<endl;cout<<"**************************************"<<endl;cout<<"請選擇……"<<endl;intsz;cin>>sz;if(sz==1){if(argc!=2){//cout<<argc;cerr<<"命令行參數(shù)錯誤!"<<endl;return1;}//初始化winsock的動態(tài)鏈接庫WSADATAwsa_data;if(WSAStartup(MAKEWORD(2,2),&wsa_data)!=0){cerr<<"WSAStartup()error!"<<endl;return1;}//建立一個原始套接字SOCKETs=socket(AF_INET,SOCK_RAW,IPPROTO_IP);if(s==INVALID_SOCKET){WSACleanup();cerr<<"socket()error!"<<endl;return1;}//設(shè)置套接字set_socket(s);//打開日志文件ofstreamfout(argv[1]);if(!fout){cerr<<"fout.open()error!"<<endl;return1;}//捕獲數(shù)據(jù)包,并進(jìn)行解析//將結(jié)果寫入標(biāo)準(zhǔn)輸出和日志文件中charbuf[
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 11《大家排好隊(duì)》(說課稿)2023-2024學(xué)年統(tǒng)編版道德與法治二年級上冊001
- 2024年秋九年級歷史上冊 第13課 西歐經(jīng)濟(jì)和社會的發(fā)展說課稿1 新人教版
- 2023三年級數(shù)學(xué)上冊 一 混合運(yùn)算第2課時 小熊購物(2)說課稿 北師大版
- 2024-2025學(xué)年新教材高中英語 Unit 2 Traveling Around Reading for Writing說課稿 新人教版必修第一冊
- 2024-2025年高中化學(xué) 專題2 第1單元 第1課時 氯氣的生產(chǎn)原理及其性質(zhì)說課稿 蘇教版必修1001
- 2024-2025學(xué)年八年級物理上冊 3.5 探究光的反射定律的實(shí)驗(yàn)改進(jìn)實(shí)驗(yàn)說課稿 (新版)蘇科版001
- 5走近我們的老師-老師您辛苦了(第2課時)(說課稿)2023-2024學(xué)年統(tǒng)編版道德與法治三年級上冊
- 10綠(說課稿)-2023-2024學(xué)年統(tǒng)編版語文四年級下冊
- 海航寵物運(yùn)輸協(xié)議書(2篇)
- 二零二五年全新借款合同范本:債權(quán)轉(zhuǎn)化股權(quán)操作手冊3篇
- 2025民政局離婚協(xié)議書范本(民政局官方)4篇
- 2024年03月四川農(nóng)村商業(yè)聯(lián)合銀行信息科技部2024年校園招考300名工作人員筆試歷年參考題庫附帶答案詳解
- 小學(xué)一年級數(shù)學(xué)上冊口算練習(xí)題總匯
- 睡眠專業(yè)知識培訓(xùn)課件
- 潤滑油知識-液壓油
- 2024年江蘇省中醫(yī)院高層次衛(wèi)技人才招聘筆試歷年參考題庫頻考點(diǎn)附帶答案
- 臨床思維能力培養(yǎng)
- 人教版高中物理必修第三冊第十章靜電場中的能量10-1電勢能和電勢練習(xí)含答案
- 釀酒工藝教案
- 小學(xué)四年級語文閱讀理解專項(xiàng)訓(xùn)練
- 輔導(dǎo)班合伙人合同范本(2篇)
評論
0/150
提交評論