最新計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)基于ICMPTCP的網(wǎng)段端口掃描C語言編寫 免費(fèi)下載.doc_第1頁
最新計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)基于ICMPTCP的網(wǎng)段端口掃描C語言編寫 免費(fèi)下載.doc_第2頁
最新計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)基于ICMPTCP的網(wǎng)段端口掃描C語言編寫 免費(fèi)下載.doc_第3頁
最新計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)基于ICMPTCP的網(wǎng)段端口掃描C語言編寫 免費(fèi)下載.doc_第4頁
最新計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)基于ICMPTCP的網(wǎng)段端口掃描C語言編寫 免費(fèi)下載.doc_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費(fèi)閱讀

最新計(jì)算機(jī)網(wǎng)絡(luò)課程設(shè)計(jì)基于ICMPTCP的網(wǎng)段端口掃描C語言編寫 免費(fèi)下載.doc.doc 免費(fèi)下載

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

ronnie課 程 設(shè) 計(jì) 任 務(wù) 書【設(shè)計(jì)目的】 加深對(duì)TCP/IP協(xié)議的理解,熟悉Socket編程【設(shè)計(jì)任務(wù)】 實(shí)現(xiàn)一個(gè)掃描器,必須能夠完成以下所有功能:使用TCP connect、TCP SYN和TCP FIN進(jìn)行端口掃描,使用ICMP echo 掃描實(shí)現(xiàn)IP掃描。并把結(jié)果記錄下來?!驹O(shè)計(jì)要求】l Windows或Linux環(huán)境下,程序在單機(jī)上運(yùn)行。l 演示:使用端口掃描對(duì)一臺(tái)主機(jī)進(jìn)行掃描,并顯示結(jié)果(一臺(tái)主機(jī)上有哪些端口是打開的)。對(duì)一個(gè)網(wǎng)段進(jìn)行IP掃描,顯示結(jié)果(一個(gè)網(wǎng)段內(nèi)有哪些主機(jī)是開機(jī)的)。l 友好的用戶界面【設(shè)計(jì)要求】l 程序源代碼,必須有詳細(xì)的注釋。l 項(xiàng)目設(shè)計(jì)報(bào)告。32網(wǎng)段和端口掃描程序一、 概述11.1端口掃描11.2端口掃描常用技術(shù)簡(jiǎn)介21.2.1 connect()掃描21.2.2 SYN掃描31.2.3 XMAS-TREE掃描31.3網(wǎng)段掃描4二、需求分析52.1 設(shè)計(jì)功能52.2 設(shè)計(jì)要求5三、概要設(shè)計(jì)53.1設(shè)計(jì)概念和處理流程53.2 結(jié)構(gòu)設(shè)計(jì)73.2.1 數(shù)據(jù)結(jié)構(gòu)及定義73.2.2 接口函數(shù)8四、細(xì)設(shè)設(shè)計(jì)94.1 實(shí)現(xiàn)原理94.1.1 connect()函數(shù)端口掃描的原理94.1.2 ICMP網(wǎng)段掃描的原理114.2 函數(shù)實(shí)現(xiàn)144.2.1 初始化winsock動(dòng)態(tài)鏈接庫144.2.3地址解析154.2.4 計(jì)算檢驗(yàn)和154.2.5 網(wǎng)段掃描164.2.6 端口掃描17五、 總結(jié)與體會(huì)195.1 程序運(yùn)行與調(diào)試195.2 體會(huì)20六、 參考文獻(xiàn)216.1 參考書目216.2 引用網(wǎng)址211、 概述1.1端口掃描端口掃描是指利用TCP協(xié)議的面向連接的特性,使用本地計(jì)算機(jī)試圖與目的主機(jī)的某個(gè)端口建立連接,以此來試探目的主機(jī)的一些端口的具體狀態(tài),如是否打開,若是打開的又運(yùn)行什么樣的程序(利用熟知端口很容易知道)。端口掃描有很多技術(shù)實(shí)現(xiàn)。其中最常用的有:connect()掃描,TCP SYN掃描,TCP FIN掃描,TCP NULL掃描,XMAS- TREE掃描(圣誕樹掃描)等等。在本程序中使用的是connect()掃描。1.2端口掃描常用技術(shù)簡(jiǎn)介1.2.1 connect()掃描此掃描的原理是,本地計(jì)算機(jī)利用TCP協(xié)議的三次握手原理(RFC 793)試圖與網(wǎng)絡(luò)上一臺(tái)主機(jī)或服務(wù)器建立TCP連接。如果目的主機(jī)或服務(wù)器回送SYN/ACK則說明該端口開放,否則該端口關(guān)閉。具體的過程:1. Client端發(fā)送SYN2. Server端發(fā)送SYN/ACK(該端口開放),或Server端發(fā)送RST/ACK(該端口關(guān)閉),若無應(yīng)答可能目的主機(jī)或服務(wù)器不可達(dá)。3. Client端發(fā)送ACK,連接建立。4. Client端主動(dòng)斷開連接,連接關(guān)閉。過程圖如下:1.2.2 SYN掃描SYN掃描前兩步與connect()掃描相同,只是最后一步,Client端發(fā)送的不是ACK確認(rèn)報(bào)文而是RST報(bào)文,這樣三次握手過程就沒有完成,Client與Server也就沒有建立TCP連接,因此前述過程不會(huì)被Sever端記錄到系統(tǒng)日志中,掃描更加隱蔽。過程圖如下:1.2.3 XMAS-TREE掃描通過發(fā)送帶有以下標(biāo)志位TCP數(shù)據(jù)包URG,PSH,FIN來試探主機(jī)。在目標(biāo)端口開放的情況下不放回任何信息。端口開放:發(fā)送URG/PSH/FIN,沒有響應(yīng)。端口關(guān)閉:1.發(fā)送URG/PSH/FIN,沒有響應(yīng)。2響應(yīng)RST。1.3網(wǎng)段掃描網(wǎng)段掃描是指利用ICMP(因特網(wǎng)控制報(bào)文協(xié)議)對(duì)某一網(wǎng)段的所有IP地址發(fā)送ICMP報(bào)文,測(cè)試IP地址所對(duì)應(yīng)的主機(jī)具體情況(如是否開機(jī)等)。所以對(duì)目的主機(jī)回答的ICMP報(bào)文進(jìn)行分析是網(wǎng)段掃描的關(guān)鍵。常見的報(bào)文類型有:類型(type)代碼(code)描述差錯(cuò)查詢00回顯回答*31主機(jī)不可達(dá)*3端口不可達(dá)*80請(qǐng)求回顯*二、需求分析2.1 設(shè)計(jì)功能實(shí)現(xiàn)一個(gè)掃描器,使用TCP connect、TCP SYN或TCP SYN進(jìn)行端口掃描,使用 ICMP echo掃描實(shí)現(xiàn)IP掃描,并記錄結(jié)果。2.2 設(shè)計(jì)要求Windows或Linux環(huán)境下,程序應(yīng)在單機(jī)上運(yùn)行。使用端口掃描對(duì)一臺(tái)主機(jī)進(jìn)行掃描,并顯示結(jié)果,在一定的端口范圍內(nèi),該主機(jī)由哪些端口是打開的。對(duì)一個(gè)網(wǎng)段進(jìn)行IP掃描,顯示結(jié)果,該網(wǎng)段的哪些主機(jī)是開機(jī)的。友好的界面,便于用戶操作,完成全部設(shè)計(jì)功能。三、概要設(shè)計(jì)3.1設(shè)計(jì)概念和處理流程程序使用Windows Sockets API編程,利用winsock2庫函數(shù)提供的函數(shù)實(shí)現(xiàn)與主機(jī)間的連接,發(fā)送ICMP報(bào)文。詳見Winsock Referen:/en-us/library/windows/desktop/ms741416(v=vs.85).aspx用戶首先選擇要使用的功能,程序共有兩大功能:端口掃描和IP網(wǎng)段掃描。端口掃描的主要功能有,根據(jù)用戶輸入的主機(jī)名或IP地址以及端口范圍進(jìn)行connect()掃描。當(dāng)用戶輸入完必要的信息并擊確認(rèn)后,程序進(jìn)行掃描,不過不建議端口區(qū)間過于龐大,等待一段時(shí)間后用戶界面會(huì)顯示所指定IP地址主機(jī)的端口使用情況,哪些端口是打開的,哪些是關(guān)閉的。IP網(wǎng)段掃描的主要功能有,用戶輸入某個(gè)網(wǎng)段起始IP地址和結(jié)束IP地址,確認(rèn)后,程序根據(jù)所輸入的網(wǎng)段號(hào),對(duì)網(wǎng)段類的每一個(gè)IP地址發(fā)送ICMP請(qǐng)求回顯報(bào)文,如果主機(jī)處于開機(jī)狀態(tài)那么將會(huì)回送回答報(bào)文;如果主機(jī)不可達(dá)(在同一個(gè)網(wǎng)內(nèi)),則就能夠判斷該IP所對(duì)應(yīng)的主機(jī)處于關(guān)機(jī)狀態(tài)。當(dāng)用戶選擇退出功能時(shí),釋放資源,程序關(guān)閉。程序流程圖3.2 結(jié)構(gòu)設(shè)計(jì)3.2.1 數(shù)據(jù)結(jié)構(gòu)及定義所使用的宏定義,#define ICMP_ECHO_REQUEST_TYPE 8 /ICMP請(qǐng)求類型#define ICMP_ECHO_REQUEST_CODE 0 /ICMP請(qǐng)求代碼#define ICMP_ECHO_REPLY_TYPE 0#define ICMP_ECHO_REPLY_CODE 0#define ICMP_MINIMUM_HEADER 8IP數(shù)據(jù)報(bào)首部,首部固定20字節(jié),數(shù)據(jù)結(jié)構(gòu)定義如下:typedef struct ip_hdrunsigned char iphVerLen; / 版本號(hào)和頭長度(各占4位)unsigned char ipTOS; / 服務(wù)類型 unsigned short ipLength; / 封包總長度,即整個(gè)IP報(bào)的長度unsigned short ipID; / 封包標(biāo)識(shí),惟一標(biāo)識(shí)發(fā)送的每一個(gè)數(shù)據(jù)報(bào)unsigned short ipFlags; / 標(biāo)志unsigned char ipTTL; / 生存時(shí)間,就是TTLunsigned char ipProtocol; / 協(xié)議,可能是TCP、UDP、ICMP等unsigned short ipChecksum; / 校驗(yàn)和unsigned long ipSource; / 源IP地址unsigned long ipDestination; / 目標(biāo)IP地址IP_HDR,*PIP_HDR;IP數(shù)據(jù)報(bào)格式ICMP報(bào)文首部格式,8個(gè)字節(jié),數(shù)據(jù)結(jié)構(gòu)定義如下:typedef struct icmp_hdrunsigned char icmp_type; /類型unsigned char icmp_code; /代碼unsigned short icmp_checksum; /檢驗(yàn)和unsigned short icmp_id; /唯一請(qǐng)求ID,通常使用進(jìn)程PIDunsigned short icmp_sequence; /序列號(hào)unsigned long icmp_timestamp; /時(shí)間戳 ICMP_HDR,*PICMP_HDR;3.2.2 接口函數(shù)Void InitializeWinsock(),初始化Winsock動(dòng)態(tài)鏈接庫。Void Resolove(char hostname),解析主機(jī)名(或IP地址),該函數(shù)是公共接口函數(shù),端口掃描和IP網(wǎng)段掃描都使用該函數(shù)解析地址。函數(shù)首先判斷用戶輸入的IP是十進(jìn)制點(diǎn)分地址還是域名地址,然后分別調(diào)用inet_addr()和gethostbyname()庫函數(shù)處理成unsigned long型數(shù)據(jù)。Void ResoloveIPAddr(char starthost,char endhost,int *start,int *end),此函數(shù)用戶IP網(wǎng)段掃描,將用戶輸入的起始IP地址和結(jié)束IP地址轉(zhuǎn)換為int類型數(shù)據(jù)。Char * Assemble(char startehost,int cur),將當(dāng)前IP地址轉(zhuǎn)化為字符串類型的IP地址。void SegmentScan(char starthost,char endhost),通過發(fā)送ICMP,檢測(cè)某個(gè)網(wǎng)段上主機(jī)的具體狀態(tài)。函數(shù)的兩個(gè)參數(shù)starthost、endhost分別代表用戶給定的起始IP地址和結(jié)尾IP地址。該函數(shù)內(nèi)部調(diào)用了InitializeWinsock()、Resolove()、ResoloveIPAddr()、Assemble()、以及庫函數(shù)sendto()和recvfrom()。通過這些函數(shù)的調(diào)用實(shí)現(xiàn)了對(duì)指定網(wǎng)絡(luò)區(qū)間的ICMP掃描。connectScan(char startport,char endport,hostname),該函數(shù)把用戶輸入的主機(jī)名(或IP地址)寫入sin_addr.s_addr,起始端口寫入sin_port中。函數(shù)調(diào)用了InitializeWinsock()、Resolove()以及庫函數(shù)connect()、shutdown()。實(shí)現(xiàn)了利用connect()系統(tǒng)函數(shù)對(duì)指定主機(jī)端口區(qū)間掃描。四、細(xì)設(shè)設(shè)計(jì)4.1 實(shí)現(xiàn)原理4.1.1 connect()函數(shù)端口掃描的原理首先要明白TCP報(bào)文段的首部格式?,F(xiàn)在分別介紹各個(gè)字段的具體含義。(1)源端口和目的端口 各占兩個(gè)字節(jié)。端口是運(yùn)輸層與應(yīng)用層的服務(wù)。(2)序號(hào) 占4個(gè)字節(jié)。TCP把傳送的數(shù)據(jù)流中的每一個(gè)字節(jié)都編上一個(gè)序號(hào)。(3)確認(rèn)號(hào) 占4個(gè)字節(jié)。是指期望對(duì)方的下一個(gè)報(bào)文段的數(shù)據(jù)的第一個(gè)字節(jié)的序號(hào)。(5)數(shù)據(jù)偏移 占4位。它指出TCP報(bào)文段的數(shù)據(jù)起始處距離TCP報(bào)文段的起始距離有多遠(yuǎn)。(6)保留。(7)緊急比特URG 當(dāng)URG=1時(shí),表明緊急指針字段有效。告訴系統(tǒng)有緊急數(shù)據(jù),應(yīng)盡快發(fā)送。(8)確認(rèn)比特ACK 只有當(dāng)ACK=1時(shí)確認(rèn)號(hào)字段才有效。(9)推送比特PSH 將數(shù)據(jù)流盡快的推送給應(yīng)用進(jìn)程。而不是等到緩沖區(qū)滿后才將數(shù)據(jù)送至應(yīng)用程序。(10)復(fù)位比特RST 當(dāng)RST=1時(shí),表明TCP出現(xiàn)錯(cuò)誤,必須釋放連接,然后重新建立運(yùn)輸連接。復(fù)位比特還用來拒絕一個(gè)非法報(bào)文或拒絕打開一個(gè)連接。(11)同步比特SYN 當(dāng)SYN=1而ACK=0是表明這是一個(gè)請(qǐng)求連接報(bào)文,若同意連接則對(duì)方應(yīng)該回送SYN=1,ACK=1。(12)終止比特 FIN。用于釋放一個(gè)連接。(13)檢驗(yàn)和 占2個(gè)字節(jié)。設(shè)客戶進(jìn)程運(yùn)行在本地計(jì)算機(jī)上。它首先向其TCP發(fā)出主動(dòng)打開(active open)命令,表明要與某個(gè)IP地址的某個(gè)端口建立運(yùn)輸連接。首先發(fā)送SYN=1,SEQ=X的報(bào)文給目標(biāo)主機(jī)的某端口,當(dāng)本地計(jì)算機(jī)收到SYN=1,ACK=1的報(bào)文時(shí),表明對(duì)方主機(jī)同意連接,這是還需發(fā)送一個(gè)ACK以確認(rèn)連接。這樣,經(jīng)過三次握手,一條TCP連接鏈路就建立完成。在Winsock2環(huán)境下,系統(tǒng)類庫提供了connect()接口函數(shù)。一下是函數(shù)原型:connect functionint connect( _In_ SOCKET s, _In_ const struct sockaddr *name, _In_ int namelen);s表示一個(gè)為連接的socket,name表示一個(gè)指向sockaddr的結(jié)構(gòu)體指針,namelen是sockaddr中name域的比特長度。利用此函數(shù),可以非常方便的連接一個(gè)套接字。4.1.2 ICMP網(wǎng)段掃描的原理因特網(wǎng)控制報(bào)文協(xié)議ICMP(Internet Control Message Protocol)【RFC792】。ICMP允許主機(jī)或路由器報(bào)告差錯(cuò)情況和提供有關(guān)異常情況的報(bào)告。ICMP報(bào)文作為IP層數(shù)據(jù)報(bào)的數(shù)據(jù),加上數(shù)據(jù)報(bào)的首部,組成數(shù)據(jù)發(fā)送出去。ICMP報(bào)文的種類有兩種,即ICMP差錯(cuò)報(bào)告報(bào)文和ICMP詢問報(bào)文。ICMP報(bào)文的前4個(gè)字節(jié)是統(tǒng)一格式,共有三個(gè)字段:類型,代碼和檢驗(yàn)和。對(duì)網(wǎng)段的主機(jī)掃描就是利用了這三個(gè)字段。根據(jù)主機(jī)發(fā)回的不同類型和代碼對(duì)主機(jī)的狀態(tài)進(jìn)行判斷。ICMP的差錯(cuò)報(bào)文共有5種:(1) 終點(diǎn)不可達(dá) 終點(diǎn)不可達(dá)分為:網(wǎng)絡(luò)不可達(dá),主機(jī)不可達(dá),協(xié)議不可達(dá),端口不可達(dá)。(2) 源站抑制 當(dāng)路由器或主機(jī)由于擁塞而丟棄數(shù)據(jù)包時(shí),就向源站發(fā)生源站抑制報(bào)文。(3) 時(shí)間超時(shí) 當(dāng)路由器手打生存時(shí)間為零的數(shù)據(jù)包時(shí),除丟棄該數(shù)據(jù)報(bào)外,還向源站發(fā)送時(shí)間超過報(bào)文。(4) 參數(shù)問題(5) 改變路由(重定向)對(duì)一個(gè)網(wǎng)段掃描時(shí),主要利用(1)和(3)兩種報(bào)文。ICMP的詢問報(bào)文主要有4種:(1) 回送請(qǐng)求和回答(Ping)(2) 時(shí)間戳和回答(常用來記錄一個(gè)主機(jī)到另一個(gè)主機(jī)的延遲)(3) 掩碼請(qǐng)求和回答(4) 路由詢問和回答同樣,主要利用(1)和(2)兩種報(bào)文。Winsock2提供sendto()和recvfrom()兩個(gè)函數(shù)分別來發(fā)送IP層數(shù)據(jù)報(bào)。函數(shù)原型分別為:sendto functionint sendto( _In_ SOCKET s, _In_ const char *buf, _In_ int len, _In_ int flags, _In_ const struct sockaddr *to, _In_ int tolen);recvfrom functionint recvfrom( _In_ SOCKET s, _Out_ char *buf, _In_ int len, _In_ int flags, _Out_ struct sockaddr *from, _Inout_opt_ int *fromlen);結(jié)合原始套接字可以很方便做到將一個(gè)ICMP數(shù)據(jù)包封裝到IP數(shù)據(jù)包中,以及從一個(gè)IP數(shù)據(jù)報(bào)中解析出包含ICMP報(bào)文。下面對(duì)原始套接字做下簡(jiǎn)單的介紹。原始套接字提供普通的TCP和UDP套接字所不提供的一下3個(gè)功能。v 有了原始套接字,進(jìn)程可以讀寫ICMP和IGMP等分組。舉例來說ping程序就是使用原始套接字收發(fā)ICMP分組,網(wǎng)段掃描也是基于這個(gè)原理。v 有了原始套接字,進(jìn)程可以讀寫內(nèi)核不處理其協(xié)議字段的IPv4數(shù)據(jù)包。v 有了原始套接字,進(jìn)程還可以使用IP_HDRINCL套接字選項(xiàng)自行構(gòu)造IPv4首部。這一點(diǎn)是非常強(qiáng)大的。在利用Winsock編寫原始套接字時(shí)要注意程序應(yīng)該取得管理員權(quán)限,因?yàn)榇蠖鄶?shù)操作系統(tǒng)對(duì)原始套接字的創(chuàng)建有較為嚴(yán)格的限制。如果沒有取得管理員權(quán)限,那么在創(chuàng)建原始套接字的時(shí)候會(huì)報(bào)出10013-Permission denied.的錯(cuò)誤,從而無法創(chuàng)建套接字。4.2 函數(shù)實(shí)現(xiàn)4.2.1 初始化winsock動(dòng)態(tài)鏈接庫void InitializeWinsock()int status;WSADATA wsa;if (status=WSAStartup(MAKEWORD(2,2),&wsa)!=0)printf(Failed to WSAStartup(): %d.n,WSAGetLastError();exit(EXIT_FAILURE);函數(shù)調(diào)用Winsock2提供的WSAStartup()函數(shù),初始化動(dòng)態(tài)鏈接庫。4.2.2 初始化ICMP首部void InitIcmpHeader(ICMP_HDR* icmp_hdr)char buffsizeof(ICMP_HDR) + 32; /ICMP報(bào)文類型,類型為8,代碼為0icmp_hdr-icmp_type = ICMP_ECHO_REQUEST_TYPE; / 請(qǐng)求回顯icmp_hdr-icmp_code = ICMP_ECHO_REQUEST_CODE;icmp_hdr-icmp_id = (USHORT)GetCurrentProcessId();icmp_hdr-icmp_checksum = 0;icmp_hdr-icmp_sequence = 0;icmp_hdr-icmp_timestamp= GetTickCount();/往ICMP頭部填充信息memset(&buffsizeof(ICMP_HDR), E, 32);函數(shù)為ICMP報(bào)文首部中各個(gè)字段賦值,達(dá)到初始化的目的。其中比較重要的語句有icmp_hdr-icmp_type = ICMP_ECHO_REQUEST_TYPE; / 請(qǐng)求回顯icmp_hdr-icmp_code = ICMP_ECHO_REQUEST_CODE;這樣賦值后,就把ICMP報(bào)文設(shè)置成ICMP詢問報(bào)文,回送請(qǐng)求和回答。4.2.3地址解析void Resolove(char hostname)if(isdigit(hostname0)/判斷主機(jī)名是否為數(shù)字 /printf(執(zhí)行inet_addr().n);dest.sin_addr.s_addr = inet_addr(hostname); /將主機(jī)地址寫入s_addr/printf(%dn,WSAGetLastError(); else if( (host=gethostbyname(hostname) != 0)/判斷所給主機(jī)名是否與host中的一致/printf(執(zhí)行g(shù)ethostbyname().n);strncpy(char *)&dest.sin_addr , (char *)host-h_addr_list0 , sizeof dest.sin_addr);/printf(完成。n);elseprintf(解析主機(jī)失敗。n);exit(EXIT_FAILURE);根據(jù)用戶輸入地址字符串轉(zhuǎn)化成相應(yīng)的地址字段,寫入dest.sin_addr中。如果用戶輸入的點(diǎn)分十進(jìn)制。則就會(huì)調(diào)用相應(yīng)的inet_addr()函數(shù),否則調(diào)用gethostbyname(),在寫入地址字段。4.2.4 計(jì)算檢驗(yàn)和unsigned short checksum(unsigned short *buffer, int size) unsigned long cksum=0;while (size 1) cksum += *buffer+;size -= sizeof(USHORT);if (size) cksum += *(UCHAR*)buffer;cksum = (cksum 16) + (cksum & 0xffff);cksum += (cksum 16);return (USHORT)(cksum);根據(jù)TCP/IP協(xié)議,IP數(shù)據(jù)報(bào)在傳輸過程前必須計(jì)算檢驗(yàn)和,對(duì)收到的數(shù)據(jù)也要計(jì)算檢驗(yàn)和。該函數(shù)實(shí)現(xiàn)了首部的檢驗(yàn)和計(jì)算。4.2.5 網(wǎng)段掃描主要語句如下:for(i = startport ; i= endport ; i+)sock = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP); /創(chuàng)建一個(gè)Socketif(sock=INVALID_SOCKET) printf(Create socket failed: %dn,WSAGetLastError(); exit(EXIT_FAILURE); /主機(jī)字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序dest.sin_port = htons(i);/用此Socket連接目的主機(jī),核心代碼status = connect(sock , (struct sockaddr *)&dest , sizeof dest);if(status = SOCKET_ERROR) /連接失敗switch(WSAGetLastError()case 10060:printf(%st%dtERRORttConnection timed outn , hostname , i );break;case 10061:printf(%st%dtERRORttConnection refusedn , hostname , i );break;default:printf(%st%dtERRORtCode:n,WSAGetLastError();break;/fflush(stdout);else /連接成功printf(%st%dtPORT OPENn , hostname ,i);/關(guān)閉收發(fā)服務(wù)if( shutdown( sock ,SD_BOTH ) = SOCKET_ERROR )printf(Failed to shutdown the connect: %dn,WSAGetLastError();exit(EXIT_FAILURE); closesocket(sock); /關(guān)閉Socket,回收資源/WSACleanup();利用一個(gè)for(;)循環(huán),對(duì)確定的起始和終止IP地址的內(nèi)的所有可能存在的主機(jī)發(fā)送,請(qǐng)求回顯的ICMP報(bào)文,并對(duì)返回的ICMP報(bào)文進(jìn)行分析,提取出type和code字段,根據(jù)ICMP報(bào)文格式所定義的數(shù)值,對(duì)各個(gè)主機(jī)判斷,并打印信息。4.2.6 端口掃描for(i = startport ; i= endport ; i+)sock = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP); /創(chuàng)建一個(gè)Socketif(sock=INVALID_SOCKET) printf(Create socket failed: %dn,WSAGetLastError(); exit(EXIT_FAILURE); /主機(jī)字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序dest.sin_port = htons(i);/用此Socket連接目的主機(jī),核心代碼status = connect(sock , (struct sockaddr *)&dest , sizeof dest);if(status = SOCKET_ERROR) /連接失敗switch(WSAGetLastError()case 10060:printf(%st%dtERRORttConnection timed outn , hostname , i );break;case 10061:printf(%st%dtERRORttConnection refusedn , hostname , i );break;default:printf(%st%dtERRORtCode:n,WSAGetLastError();break;/fflush(stdout);else /連接成功printf(%st%dtPORT OPENn , hostname ,i);/關(guān)閉收發(fā)服務(wù)if( shutdown( sock ,SD_BOTH ) = SOCKET_ERROR )printf(Failed to shutdown the connect: %dn,WSAGetLastError();exit(EXIT_FAILURE); closesocket(sock); /關(guān)閉Socket,回收資源/WSACleanup();函數(shù)同樣利用一個(gè)for(;)循環(huán)對(duì)給定的主機(jī)的端口區(qū)間掃描。調(diào)用WSAGetLastError()庫函數(shù)判斷端口是否連接,根據(jù)相應(yīng)的ERROR CODE判斷端口的具體情況。以下是主要的ERROR CODE:WSAETIMEDOUT10060Connection timed out.A connection attempt failed because the connected party did not properly respond after a period of time, or the established connection failed because the connected host has failed to respond.WSAECONNREFUSED10061Connection refused.No connection could be made because the target computer actively refused it. This usually results from trying to connect to a service that is inactive on the foreign hostthat is, one with no server application running.WSAELOOP10062Cannot translate name.Cannot translate a name.摘自:/en-us/library/windows/desktop/ms740668(v=vs.85).aspx5、 總結(jié)與體會(huì)5.1 程序調(diào)試與運(yùn)行程序主界面IP網(wǎng)段掃描端口掃描5.2 體會(huì)通過本次的課程設(shè)計(jì)加深了本人對(duì)TCP/IP協(xié)議特別是網(wǎng)絡(luò)層協(xié)議,IP首部格式,ICMP首部格式的理解。對(duì)Windows網(wǎng)絡(luò)編程也有初步的了解,掌握了基本的套接字程序的編寫。理解原始套接字的運(yùn)行機(jī)制,加深一些協(xié)議字段的理解。編寫過程遇到的困難也不少,但是依靠鉆研精神,逐步對(duì)網(wǎng)絡(luò)編程步驟產(chǎn)生了整體的印象,這對(duì)以后的學(xué)習(xí)也是一筆寶貴的財(cái)富。以前學(xué)習(xí)總是停留在紙面上理論上,雖然貌似一些概念是清楚了,但是這樣的記憶是不長久的。只有通過理論聯(lián)系實(shí)際,編寫一些代碼,實(shí)現(xiàn)一些功能,才能加強(qiáng)記憶,學(xué)以致用。6、 參考文獻(xiàn)6.1 參考書目1 W.Richard Stevens,Bill Fenner,Andrew M.Rudoff. Unix Network Programming Volume1:The Sockets Networking API,Third Edition. Pearson Education,20102 Wnthony Jones,Jim Ohlund. Network Programming for Microsoft Windows,Second Edition.Microsoft Press,20023 謝希仁.計(jì)算機(jī)網(wǎng)絡(luò)(第四版).電子工業(yè)出版社,20034 周鳴爭(zhēng),嚴(yán)楠,丁剛等.計(jì)算機(jī)網(wǎng)絡(luò)教程.清華大學(xué)出版社,20116.2 引用網(wǎng)址/en-us/library/windows/desktop/ms741416(v=vs.85).aspx/en-us/library/windows/desktop/ms740668(v=vs.85).aspx/rfc.html/doc/rfc792//view/700108.htm/view/30564.htm/zh-cn/RFC源代碼Scanner,h/IP首部typedef struct ip_hdrunsigned char iphVerLen; / 版本號(hào)和頭長度(各占4位)unsigned char ipTOS; / 服務(wù)類型 unsigned short ipLength; / 封包總長度,即整個(gè)IP報(bào)的長度unsigned short ipID; / 封包標(biāo)識(shí),惟一標(biāo)識(shí)發(fā)送的每一個(gè)數(shù)據(jù)報(bào)unsigned short ipFlags; / 標(biāo)志unsigned char ipTTL; / 生存時(shí)間,就是TTLunsigned char ipProtocol; / 協(xié)議,可能是TCP、UDP、ICMP等unsigned short ipChecksum; / 校驗(yàn)和unsigned long ipSource; / 源IP地址unsigned long ipDestination; / 目標(biāo)IP地址IP_HDR,*PIP_HDR;/ICMP首部typedef struct icmp_hdrunsigned char icmp_type; /類型unsigned char icmp_code; /代碼unsigned short icmp_checksum; /檢驗(yàn)和unsigned short icmp_id; /唯一請(qǐng)求ID,通常使用進(jìn)程PIDunsigned short icmp_sequence; /序列號(hào)unsigned long icmp_timestamp; /時(shí)間戳 ICMP_HDR,*PICMP_HDR;Scanner.c#include #include #include #include #include #pragma comment(lib,ws2_32.lib);#include Scanner.h#define ICMP_ECHO_REQUEST_TYPE 8 /ICMP請(qǐng)求類型#define ICMP_ECHO_REQUEST_CODE 0 /ICMP請(qǐng)求代碼#define ICMP_ECHO_REPLY_TYPE 0#define ICMP_ECHO_REPLY_CODE 0#define ICMP_MINIMUM_HEADER 8struct hostent *host; /記錄主機(jī)信息struct sockaddr_in dest; /存儲(chǔ)目的主機(jī)信息struct sockaddr_in from; /用于回顯/注釋:常見的ICMP報(bào)文類型/ 類型 代碼 描述/ 0 0 回顯回答/ 3 1 主機(jī)不可達(dá)/ 3 3 端口不可達(dá)/ 8 0 請(qǐng)求回顯/初始化winsock動(dòng)態(tài)鏈接庫void InitializeWinsock()int status;WSADATA wsa;if (status=WSAStartup(MAKEWORD(2,2),&wsa)!=0)printf(Failed to WSAStartup(): %d.n,WSAGetLastError();exit(EXIT_FAILURE);/初始化ICMP首部void InitIcmpHeader(ICMP_HDR* icmp_hdr)char buffsizeof(ICMP_HDR) + 32; /ICMP報(bào)文類型,類型為8,代碼為0icmp_hdr-icmp_type = ICMP_ECHO_REQUEST_TYPE; / 請(qǐng)求回顯icmp_hdr-icmp_code = ICMP_ECHO_REQUEST_CODE;icmp_hdr-icmp_id = (USHORT)GetCurrentProcessId();icmp_hdr-icmp_checksum = 0;icmp_hdr-icmp_sequence = 0;icmp_hdr-icmp_timestamp= GetTickCount();/往ICMP頭部填充信息memset(&buffsizeof(ICMP_HDR), E, 32);/地址解析,解析IP地址或域名void Resolove(char hostname)if(isdigit(hostname0)/判斷主機(jī)名是否為數(shù)字 /printf(執(zhí)行inet_addr().n);dest.sin_addr.s_addr = inet_addr(hostname); /將主機(jī)地址寫入s_addr/printf(%dn,WSAGetLastError(); else if( (host=gethostbyname(hostname) != 0)/判斷所給主機(jī)名是否與host中的一致/printf(執(zhí)行g(shù)ethostbyname().n);strncpy(char *)&dest.sin_addr , (char *)host-h_addr_list0 , sizeof dest.sin_addr);/printf(完成。n);elseprintf(解析主機(jī)失敗。n);exit(EXIT_FAILURE);/提取目的地址低三位,用于網(wǎng)段掃描void ResoloveIPAddr(char starthost,char endhost,int *start,int *end)int cd1=0;int cd2=0;int ci1=0;int ci2=0;char c14,c24;while (*starthost!=0&*endhost!=0)if (*starthost!=0)if (cd13)if(*starthost=.)+cd1; elsec1ci1=*starthost;+ci1;+starthost; if(*endhost!=0)if (cd23)if(*endhost=.)+cd2; elsec2ci2=*endhost;+ci2;+endhost;c13=c23=0;*start=atoi(c1);*end=atoi(c2);/將當(dāng)前IP低三位與網(wǎng)段號(hào)組裝,用于發(fā)送ICMP的目的主機(jī)IP地址char* Assemble(char starthost,int cur)int i=0,cd=0;char appendix4,*tmp=starthost;itoa(cur,appendix,10);/printf(%sn,appendix);while (cd 1) cksum += *buffer+;size -= sizeof(USHORT);if (size) cksum += *(UCHAR*)buffer;cksum = (cksum 16) + (cksum & 0xffff);cksum += (cksum 16);return (USHORT)(cksum);/利用TCP connect()方法對(duì)目的主機(jī)的指定端口范圍掃描void ConnectScan(int startport,int endport,char hostname)int i,status;SOCKET sock=INVALID_SOCKET;strncpy(char *)&dest,s

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論