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

最新計算機網(wǎng)絡課程設計基于ICMPTCP的網(wǎng)段端口掃描C語言編寫 免費下載.doc.doc 免費下載

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

文檔簡介

ronnie課 程 設 計 任 務 書【設計目的】 加深對TCP/IP協(xié)議的理解,熟悉Socket編程【設計任務】 實現(xiàn)一個掃描器,必須能夠完成以下所有功能:使用TCP connect、TCP SYN和TCP FIN進行端口掃描,使用ICMP echo 掃描實現(xiàn)IP掃描。并把結(jié)果記錄下來?!驹O計要求】l Windows或Linux環(huán)境下,程序在單機上運行。l 演示:使用端口掃描對一臺主機進行掃描,并顯示結(jié)果(一臺主機上有哪些端口是打開的)。對一個網(wǎng)段進行IP掃描,顯示結(jié)果(一個網(wǎng)段內(nèi)有哪些主機是開機的)。l 友好的用戶界面【設計要求】l 程序源代碼,必須有詳細的注釋。l 項目設計報告。32網(wǎng)段和端口掃描程序一、 概述11.1端口掃描11.2端口掃描常用技術簡介21.2.1 connect()掃描21.2.2 SYN掃描31.2.3 XMAS-TREE掃描31.3網(wǎng)段掃描4二、需求分析52.1 設計功能52.2 設計要求5三、概要設計53.1設計概念和處理流程53.2 結(jié)構(gòu)設計73.2.1 數(shù)據(jù)結(jié)構(gòu)及定義73.2.2 接口函數(shù)8四、細設設計94.1 實現(xiàn)原理94.1.1 connect()函數(shù)端口掃描的原理94.1.2 ICMP網(wǎng)段掃描的原理114.2 函數(shù)實現(xiàn)144.2.1 初始化winsock動態(tài)鏈接庫144.2.3地址解析154.2.4 計算檢驗和154.2.5 網(wǎng)段掃描164.2.6 端口掃描17五、 總結(jié)與體會195.1 程序運行與調(diào)試195.2 體會20六、 參考文獻216.1 參考書目216.2 引用網(wǎng)址211、 概述1.1端口掃描端口掃描是指利用TCP協(xié)議的面向連接的特性,使用本地計算機試圖與目的主機的某個端口建立連接,以此來試探目的主機的一些端口的具體狀態(tài),如是否打開,若是打開的又運行什么樣的程序(利用熟知端口很容易知道)。端口掃描有很多技術實現(xiàn)。其中最常用的有:connect()掃描,TCP SYN掃描,TCP FIN掃描,TCP NULL掃描,XMAS- TREE掃描(圣誕樹掃描)等等。在本程序中使用的是connect()掃描。1.2端口掃描常用技術簡介1.2.1 connect()掃描此掃描的原理是,本地計算機利用TCP協(xié)議的三次握手原理(RFC 793)試圖與網(wǎng)絡上一臺主機或服務器建立TCP連接。如果目的主機或服務器回送SYN/ACK則說明該端口開放,否則該端口關閉。具體的過程:1. Client端發(fā)送SYN2. Server端發(fā)送SYN/ACK(該端口開放),或Server端發(fā)送RST/ACK(該端口關閉),若無應答可能目的主機或服務器不可達。3. Client端發(fā)送ACK,連接建立。4. Client端主動斷開連接,連接關閉。過程圖如下:1.2.2 SYN掃描SYN掃描前兩步與connect()掃描相同,只是最后一步,Client端發(fā)送的不是ACK確認報文而是RST報文,這樣三次握手過程就沒有完成,Client與Server也就沒有建立TCP連接,因此前述過程不會被Sever端記錄到系統(tǒng)日志中,掃描更加隱蔽。過程圖如下:1.2.3 XMAS-TREE掃描通過發(fā)送帶有以下標志位TCP數(shù)據(jù)包URG,PSH,FIN來試探主機。在目標端口開放的情況下不放回任何信息。端口開放:發(fā)送URG/PSH/FIN,沒有響應。端口關閉:1.發(fā)送URG/PSH/FIN,沒有響應。2響應RST。1.3網(wǎng)段掃描網(wǎng)段掃描是指利用ICMP(因特網(wǎng)控制報文協(xié)議)對某一網(wǎng)段的所有IP地址發(fā)送ICMP報文,測試IP地址所對應的主機具體情況(如是否開機等)。所以對目的主機回答的ICMP報文進行分析是網(wǎng)段掃描的關鍵。常見的報文類型有:類型(type)代碼(code)描述差錯查詢00回顯回答*31主機不可達*3端口不可達*80請求回顯*二、需求分析2.1 設計功能實現(xiàn)一個掃描器,使用TCP connect、TCP SYN或TCP SYN進行端口掃描,使用 ICMP echo掃描實現(xiàn)IP掃描,并記錄結(jié)果。2.2 設計要求Windows或Linux環(huán)境下,程序應在單機上運行。使用端口掃描對一臺主機進行掃描,并顯示結(jié)果,在一定的端口范圍內(nèi),該主機由哪些端口是打開的。對一個網(wǎng)段進行IP掃描,顯示結(jié)果,該網(wǎng)段的哪些主機是開機的。友好的界面,便于用戶操作,完成全部設計功能。三、概要設計3.1設計概念和處理流程程序使用Windows Sockets API編程,利用winsock2庫函數(shù)提供的函數(shù)實現(xiàn)與主機間的連接,發(fā)送ICMP報文。詳見Winsock Referen:/en-us/library/windows/desktop/ms741416(v=vs.85).aspx用戶首先選擇要使用的功能,程序共有兩大功能:端口掃描和IP網(wǎng)段掃描。端口掃描的主要功能有,根據(jù)用戶輸入的主機名或IP地址以及端口范圍進行connect()掃描。當用戶輸入完必要的信息并擊確認后,程序進行掃描,不過不建議端口區(qū)間過于龐大,等待一段時間后用戶界面會顯示所指定IP地址主機的端口使用情況,哪些端口是打開的,哪些是關閉的。IP網(wǎng)段掃描的主要功能有,用戶輸入某個網(wǎng)段起始IP地址和結(jié)束IP地址,確認后,程序根據(jù)所輸入的網(wǎng)段號,對網(wǎng)段類的每一個IP地址發(fā)送ICMP請求回顯報文,如果主機處于開機狀態(tài)那么將會回送回答報文;如果主機不可達(在同一個網(wǎng)內(nèi)),則就能夠判斷該IP所對應的主機處于關機狀態(tài)。當用戶選擇退出功能時,釋放資源,程序關閉。程序流程圖3.2 結(jié)構(gòu)設計3.2.1 數(shù)據(jù)結(jié)構(gòu)及定義所使用的宏定義,#define ICMP_ECHO_REQUEST_TYPE 8 /ICMP請求類型#define ICMP_ECHO_REQUEST_CODE 0 /ICMP請求代碼#define ICMP_ECHO_REPLY_TYPE 0#define ICMP_ECHO_REPLY_CODE 0#define ICMP_MINIMUM_HEADER 8IP數(shù)據(jù)報首部,首部固定20字節(jié),數(shù)據(jù)結(jié)構(gòu)定義如下:typedef struct ip_hdrunsigned char iphVerLen; / 版本號和頭長度(各占4位)unsigned char ipTOS; / 服務類型 unsigned short ipLength; / 封包總長度,即整個IP報的長度unsigned short ipID; / 封包標識,惟一標識發(fā)送的每一個數(shù)據(jù)報unsigned short ipFlags; / 標志unsigned char ipTTL; / 生存時間,就是TTLunsigned char ipProtocol; / 協(xié)議,可能是TCP、UDP、ICMP等unsigned short ipChecksum; / 校驗和unsigned long ipSource; / 源IP地址unsigned long ipDestination; / 目標IP地址IP_HDR,*PIP_HDR;IP數(shù)據(jù)報格式ICMP報文首部格式,8個字節(jié),數(shù)據(jù)結(jié)構(gòu)定義如下:typedef struct icmp_hdrunsigned char icmp_type; /類型unsigned char icmp_code; /代碼unsigned short icmp_checksum; /檢驗和unsigned short icmp_id; /唯一請求ID,通常使用進程PIDunsigned short icmp_sequence; /序列號unsigned long icmp_timestamp; /時間戳 ICMP_HDR,*PICMP_HDR;3.2.2 接口函數(shù)Void InitializeWinsock(),初始化Winsock動態(tài)鏈接庫。Void Resolove(char hostname),解析主機名(或IP地址),該函數(shù)是公共接口函數(shù),端口掃描和IP網(wǎng)段掃描都使用該函數(shù)解析地址。函數(shù)首先判斷用戶輸入的IP是十進制點分地址還是域名地址,然后分別調(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),將當前IP地址轉(zhuǎn)化為字符串類型的IP地址。void SegmentScan(char starthost,char endhost),通過發(fā)送ICMP,檢測某個網(wǎng)段上主機的具體狀態(tài)。函數(shù)的兩個參數(shù)starthost、endhost分別代表用戶給定的起始IP地址和結(jié)尾IP地址。該函數(shù)內(nèi)部調(diào)用了InitializeWinsock()、Resolove()、ResoloveIPAddr()、Assemble()、以及庫函數(shù)sendto()和recvfrom()。通過這些函數(shù)的調(diào)用實現(xiàn)了對指定網(wǎng)絡區(qū)間的ICMP掃描。connectScan(char startport,char endport,hostname),該函數(shù)把用戶輸入的主機名(或IP地址)寫入sin_addr.s_addr,起始端口寫入sin_port中。函數(shù)調(diào)用了InitializeWinsock()、Resolove()以及庫函數(shù)connect()、shutdown()。實現(xiàn)了利用connect()系統(tǒng)函數(shù)對指定主機端口區(qū)間掃描。四、細設設計4.1 實現(xiàn)原理4.1.1 connect()函數(shù)端口掃描的原理首先要明白TCP報文段的首部格式。現(xiàn)在分別介紹各個字段的具體含義。(1)源端口和目的端口 各占兩個字節(jié)。端口是運輸層與應用層的服務。(2)序號 占4個字節(jié)。TCP把傳送的數(shù)據(jù)流中的每一個字節(jié)都編上一個序號。(3)確認號 占4個字節(jié)。是指期望對方的下一個報文段的數(shù)據(jù)的第一個字節(jié)的序號。(5)數(shù)據(jù)偏移 占4位。它指出TCP報文段的數(shù)據(jù)起始處距離TCP報文段的起始距離有多遠。(6)保留。(7)緊急比特URG 當URG=1時,表明緊急指針字段有效。告訴系統(tǒng)有緊急數(shù)據(jù),應盡快發(fā)送。(8)確認比特ACK 只有當ACK=1時確認號字段才有效。(9)推送比特PSH 將數(shù)據(jù)流盡快的推送給應用進程。而不是等到緩沖區(qū)滿后才將數(shù)據(jù)送至應用程序。(10)復位比特RST 當RST=1時,表明TCP出現(xiàn)錯誤,必須釋放連接,然后重新建立運輸連接。復位比特還用來拒絕一個非法報文或拒絕打開一個連接。(11)同步比特SYN 當SYN=1而ACK=0是表明這是一個請求連接報文,若同意連接則對方應該回送SYN=1,ACK=1。(12)終止比特 FIN。用于釋放一個連接。(13)檢驗和 占2個字節(jié)。設客戶進程運行在本地計算機上。它首先向其TCP發(fā)出主動打開(active open)命令,表明要與某個IP地址的某個端口建立運輸連接。首先發(fā)送SYN=1,SEQ=X的報文給目標主機的某端口,當本地計算機收到SYN=1,ACK=1的報文時,表明對方主機同意連接,這是還需發(fā)送一個ACK以確認連接。這樣,經(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表示一個為連接的socket,name表示一個指向sockaddr的結(jié)構(gòu)體指針,namelen是sockaddr中name域的比特長度。利用此函數(shù),可以非常方便的連接一個套接字。4.1.2 ICMP網(wǎng)段掃描的原理因特網(wǎng)控制報文協(xié)議ICMP(Internet Control Message Protocol)【RFC792】。ICMP允許主機或路由器報告差錯情況和提供有關異常情況的報告。ICMP報文作為IP層數(shù)據(jù)報的數(shù)據(jù),加上數(shù)據(jù)報的首部,組成數(shù)據(jù)發(fā)送出去。ICMP報文的種類有兩種,即ICMP差錯報告報文和ICMP詢問報文。ICMP報文的前4個字節(jié)是統(tǒng)一格式,共有三個字段:類型,代碼和檢驗和。對網(wǎng)段的主機掃描就是利用了這三個字段。根據(jù)主機發(fā)回的不同類型和代碼對主機的狀態(tài)進行判斷。ICMP的差錯報文共有5種:(1) 終點不可達 終點不可達分為:網(wǎng)絡不可達,主機不可達,協(xié)議不可達,端口不可達。(2) 源站抑制 當路由器或主機由于擁塞而丟棄數(shù)據(jù)包時,就向源站發(fā)生源站抑制報文。(3) 時間超時 當路由器手打生存時間為零的數(shù)據(jù)包時,除丟棄該數(shù)據(jù)報外,還向源站發(fā)送時間超過報文。(4) 參數(shù)問題(5) 改變路由(重定向)對一個網(wǎng)段掃描時,主要利用(1)和(3)兩種報文。ICMP的詢問報文主要有4種:(1) 回送請求和回答(Ping)(2) 時間戳和回答(常用來記錄一個主機到另一個主機的延遲)(3) 掩碼請求和回答(4) 路由詢問和回答同樣,主要利用(1)和(2)兩種報文。Winsock2提供sendto()和recvfrom()兩個函數(shù)分別來發(fā)送IP層數(shù)據(jù)報。函數(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é)合原始套接字可以很方便做到將一個ICMP數(shù)據(jù)包封裝到IP數(shù)據(jù)包中,以及從一個IP數(shù)據(jù)報中解析出包含ICMP報文。下面對原始套接字做下簡單的介紹。原始套接字提供普通的TCP和UDP套接字所不提供的一下3個功能。v 有了原始套接字,進程可以讀寫ICMP和IGMP等分組。舉例來說ping程序就是使用原始套接字收發(fā)ICMP分組,網(wǎng)段掃描也是基于這個原理。v 有了原始套接字,進程可以讀寫內(nèi)核不處理其協(xié)議字段的IPv4數(shù)據(jù)包。v 有了原始套接字,進程還可以使用IP_HDRINCL套接字選項自行構(gòu)造IPv4首部。這一點是非常強大的。在利用Winsock編寫原始套接字時要注意程序應該取得管理員權(quán)限,因為大多數(shù)操作系統(tǒng)對原始套接字的創(chuàng)建有較為嚴格的限制。如果沒有取得管理員權(quán)限,那么在創(chuàng)建原始套接字的時候會報出10013-Permission denied.的錯誤,從而無法創(chuàng)建套接字。4.2 函數(shù)實現(xiàn)4.2.1 初始化winsock動態(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ù),初始化動態(tài)鏈接庫。4.2.2 初始化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-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報文首部中各個字段賦值,達到初始化的目的。其中比較重要的語句有icmp_hdr-icmp_type = ICMP_ECHO_REQUEST_TYPE; / 請求回顯icmp_hdr-icmp_code = ICMP_ECHO_REQUEST_CODE;這樣賦值后,就把ICMP報文設置成ICMP詢問報文,回送請求和回答。4.2.3地址解析void Resolove(char hostname)if(isdigit(hostname0)/判斷主機名是否為數(shù)字 /printf(執(zhí)行inet_addr().n);dest.sin_addr.s_addr = inet_addr(hostname); /將主機地址寫入s_addr/printf(%dn,WSAGetLastError(); else if( (host=gethostbyname(hostname) != 0)/判斷所給主機名是否與host中的一致/printf(執(zhí)行gethostbyname().n);strncpy(char *)&dest.sin_addr , (char *)host-h_addr_list0 , sizeof dest.sin_addr);/printf(完成。n);elseprintf(解析主機失敗。n);exit(EXIT_FAILURE);根據(jù)用戶輸入地址字符串轉(zhuǎn)化成相應的地址字段,寫入dest.sin_addr中。如果用戶輸入的點分十進制。則就會調(diào)用相應的inet_addr()函數(shù),否則調(diào)用gethostbyname(),在寫入地址字段。4.2.4 計算檢驗和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ù)報在傳輸過程前必須計算檢驗和,對收到的數(shù)據(jù)也要計算檢驗和。該函數(shù)實現(xiàn)了首部的檢驗和計算。4.2.5 網(wǎng)段掃描主要語句如下:for(i = startport ; i= endport ; i+)sock = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP); /創(chuàng)建一個Socketif(sock=INVALID_SOCKET) printf(Create socket failed: %dn,WSAGetLastError(); exit(EXIT_FAILURE); /主機字節(jié)序轉(zhuǎn)換為網(wǎng)絡字節(jié)序dest.sin_port = htons(i);/用此Socket連接目的主機,核心代碼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);/關閉收發(fā)服務if( shutdown( sock ,SD_BOTH ) = SOCKET_ERROR )printf(Failed to shutdown the connect: %dn,WSAGetLastError();exit(EXIT_FAILURE); closesocket(sock); /關閉Socket,回收資源/WSACleanup();利用一個for(;)循環(huán),對確定的起始和終止IP地址的內(nèi)的所有可能存在的主機發(fā)送,請求回顯的ICMP報文,并對返回的ICMP報文進行分析,提取出type和code字段,根據(jù)ICMP報文格式所定義的數(shù)值,對各個主機判斷,并打印信息。4.2.6 端口掃描for(i = startport ; i= endport ; i+)sock = socket(AF_INET , SOCK_STREAM , IPPROTO_TCP); /創(chuàng)建一個Socketif(sock=INVALID_SOCKET) printf(Create socket failed: %dn,WSAGetLastError(); exit(EXIT_FAILURE); /主機字節(jié)序轉(zhuǎn)換為網(wǎng)絡字節(jié)序dest.sin_port = htons(i);/用此Socket連接目的主機,核心代碼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);/關閉收發(fā)服務if( shutdown( sock ,SD_BOTH ) = SOCKET_ERROR )printf(Failed to shutdown the connect: %dn,WSAGetLastError();exit(EXIT_FAILURE); closesocket(sock); /關閉Socket,回收資源/WSACleanup();函數(shù)同樣利用一個for(;)循環(huán)對給定的主機的端口區(qū)間掃描。調(diào)用WSAGetLastError()庫函數(shù)判斷端口是否連接,根據(jù)相應的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é)與體會5.1 程序調(diào)試與運行程序主界面IP網(wǎng)段掃描端口掃描5.2 體會通過本次的課程設計加深了本人對TCP/IP協(xié)議特別是網(wǎng)絡層協(xié)議,IP首部格式,ICMP首部格式的理解。對Windows網(wǎng)絡編程也有初步的了解,掌握了基本的套接字程序的編寫。理解原始套接字的運行機制,加深一些協(xié)議字段的理解。編寫過程遇到的困難也不少,但是依靠鉆研精神,逐步對網(wǎng)絡編程步驟產(chǎn)生了整體的印象,這對以后的學習也是一筆寶貴的財富。以前學習總是停留在紙面上理論上,雖然貌似一些概念是清楚了,但是這樣的記憶是不長久的。只有通過理論聯(lián)系實際,編寫一些代碼,實現(xiàn)一些功能,才能加強記憶,學以致用。6、 參考文獻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 謝希仁.計算機網(wǎng)絡(第四版).電子工業(yè)出版社,20034 周鳴爭,嚴楠,丁剛等.計算機網(wǎng)絡教程.清華大學出版社,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; / 版本號和頭長度(各占4位)unsigned char ipTOS; / 服務類型 unsigned short ipLength; / 封包總長度,即整個IP報的長度unsigned short ipID; / 封包標識,惟一標識發(fā)送的每一個數(shù)據(jù)報unsigned short ipFlags; / 標志unsigned char ipTTL; / 生存時間,就是TTLunsigned char ipProtocol; / 協(xié)議,可能是TCP、UDP、ICMP等unsigned short ipChecksum; / 校驗和unsigned long ipSource; / 源IP地址unsigned long ipDestination; / 目標IP地址IP_HDR,*PIP_HDR;/ICMP首部typedef struct icmp_hdrunsigned char icmp_type; /類型unsigned char icmp_code; /代碼unsigned short icmp_checksum; /檢驗和unsigned short icmp_id; /唯一請求ID,通常使用進程PIDunsigned short icmp_sequence; /序列號unsigned long icmp_timestamp; /時間戳 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請求類型#define ICMP_ECHO_REQUEST_CODE 0 /ICMP請求代碼#define ICMP_ECHO_REPLY_TYPE 0#define ICMP_ECHO_REPLY_CODE 0#define ICMP_MINIMUM_HEADER 8struct hostent *host; /記錄主機信息struct sockaddr_in dest; /存儲目的主機信息struct sockaddr_in from; /用于回顯/注釋:常見的ICMP報文類型/ 類型 代碼 描述/ 0 0 回顯回答/ 3 1 主機不可達/ 3 3 端口不可達/ 8 0 請求回顯/初始化winsock動態(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報文類型,類型為8,代碼為0icmp_hdr-icmp_type = ICMP_ECHO_REQUEST_TYPE; / 請求回顯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)/判斷主機名是否為數(shù)字 /printf(執(zhí)行inet_addr().n);dest.sin_addr.s_addr = inet_addr(hostname); /將主機地址寫入s_addr/printf(%dn,WSAGetLastError(); else if( (host=gethostbyname(hostname) != 0)/判斷所給主機名是否與host中的一致/printf(執(zhí)行gethostbyname().n);strncpy(char *)&dest.sin_addr , (char *)host-h_addr_list0 , sizeof dest.sin_addr);/printf(完成。n);elseprintf(解析主機失敗。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);/將當前IP低三位與網(wǎng)段號組裝,用于發(fā)送ICMP的目的主機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()方法對目的主機的指定端口范圍掃描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等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論