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

下載本文檔

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

文檔簡介

1、文檔收集于互聯(lián)網(wǎng),已重新整理排版.word版本可編輯歡迎下載支持.課程設(shè)計任務(wù)書【設(shè)計目的】加深對TCP/IP協(xié)議的理解,熟悉Socket編程【設(shè)計任務(wù)】實(shí)現(xiàn)一個掃描器,心須能夠完成以下所有功能:使用TCP connect.TCP SYN 和 TCP FIN 進(jìn)行端口掃描使用 ICMP echo 掃描實(shí)現(xiàn)IP掃描。并把結(jié)果記錄下來。【設(shè)計要求】 Windows或Linux環(huán)境下,程序在單機(jī)上運(yùn)行。演示:使用端口掃描對一臺主機(jī)進(jìn)行掃描”并顯示結(jié)果(_臺 主機(jī)上有哪些端口是打開的L對一個網(wǎng)段進(jìn)行IP掃描,顯 示結(jié)果(一個網(wǎng)段內(nèi)有哪些主機(jī)是開機(jī)的友好的用戶界面【設(shè)計要求】程序源代碼,必須有詳細(xì)的注釋

2、。項(xiàng)目設(shè)計報告。1文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編借.網(wǎng)段和端口掃描程序一、概述1.1 SS口掃描I1.2端口掃描當(dāng)用技術(shù)簡介21.2.1 connect。掃描21.2.2 SYN 掃描31.2.3 XMAS TREE 掃描313網(wǎng)段掃描4二需求分析52.1設(shè)計功能52.2設(shè)計要求5三、概要設(shè)計53.1設(shè)計概念和處理流程53-2結(jié)構(gòu)設(shè)計73.2.1數(shù)據(jù)結(jié)構(gòu)及定義73.2.2接口函數(shù)8四、細(xì)設(shè)設(shè)計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動態(tài)鏈接庫14154.2.4計算檢驗(yàn)

3、和154.2.5網(wǎng)段掃描164.2.6端口掃描17五、總結(jié)與體會195.1程序運(yùn)行與調(diào)試195.2體會20六、參考文獻(xiàn)216.1參考書目216-2引用網(wǎng)址21一、概述11端口掃描端口掃描是指利用TCP協(xié)議的面向連接的特性,使用木地計算機(jī) 試圖與目的主機(jī)的某個端口建立連接,以此來試探目的主機(jī)的一些端 口的具體狀態(tài),如是否打開,若是打開的又運(yùn)行什么樣的程序(利用 熟知端口很容易知道)。端口掃描有很多技術(shù)實(shí)現(xiàn)。其中最常用的有: connect ()掃描,TCP SYN 掃描,TCP FIN 掃描,TCP NULL 掃描,XMAS- TREE掃描(圣誕樹掃描)等等。在本程序中使用的是connect (

4、)掃描。12端口掃描常用技術(shù)簡介1. 2. 1 connect ()掃描此掃描的原理是,木地計算機(jī)利用TCP協(xié)議的三次握手原理(RFC 793)試圖與網(wǎng)絡(luò)上一臺主機(jī)或服務(wù)器建立TCP連接。如果目的主機(jī) 或服務(wù)器回送SYX/ACK則說明該端口開放,否則該端口關(guān)閉。具體的過程:1. Client 端發(fā)送 SYN2. Server端發(fā)送SYX/ACK (該端口開放),或Server端發(fā)送 RST/ACK(該端口關(guān)閉),若無應(yīng)答可能目的主機(jī)或服務(wù)器不可達(dá)。3. Client端發(fā)送ACK,連接建立。4. Client端主動斷開連接,連接關(guān)閉。過程圖如下:1.2.2 SYN 掃描SYN掃描前兩步與conn

5、ect ()掃描相同,只是最后一步,Client 端發(fā)送的不是ACK確認(rèn)報文而是RST報文,這樣三次握手過程就沒有完成,Client與Server也就沒有建立TCP連接,因此前述過程不會被Sever端記錄到系統(tǒng)日志中,掃描更加隱蔽。過程圖如下:1.2.3 XMAS-TREE 掃描通過發(fā)送帶有以下標(biāo)志位TCP數(shù)據(jù)包URG, PSH, FIX來試探主機(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)控制報文協(xié)議)對某一網(wǎng)段的所 有IP地址發(fā)送

6、ICMP報文,測試IP地址所對應(yīng)的主機(jī)具體情況(如 是否開機(jī)等)。所以對目的主機(jī)回答的ICMP報文進(jìn)行分析是網(wǎng)段 掃描的關(guān)鍵。常見的報文類型有:類型(type)代碼(code)描述差錯查詢00回顯回答*31主機(jī)不可達(dá)*3端口不可達(dá)*80請求回顯*二、需求分析2.1設(shè)計功能實(shí)現(xiàn)一個掃描器,使用TCP connect、TCP SYN或TCP SYN進(jìn)行端口掃描,使用ICMP echo掃描實(shí)現(xiàn)IP掃描,并記錄結(jié)果。2. 2設(shè)計要求Windows或Linux環(huán)境下,程序應(yīng)在單機(jī)上運(yùn)行。使用端口掃描對一臺主機(jī)進(jìn)行掃描,并顯示結(jié)果,在一定的端口 范圍內(nèi),該主機(jī)由哪些端口是打開的。對一個網(wǎng)段進(jìn)行IP掃描,顯

7、 示結(jié)果,該網(wǎng)段的哪些主機(jī)是開機(jī)的。友好的界面,便于用戶操作,完成全部設(shè)計功能。三、概要設(shè)計3.1設(shè)計概念和處理流程程序使用Windows Sockets API編程,利用winsock2庫函數(shù)提供的函數(shù)實(shí)現(xiàn)與主機(jī)間的連接,發(fā)送ICMP報文。詳見Winsock Referen:us/librarWwindows/dcsklop/ms741416(v=vs.85)aspx用戶首先選擇要使用的功能,程序共有兩大功能:端口掃描和IP 網(wǎng)段掃描。端口掃描的主要功能有,根據(jù)用戶輸入的主機(jī)名或IP地 址以及端口范圍進(jìn)行connect()掃描。當(dāng)用戶輸入完必要的信息并擊確 認(rèn)后,程序進(jìn)行掃描,不過不建議端口

8、區(qū)間過于龐大,等待一段時間 后用戶界而會顯示所指定IP地址主機(jī)的端口使用情況,哪些端口是 打開的,哪些是關(guān)閉的。IP網(wǎng)段掃描的主要功能有,用戶輸入某個網(wǎng) 段起始IP地址和結(jié)束IP地址,確認(rèn)后,程序根據(jù)所輸入的網(wǎng)段號, 對網(wǎng)段類的每一個IP地址發(fā)送ICMP請求回顯報文,如果主機(jī)處于 開機(jī)狀態(tài)那么將會回送回答報文;如果主機(jī)不可達(dá)(在同一個網(wǎng)內(nèi)), 則就能夠判斷該IP所對應(yīng)的主機(jī)處于關(guān)機(jī)狀態(tài)。當(dāng)用戶選擇退出功 能時,釋放資源,程序關(guān)閉。程療;流程圖3.2結(jié)構(gòu)設(shè)計3.2.1數(shù)據(jù)結(jié)構(gòu)及定義所使用的宏定義,IP數(shù)據(jù)報首部,首部固定20字節(jié),數(shù)據(jù)結(jié)構(gòu)定義如下:#dcfine ICMP_ECHO_REQUES

9、T_TYPE8/ICMP請求類型#dcfine ICMP_ECHO_REQUEST_CODE0/ICMP請求代碼#define ICMP_ECHO_REPLY_TYPE0#definc ICMP_ECHO_REPLY_CODE0#define ICMP_MINIMUM_HEADER8unsigned chariphVerLen;unsigned charipTOS;unsigned shortipLe ngh;長度unsigned shortipID;一個數(shù)據(jù)報unsigned shortipFlags;unsigned charipTTL;unsigned charipProtocol;IC

10、MP 等unsigned shortipChecksum;unsigned longipSource;unsigned longipDestination;typedef struct ip_hdrIP_HDR,*PIP_HDR;/版本號和頭長度(各占4位)/服務(wù)類型/封包總長度,即整個IP報的/封包標(biāo)識,惟一標(biāo)識發(fā)送的每/標(biāo)志/生存時間,就是TTL/協(xié)議,可能是TCP、UDP、/校驗(yàn)和/源IP地址/ LI標(biāo)IP地址IP數(shù)據(jù)報格式ICMP報文首部格式,8個字節(jié),數(shù)據(jù)結(jié)構(gòu)定義如下: typedef struct icmp_hdrunsigned charicmp_type;類型unsigned

11、charicmp_code;代碼unsigned shorticmp_checksum;檢驗(yàn)和unsigned shorticmp_id;唯一請求ID,通常使用進(jìn)程PIDunsigned shorticmp_sequence;序列號unsigned longicmp_timestamp;時間戳 ICMP_HDR盧PICMP_HDR;3.2.2接口函數(shù)Void InitializeWinsock(),初始化 Winsock 動態(tài)鏈接庫。Void Resolove(char hostnameJ),解析主機(jī)名(或 IP 地址),該函 數(shù)是公共接口函數(shù),端口掃描和IP網(wǎng)段掃描都使用該函數(shù)解析地址。 函

12、數(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,ch

13、ar endhostf),通過發(fā)送 ICMP, 檢測某個網(wǎng)段上主機(jī)的具體狀態(tài)。函數(shù)的兩個參數(shù)starthostendhost 分別代表用戶給定的起始IP地址和結(jié)尾IP地址。該函數(shù)內(nèi)部調(diào)用了 InitializeWinsock()Resolove() ResoloveIPAddr()、Assemble() 以及 庫函數(shù)sendto()和recvfrom()o通過這些函數(shù)的調(diào)用實(shí)現(xiàn)了對指定網(wǎng)絡(luò) 區(qū)間的ICMP掃描。connectScan(char startport,char endport,hostname),該函數(shù)把用 戶輸入的主機(jī)名(或IP地址)寫入sin_addr.s_addr,起始端口寫

14、入 sin_port 中。函數(shù)調(diào)用了 InitializeWinsock()、Resolove()以及庫函數(shù) connect() shutdown。實(shí)現(xiàn)了利用connect()系統(tǒng)函數(shù)對指定主機(jī)端 口區(qū)間掃描。細(xì)設(shè)設(shè)計4.1實(shí)現(xiàn)原理4.1.1 connect()函數(shù)端口掃描的原理首先要明口 TCP報文段的首部格式?,F(xiàn)在分別介紹各個字段的具體含義。(1)源端口和目的端口各占 兩個字節(jié)。端口是運(yùn)輸層與應(yīng)用層的服務(wù)。(2)序號占4個字節(jié)。 TCP把傳送的數(shù)據(jù)流中的每一個字節(jié)都編上一個序號。(3)確認(rèn)號 占4個字節(jié)。是指期望對方的下一個報文段的數(shù)據(jù)的第一個字節(jié)的序 號。(5)數(shù)據(jù)偏移占4位。它指出TC

15、P報文段的數(shù)據(jù)起始處距離TCP報文段的起始距離有多遠(yuǎn)。(6)保留。(7)緊急比特URG當(dāng)URG=1時,表明緊急指針字段有效。告訴系統(tǒng)有緊急數(shù)據(jù),應(yīng)盡快 發(fā)送。(8)確認(rèn)比特ACK只有當(dāng)ACK=1時確認(rèn)號字段才有效。(9) 推送比特PSH將數(shù)據(jù)流盡快的推送給應(yīng)用進(jìn)程。而不是等到緩沖區(qū) 滿后才將數(shù)據(jù)送至應(yīng)用程序。(10)復(fù)位比特RST當(dāng)RST=1時,表 明TCP出現(xiàn)錯誤,必須釋放連接,然后重新建立運(yùn)輸連接。復(fù)位比 特還用來拒絕一個非法報文或拒絕打開一個連接。(11)同步比特SYN當(dāng)SYN=1而ACK=0是表明這是一個請求連接報文,若同意連接則 對方應(yīng)該回送SYN=1, ACK=lo (12)終止比

16、特FINo用于釋放一個連接。(13)檢驗(yàn)和占2個字節(jié)。設(shè)客戶進(jìn)程運(yùn)行在木地計算機(jī)上。它首先向其TCP發(fā)出主動打開(active open)命令,表明要與某個IP地址的某個端口建立運(yùn)輸連接。首先發(fā)送SYN=1, SEQ=X的報文給目標(biāo)主機(jī)的某端口,當(dāng)木地 計算機(jī)收到SYN=1, ACK=1的報文時,表明對方主機(jī)同意連接,這 是還需發(fā)送一個ACK以確認(rèn)連接。這樣,經(jīng)過三次握手,一條TCP 連接鏈路就建立完成。在Winsock2環(huán)境下,系統(tǒng)類庫提供了 connect()接口函數(shù)。一下是 函數(shù)原型:connect functionint connect(SOCKET s,_In_ const stru

17、ct sockaddr Fame,_In_ int namelen);s表示一個為連接的socket, name表示一個指向sockaddr的結(jié)構(gòu) 體指針,namelen是sockaddr中name域的比特長度。利用此函數(shù), 可以非常方便的連接一個套接字。4. 1. 2 ICMP網(wǎng)段掃描的原理因特網(wǎng)控制報文協(xié)議 ICMP (Internet Control Message Protocol) RFC792o ICMP允許主機(jī)或路由器報告差錯情況和提供有關(guān)異常情 況的報告。ICMP報文作為IP層數(shù)據(jù)報的數(shù)據(jù),加上數(shù)據(jù)報的首部, 組成數(shù)據(jù)發(fā)送出去。ICMP報文的種類有兩種,即ICMP差錯報告報文

18、和ICMP詢問報文。ICMP報文的前4個字節(jié)是統(tǒng)一格式,共有三個字 段:類型,代碼和檢驗(yàn)和。對網(wǎng)段的主機(jī)掃描就是利用了這三個字段。 根據(jù)主機(jī)發(fā)回的不同類型和代碼對主機(jī)的狀態(tài)進(jìn)行判斷。ICMP的差錯報文共有5種:(1) 終點(diǎn)不可達(dá)終點(diǎn)不可達(dá)分為:網(wǎng)絡(luò)不可達(dá),主機(jī)不可達(dá), 協(xié)議不可達(dá),端口不可達(dá)。(2)源站抑制當(dāng)路由器或主機(jī)由于擁塞而丟棄數(shù)據(jù)包時,就向 源站發(fā)生源站抑制報文。(3)時間超時當(dāng)路由器手打生存時間為零的數(shù)據(jù)包時,除丟棄 該數(shù)據(jù)報外,還向源站發(fā)送時間超過報文。(4)參數(shù)問題(5)改變路由(重定向)對一個網(wǎng)段掃描時,主要利用(1)和(3)兩種報文。ICMP的詢問報文主要有4種:(1)回送請

19、求和回答(Ping)(2)時間戳和回答(常用來記錄一個主機(jī)到另一個主機(jī)的延遲)(3)掩碼請求和回答(4)路由詢問和回答同樣,主要利用(1)和(2)兩種報文。Winsock2提供sendto()和recvfrom()兩個函數(shù)分別來發(fā)送IP層數(shù) 據(jù)報。函數(shù)原型分別為:sendto functionint sendto(SOCKET s,n_const char *bufn_int len#int flagsconst struct sockaddr *tofint tolenrecvfrom functionint recvfrom(_In_SOCKET s,_Out_Out_Inout_opt_

20、char *bufrint len,int flags,struct sockaddr *from, int *fromlen結(jié)合原始套接字可以很方便做到將一個ICMP數(shù)據(jù)包封裝到IP數(shù) 據(jù)包中,以及從一個IP數(shù)據(jù)報中解析岀包含ICMP報文。下而對原 始套接字做下簡單的介紹。原始套接字提供普通的TCP和UDP套接字所不提供的一下3個 功能。有了原始套接字,進(jìn)程可以讀寫ICMP和IGMP等分組。舉例來 說ping程序就是使用原始套接字收發(fā)ICMP分組,網(wǎng)段掃描也是 基于這個原理。有了原始套接字,進(jìn)程可以讀寫內(nèi)核不處理其協(xié)議字段的IPv4數(shù) 據(jù)包。有了原始套接字,進(jìn)程還可以使用IP_HDRINCL

21、套接字選項(xiàng)自行 構(gòu)造IPv4首部。這一點(diǎn)是非常強(qiáng)大的。在利用Winsock編寫原始套接字時要注意程序應(yīng)該取得管理員權(quán)限, 因?yàn)榇蠖鄶?shù)操作系統(tǒng)對原始套接字的創(chuàng)建有較為嚴(yán)格的限制。如果沒 有取得管理員權(quán)限,那么在創(chuàng)建原始套接字的時候會報出 10013-Permission denied.的錯誤,從而無法創(chuàng)建套接字。4.2函數(shù)實(shí)現(xiàn)4.2.1初始化winsock動態(tài)鏈接庫void InitializeWinsock()int status;WSADATA wsa;if (status=WSAStartup(MAKEWORD(2,2),&wsa)!=0)printf(HFailed to WSAStar

22、tupO: %d.n,WSAGetLastError(); exit(EXIT_FAILURE);)函數(shù)調(diào)用Winsock2提供的WSAStartupO函數(shù),初始化動態(tài)鏈接庫。4.2.2初始化ICMP首部void InitIcmpHeader(ICMP_HDR* icinp_hdr)char bufHsizeof(ICMP_HDR) + 32;/ICMP報文類型,類型為8,代碼為0icmp_hdr-icmp_type = ICMP_ECHO_REQUEST_TYPE;/ 請求回顯icmp_hdr-icmp_code = ICMP_ECHO_REQUEST_CODE;icmp_hdr-icmpj

23、d= (USHORT)GetCurrentProcessId();icmp_hdr-icmp_checksum = 0;icmp_hdr-icmp_sequence = 0;icmp_hdr-icmpjimestanip= GetTickCount();/往ICMP頭部填充信息memset(&buffsizcof(ICMP_HDR), E, 32);函數(shù)為ICMP報文首部中各個字段賦值,達(dá)到初始化的目的。其中 比較重要的語句有icmp_hdricmpjype = ICMP_ECHO_REQUEST_TYPE;/ 請求回顯icmp_hdr-icmp_code = ICMP_ECHO_REQUES

24、T_CODE;這樣賦值后,就把ICMP報文設(shè)宜成ICMP詢問報文,回送請求和回答。void Resolove(char hostname)if(isdigit(hostname0)判斷主機(jī)名是否為數(shù)字/printf(H執(zhí)行 inet_addr()iT);dest.sin_addr.s_addr = inet_addr(hostname); 將主機(jī)地址寫入 s_addr /printf(H%dn,WSAGetLastError();)else if( (host=gethostbyname(hostname) != 0)/判斷所給主機(jī)名是否與 host 中的一致 /printf(執(zhí)行 getho

25、stbyname().n,r);strncpy(char *)&dest.sin_addr ,(char * )host-h_addr_list0 , sizeof dest.sin_addr);/printfC完成。nH);)elseprintf(解析主機(jī)失敗。n”);exit(EXIT_FAILURE);)根據(jù)用戶輸入地址字符串轉(zhuǎn)化成相應(yīng)的地址字段,寫入 dest. sin_addr中。如果用戶輸入的點(diǎn)分十進(jìn)制。則就會調(diào)用相應(yīng)的 inet_addr ()函數(shù),否則調(diào)用gethostbyname (),在寫入地址字段。4. 2. 4計算檢驗(yàn)和unsigned short checksum(u

26、nsigned short buffer, int size)unsigned long cksum=0;while (size 1)cksum += *buffcr+;size -= sizeof(USHORT);if (size)cksum += *(UCHAR*)buffer;)cksum = (cksum 16) + (cksum & Oxffff);cksum += (cksum 16);return (USHORT)(-cksum);根據(jù)TCP/IP協(xié)議,IP數(shù)據(jù)報在傳輸過程前必須計算檢驗(yàn)和,對 收到的數(shù)據(jù)也要計算檢驗(yàn)和。該函數(shù)實(shí)現(xiàn)了首部的檢驗(yàn)和計算。4. 2. 5網(wǎng)段掃描主要語句

27、如下:for(i = startport: i= endport; i+)sock = socket(AFJNET , SOCK_STREAM , IPPROTO_TCP); 創(chuàng)建一個 Socket if(sock=INVALID_SOCKET)printf(NCreate socket failed: %dnu.WSAGetLastError();exit(EXIT_FAILURE);主機(jī)字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序dest.sin_port = htons(i);用此Socket連接目的主機(jī),核心代碼status = connect(sock , (struct sockaddr *)&dcst

28、, sizeof dest);if(status = SOCKET.ERROR) / 連接失敗switch(WSAGetLastError()case 10060:printf(M%st%dtERRORttConnection timed outnH, hostname, i);break;case 10061:printf(H%st%dtERRORttConnection refused】”,hostname , i);break;default:printf(H%st%dtERRORtCode:nWSAGetLastError();break;/fflush(stdout);else 連接

29、成功printf(n%st%dtPORT OPENnH, hostname ,i);/關(guān)閉收發(fā)服務(wù)if( shutdown( sock .SD_BOTH ) = SOCKET_ERROR )printf(HFailed to shutdown the connect: %dnn,WSAGetLastError();exit(EXIT.FAILURE);closesocket(sock);關(guān)閉 Socket,回收資源/WSACleanupO;利用一個for(;)循環(huán),對確定的起始和終止IP地址的內(nèi)的所有可能存在的主機(jī)發(fā)送,請求回顯的ICMP報文,并對返回的ICMP報文進(jìn)行分析,提取出type和c

30、ode字段,根據(jù)ICMP報文格式所泄義的數(shù)值,對各個主機(jī)判斷,并打卬信息。4. 2.6端口掃描for(i = startport: i= endport; i+)sock = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP); 創(chuàng)建一個 Socket if(sock=INVALID_SOCKET)(printf(HCreate socket failed: %dirWSAGetLastError(); exit(EXIT_FAILURE);主機(jī)字廿序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序dest.sin_port = htons(i);用此Socket連接目的主機(jī),核心代碼st

31、atus = connect(sock , (struct sockaddr *)&dest, sizeof dest);if(status = SOCKET_ERROR) / 連接失敗switch(WSAGetLastError()case 10060:printf(%st%dtERRORttConnection timed outnH, hostname, i); break;case 10061:printf(M%st%dtERRORttConnection refusednH t hostname , i); break;default:printf(M%st%dtERRORtCode

32、:nMAVSAGetLastError(); break;/fflush(stdout);else 連接成功printf(%st%dtPORT OPENnH, hostname ,i);/關(guān)閉收發(fā)服務(wù)if( shutdown( sock ,SD_BOTH ) = SOCKET_ERROR )printf(HFailed to shutdown the connect: %dn,WSAGetLastError(); exit(EXIT.FAILURE);closesocket(sock);關(guān)閉 Socket,回收資源/WSACleanupO;文檔收集于互聯(lián)網(wǎng),已重新整理排版.word版本可編輯歡

33、迎下載支持. 函數(shù)同樣利用一個for(;)循環(huán)對給定的主機(jī)的端口區(qū)間掃描。 調(diào)用WSAGetLastErrorO庫函數(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 t

34、he 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 runningWSAE

35、LOOP10062Cannot translate nameCannot translate a name摘自:us/library/windows/dcsklop/ms740668(、r=vs.85)aspx五、總結(jié)與體會5.1程序調(diào)試與運(yùn)行程序主界面IP網(wǎng)段掃描端口掃描5.2體會通過本次的課程設(shè)計加深了木人對TCP/IP協(xié)議特別是網(wǎng)絡(luò)層協(xié) 議,IP首部格式,ICMP首部格式的理解。對Windows網(wǎng)絡(luò)編程也有 初步的了解,掌握了基本的套接字程序的編寫。理解原始套接字的運(yùn) 行機(jī)制,加深一些協(xié)議字段的理解。編寫過程遇到的困難也不少,但1文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編借.文檔收集于

36、互聯(lián)網(wǎng),已重新整理排版.word版本可編輯歡迎下載支持.是依靠鉆研精神,逐步對網(wǎng)絡(luò)編程步驟產(chǎn)生了整體的印象,這對以后 的學(xué)習(xí)也是一筆寶貴的財富。以前學(xué)習(xí)總是停留在紙面上理論上,雖 然貌似一些概念是清楚了,但是這樣的記憶是不長久的。只有通過理論聯(lián)系實(shí)際,編寫一些代碼,實(shí)現(xiàn)一些功能,才能加強(qiáng)記憶,學(xué)以致 用。六、參考文獻(xiàn)6.1參考書目1 W. Richard Stevens,Bill Fenner, Andrew M Rudoff Unix Network Programming Volumel:The Sockets Networking API, Third Edition. Pearson

37、Education, 20102J Wnthony Jones, Jim Ohlund Network Programming for Microsoft Windows, Second Edition. Microsoft Press, 20023 謝希仁.計算機(jī)網(wǎng)絡(luò)(第四版)電子工業(yè)出版社,20034 周鳴爭,嚴(yán)楠,丁剛等.計算機(jī)網(wǎng)絡(luò)教程.清華大學(xué)出版社,20116.2引用網(wǎng)址us/library/windows/dcskk)p/ms741416(v=vs85)aspx us/library/windows/dcskioD/ms740668(v=vs85)asDX/rfc792/70010

38、&htm/30564himcn/RFC源代碼Scanncr.h/IP首部typedef stnict ip_hdrunsigned chariphVerLen;版本號和頭長度(各占4位)unsigned charipTOS;/服務(wù)類型unsigned shortipLength;/封包總長度,即整個IP報的長度unsigned shortipID:/封包標(biāo)識,惟一標(biāo)識發(fā)送的每一個數(shù)據(jù)報unsigned shortipFlags;/標(biāo)志unsigned charipTTL;/生存時間,就是TTLunsigned charipProtocol;協(xié)議,可能是TCP. UDP、ICMP等unsigne

39、d shortipChecksum;/校驗(yàn)和unsigned longipSource;/源IP地址unsigned longipDcstination;/目標(biāo)IP地址IP_HDR 盧 PIP_HDR;/ICMP首部typcdef stnict icmp_hdrunsigned char unsigned char unsigned short unsigned short unsigned shorticmp_type; icmp_codc; icinp_checksum; icinpjd: icmp_scqucncc;unsigned longicmpjiniestamp:類型代碼/檢驗(yàn)和

40、唯一請求ID.通常使用進(jìn)程PID/序列號/時間戳 ICMP_HDR嚴(yán)PICMP_HDR;Scannc匚c#include #includc #includc #include #includc pragma commciH(lib.”ws2_32lib”);#include HScanner.hn#define ICMP_ECHO_REQUEST_TYPE 8#dcfine ICMP_ECHO_REQUEST_CODE 0/ICMP請求類型/ICMP請求代碼#dcfine ICMP_ECHO_REPLY_TYPE0#dcfine ICMP_ECHO_REPLY_CODE0#define ICM

41、P_MINIMUM_HEADER 8 struct hostent *host;struct sockaddrjn dest;stnict sockaddrjn from;注釋:常見的ICMP報文類型記錄主機(jī)信息 存儲目的主機(jī)信息 用于回顯/類型代碼/00/31/33/80描述回顯回答 主機(jī)不可達(dá) 端口不可達(dá) 請求回顯/初始化winsock動態(tài)鏈接庫void InitializeWinsockOint status;WSADATA wsa:if (status=WSAStartup(MAKEWORD(2,2),&wsa)!=0)printf(HFailed to WSAStartup(): %

42、d.nM.WSAGetLastError(); cxit(EXIT_FAILURE);/初始化ICMP首部void InitIcmpHeader(ICMP_HDR* icmp_hdr)char buffsizeof(ICMP_HDR) + 32;/ICMP報文類型,類型為8,代碼為0icmp_hdr-icmp_type = ICMP_ECHO_REQUEST_TYPE;/ 請求回顯icmp_hdr-icmp_code = ICMP_ECHO_REQUEST_CODE;icmp_hdr-icinp_id= (USHORT)GetCurrentProcessId();icmp_hdr-icmp_c

43、hecksum = 0;icnip_hdr-icmp_sequence = 0; icnip_hdr-icmp_timestamp= GetTickCountO;往ICMP頭部填充信息memset(&buffsizeof(ICMP_HDR), 32);地址解析,解析IP地址或域名void Resolove(char hostnanie)if(isdigit(hostnanie0) 判斷主機(jī)名是否為數(shù)字/printf(執(zhí)行 inct_addrOAiT);dest.sin_addr.s_addr = inet_addr(hostname); /4主機(jī)地址寫入 s_addr /printf(,%dn

44、,WSAGetLastError();else if( (host=gethostbyname(hostname) != 0)/判斷所給主機(jī)名是否與 host 中的一致/printf(n 執(zhí)行 gethostbyname().AnH);strncpy(char )&dest.sin_addr, (char *)host-h_addr_list0, sizeof dest.sin_addr); /printf(H完成。nH);elseprintfC解析主機(jī)失敗。nu); cxit(EXIT_FAILURE);提取目的地址低三位,用于網(wǎng)段掃描void RcsoloveIPAddr(char sta

45、rthost(,char endhost,int *startjnt *end) int cdl=0;int cd2=0;int c 訂=O;int ci2=0;char cl4),c24J;while (*starthost!=,0,&*cndhost!=0)if (*starthost!=)if (cdl3)if(*starthost=/)+cdl;elseclcil=*starthost;+cil;+starthost;)if(*endhost!=AO)if(cd2v3)if(*endhost=.*)+cd2;elsec2ci2=*endhost;+ci2;+endhost;)cl3=c

46、23=0,;*start=atoi(cl);*end=atoi(c2);)將當(dāng)前IP低三位與網(wǎng)段號組裝,用于發(fā)送ICMP的目的主機(jī)IP地址char* Assemble(char starthost,int cur)int i=O.cd=O;char appendix4,*tmp=starthost;itoa(cur,appendix J 0);/printf(”sn”,appendix);while (cd 1)(cksum += *buffer+;size -= sizeof(USHORT);if (size)cksum += *(UCHAR*)buffer;cksum = (cksum 1

47、6) + (cksum & Oxffff);cksum += (cksum 16);return (USHORT)(cksum);利用TCPconnect()方法對目的主機(jī)的指泄端口范恫掃描void ConnectScan(int endportxhar hostnamef)int i,status;SOCKET sock=INVALID_SOCKET; strncpy(char *)&dest/Hsizeof dest);dest.sin_family = AF_INET;InitializeWinsockO:Rcsolove(hostname);printf(H

48、Start scanning.nM);printf(,HostttPorttStatusn);for(i = startport; i= endport; i+)sock = socket(AF_INET. SOCK.STREAM . IPPROTO_TCP); 創(chuàng)建一個 Socket if(sock=INVALID_SOCKET) printf(HCreate socket failed: %dnWSAGetLastError(); exit(EXIT.FAILURE);)主機(jī)字節(jié)序轉(zhuǎn)換為網(wǎng)絡(luò)字節(jié)序dest.sin_port = htons(i);/用此Socket連接目的主機(jī),核心代碼st

49、atus = connect(sock , (struct sockaddr *)&dest, sizeof dest);if(status = SOCKET_ERROR)/ 連接失敗1文檔來源為:從網(wǎng)絡(luò)收集整理.word版本可編借.switch(WSAGetLastErrorO)case 10060:printf(%st%dtERRORttConnection timed outnH, hostname, i); break;case 10061:printf(%st%dtERRORttConnection refusednH, hostname 9 i); break;default:pr

50、intf(,%st%dtERRORtCode:n,WSAGetLastError(); break;/fflush(stdout);)else 連接成功printf(H%st%dtPORT OPENS, hostname j);/關(guān)閉收發(fā)服務(wù)if( shutdown( sock ,SD_BOTH )= SOCKET.ERROR )printf(”Failed to shutdown the connect: %dnM,WSAGetLastErrorO); exit(EXIT_FAILURE);closesocket(sock);關(guān)閉Socket,回收資源利用ICMP進(jìn)行網(wǎng)段掃描void Seg

51、mentScan(char starthostxhar endhost)int status,tick, start, end./記錄狀態(tài)信息獲取當(dāng)前系統(tǒng)啟動時間的亳秒數(shù)起始網(wǎng)絡(luò)號結(jié)尾網(wǎng)絡(luò)號用于for循環(huán)等WSADATA wsa;/char starthost50,endhost(50;SOCKET sock=INVALID_SOCKET; char recvBuf 1024*5;設(shè)置接收緩沖區(qū),這里設(shè)為5KICMP_HDR* icmp_hdr.*recvJcmp;發(fā)送和接收的ICMP報文首部定unsigned short nSeq = 0;int nLen = sizeof(from);創(chuàng)建ICMP數(shù)據(jù)包c(diǎn)har buffsizeof(ICMP_HDR) + 32;icmp.hdr = (ICMP_HDR*)buff;加載動態(tài)鏈接庫InitializeWinsockO:創(chuàng)建原始套接字/AFJNET表示地址族為IPV4,/SOCK_

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論