版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、海南大學(xué)信息科學(xué)技術(shù)學(xué)院安全掃描技術(shù)安全掃描技術(shù)TCPTCP 的客戶的客戶/ /服務(wù)器服務(wù)器/ /端口掃描程序設(shè)計(jì)端口掃描程序設(shè)計(jì)學(xué)號: _姓名: 年級: 2010 級 _專業(yè): 信息安全 _指導(dǎo)老師: 顧劍 _目目 錄錄1 1 實(shí)驗(yàn)?zāi)康募耙髮?shí)驗(yàn)?zāi)康募耙?1 12 2 實(shí)驗(yàn)的背景及意義實(shí)驗(yàn)的背景及意義.1 13 3 實(shí)驗(yàn)流程實(shí)驗(yàn)流程.1 14 4 實(shí)驗(yàn)內(nèi)容與步驟實(shí)驗(yàn)內(nèi)容與步驟.3 35 5 實(shí)驗(yàn)代碼實(shí)驗(yàn)代碼.5 55.1 TCP 服務(wù)器程序: .55.2 TCP 客戶端: .85.3 TCP 端口掃描: .106 6 實(shí)驗(yàn)操作手冊實(shí)驗(yàn)操作手冊.11117 7 實(shí)驗(yàn)總結(jié)實(shí)驗(yàn)總結(jié).1414第
2、1 頁 共 17 頁1 1實(shí)驗(yàn)?zāi)康募耙髮?shí)驗(yàn)?zāi)康募耙螅?) 、熟悉 Microsoft Visual Studio 2006 編程環(huán)境。(2) 、了解 TCP 客戶/服務(wù)器/掃描端口的模型原理。 (3) 、熟悉 Socket 編程原理,掌握簡單的套接字編程。2 2實(shí)驗(yàn)的背景及意義實(shí)驗(yàn)的背景及意義(1) 、TCP 客戶和服務(wù)器TCP 是面向連接的,所謂面向連接,就是當(dāng)計(jì)算機(jī)雙方通信時(shí)必需先建立連接,然后數(shù)據(jù)傳送,最后拆除連接三個(gè)過程 并且 TCP 在建立連接時(shí)又分三步走: 第一步是請求端(客戶端)發(fā)送一個(gè)包含 SYN 即同步(Synchronize)標(biāo)志的 TCP 報(bào)文,SYN 同步報(bào)文會(huì)指明
3、客戶端使用的端口以及 TCP 連接的初始序號; 第二步,服務(wù)器在收到客戶端的 SYN 報(bào)文后,將返回一個(gè) SYN+ACK 的報(bào)文,表示客戶端的請求被接受,同時(shí)TCP 序號被加一,ACK 即確認(rèn)(Acknowledgement) 。 第三步,客戶端也返回一個(gè)確認(rèn)報(bào)文 ACK 給服務(wù)器端,同樣 TCP 序列號被加一,到此一個(gè) TCP 連接完成。然后才開始通信的第二步:數(shù)據(jù)處理。 這就是所說的 TCP 三次握手(Three-way Handshake) 。 簡單的說就是:(C:客戶端,S:服務(wù)端) C:SYN到 S S:如成功-返回給 C(SYN+ACK) C:如成功-返回給 S(ACK) 以上是正
4、常的建立連接方式(2) 、TCP 端口掃描“端口”在計(jì)算機(jī)網(wǎng)絡(luò)領(lǐng)域中是個(gè)非常重要的概念。它是專門為計(jì)算機(jī)通信而設(shè)計(jì)的,它不是硬件,不同于計(jì)算機(jī)中的“插槽”,可以說是個(gè)“軟插槽”。如果有需要的話,一臺(tái)計(jì)算機(jī)中可以有上萬個(gè)端口。 端口是由 TCP/IP 協(xié)議定義的。其中規(guī)定,用 IP 地址和端口作為套接字,它代表 TCP 連接的一個(gè)連接端,一般稱為 Socket。具體來說,就是用IP:端口來定位一臺(tái)主機(jī)中的進(jìn)程。可以做這樣的比喻,端口相當(dāng)于兩臺(tái)計(jì)算機(jī)進(jìn)程間的大門,可以隨便定義,其目的只是為了讓兩臺(tái)計(jì)算機(jī)能夠找到對方的進(jìn)程。計(jì)算機(jī)就像一座大樓,這個(gè)大樓有好多入口(端口),進(jìn)到不同的入口中就可以找到不
5、同的公司(進(jìn)程)。如果要和遠(yuǎn)程主機(jī) A 的程序通信,那么只要把數(shù)據(jù)發(fā)向A:端口就可以實(shí)現(xiàn)通信了。 可見,端口與進(jìn)程是一一對應(yīng)的,如果某個(gè)進(jìn)程正在等待連接,稱之為該進(jìn)程正在監(jiān)聽,那么就會(huì)出現(xiàn)與它相對應(yīng)的端口。由此可見,入侵者通過掃描端口,便可以判斷出目標(biāo)計(jì)算機(jī)有哪些通信進(jìn)程正在等待連接,這也是端口掃描的主要目的。3 3實(shí)驗(yàn)流程實(shí)驗(yàn)流程(1) 、TCP 客戶程序和服務(wù)器程序流程圖程序分兩部分:客戶程序和服務(wù)器程序。工作過程是: 服務(wù)器首先啟動(dòng),它創(chuàng)建套接字之后等待客戶的連接;客戶啟動(dòng)后創(chuàng)建套接字,然后和服務(wù)器建立連接;建立連接后,客戶接收鍵盤輸入,然后將數(shù)據(jù)發(fā)送到服務(wù)器,服務(wù)器收到到數(shù)據(jù)后,將接收
6、到的字符在屏幕上顯示出來?;蛘叻?wù)器接收鍵盤輸入,然后將數(shù)據(jù)發(fā)送到客戶機(jī),客戶機(jī)收到數(shù)據(jù)后,將接收到的字符在屏幕上顯示出來。 第 2 頁 共 17 頁(2)TCP 端口掃描流程圖開始設(shè)置掃描參數(shù)(IP、端口、協(xié)議)開始掃描imaxport否Socket()建立流式套接字,返回套接字號。accept(),接受連接,等待客戶端的連接 bind(),套接字 s 與本地地址相連。listen(),通知 TCP,服務(wù)器準(zhǔn)備好接收連接。連接建立,accept()返回,得到新的套接字,screcvt()/send(),在套接字 sc 上讀/寫數(shù)據(jù),直到數(shù)據(jù)交換完畢closesocket(),關(guān)閉套接字 sc
7、closesocket(),關(guān)閉最初套接字 s,服務(wù)結(jié)束Socket(),建立流失套接字,返回套接字號connect(),將套接字 s 與遠(yuǎn)地主機(jī)連接send()/recv(),在套接字上讀/寫數(shù)據(jù),直到數(shù)據(jù)交換完closesocket(),關(guān)閉套接字結(jié)束 TCP 對話服務(wù)器方客戶方初始化進(jìn)度條i+nowAddr=StartAddri=minport讀入用戶設(shè)置的 IP、端口號、協(xié)議顯示打開端口AfxBeginThread(DoScanPort_TCP,&inforabout,0,0,0,NULL)是第 3 頁 共 17 頁4 4實(shí)驗(yàn)內(nèi)容與步驟實(shí)驗(yàn)內(nèi)容與步驟所用函數(shù)及結(jié)構(gòu)體參考:所用函
8、數(shù)及結(jié)構(gòu)體參考:1 1、創(chuàng)建套接字、創(chuàng)建套接字socket()socket()功能:使用前創(chuàng)建一個(gè)新的套接字格式:SOCKET PASCAL FAR socket(int af, int type, int procotol);參數(shù):af:代表網(wǎng)絡(luò)地址族,目前只有一種取值是有效的,即 AF_INET,代表 internet 地址族;Type:代表網(wǎng)絡(luò)協(xié)議類型,SOCK_DGRAM 代表 UDP 協(xié)議,SOCK_STREAM 代表 TCP 協(xié)議;Protocol:指定網(wǎng)絡(luò)地址族的特殊協(xié)議,目前無用,賦值 0 即可。返回值為 SOCKET,若返回 INVALID_SOCKET 則失敗。2 2、指定
9、本地地址、指定本地地址bind()bind()功能:將套接字地址與所創(chuàng)建的套接字號聯(lián)系起來。格式:int PASCAL FAR bind(SOCKET s, const struct sockaddr FAR * name, int namelen);參數(shù):s: 是由 socket()調(diào)用返回的并且未作連接的套接字描述符(套接字號) 。其它:沒有錯(cuò)誤,bind()返回 0,否則 SOCKET_ERROR地址結(jié)構(gòu)說明:struct sockaddr_inshort sin_family;/AF_INETu_short sin_port;/16 位端口號,網(wǎng)絡(luò)字節(jié)順序struct in_addr
10、sin_addr;/32 位 IP 地址,網(wǎng)絡(luò)字節(jié)順序char sin_zero8;/保留3 3、建立套接字連接、建立套接字連接connect()connect()和和 accept()accept()功能:共同完成連接工作格式:int PASCAL FAR connect(SOCKET s, const struct sockaddr FAR * name, int namelen);SOCKET PASCAL FAR accept(SOCKET s, struct sockaddr FAR * name, int FAR * addrlen);參數(shù):s: 是由 socket()調(diào)用返回的并
11、且未作連接的套接字描述符(套接字號) 。4 4、監(jiān)聽連接、監(jiān)聽連接listen()listen()功能:用于面向連接服務(wù)器,表明它愿意接收連接。格式:int PASCAL FAR listen(SOCKET s, int backlog);5 5、數(shù)據(jù)傳輸、數(shù)據(jù)傳輸send()send()與與 recv()recv()功能:數(shù)據(jù)的發(fā)送與接收格式:int PASCAL FAR send(SOCKET s, const char FAR* buf, int len, int flags);int PASCAL FAR recv(SOCKET s, const char FAR * buf, int
12、 len, int flags);參數(shù):buf:指向存有傳輸數(shù)據(jù)的緩沖區(qū)的指針。 第 4 頁 共 17 頁6 6、多路復(fù)用、多路復(fù)用select()select()功能:用來檢測一個(gè)或多個(gè)套接字狀態(tài)。格式:int PASCAL FAR select(int nfds, fd_set FAR* readfds, fd_set FAR* writefds, fd_set FAR * exceptfds, const struct timeval FAR* timeout);參數(shù):readfds:指向要做讀檢測的指針writefds:指向要做寫檢測的指針exceptfds:指向要檢測是否出錯(cuò)的指針t
13、imeout:最大等待時(shí)間7 7、關(guān)閉套接字、關(guān)閉套接字closesocket()closesocket()功能:關(guān)閉套接字 s格式:BOOL PASCAL FAR closesocket (SOCKET s);8 8、WSADATAWSADATA 類型和類型和 LPWSADATALPWSADATA 類型類型WSADATA 類型是一個(gè)結(jié)構(gòu),描述了 Socket 庫的一些相關(guān)信息,其結(jié)構(gòu)定義如下:typedef struct WSAData WORD wVersion; WORD wHighVersion; char szDescriptionWSADESCRIPTION_LEN+1; char
14、 szSystemStatusWSASYS_STATUS_LEN+1; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; WSADATA;typedef WSADATA FAR *LPWSADATA;值得注意的就是 wVersion 字段,存儲(chǔ)了 Socket 的版本類型。LPWSADATA 是 WSADATA 的指針類型。它們不用程序員手動(dòng)填寫,而是通過 Socket 的初始化函數(shù) WSAStartup 讀取出來。9 9、sockaddr_insockaddr_in、in_addrin
15、_addr 類型類型sockaddr_in 定義了 socket 發(fā)送和接收數(shù)據(jù)包的地址。定義:struct sockaddr_in short sin_family; u_short sin_port; struct in_addr sin_addr; char sin_zero8;其中 in_addr 的定義如下:struct in_addr 第 5 頁 共 17 頁 union struct u_char s_b1,s_b2,s_b3,s_b4; S_un_b; struct u_short s_w1,s_w2; S_un_w; u_long S_addr; S_un;首先闡述 in_a
16、ddr 的含義,很顯然它是一個(gè)存儲(chǔ) ip 地址的聯(lián)合體,有三種表達(dá)方式:(1)用四個(gè)字節(jié)來表示 IP 地址的四個(gè)數(shù)字;(2)用兩個(gè)雙字節(jié)來表示 IP 地址;(3)用一個(gè)長整型來表示 IP 地址。給 in_addr 賦值的一種最簡單方法是使用 inet_addr 函數(shù),它可以把一個(gè)代表 IP 地址的字符串賦值轉(zhuǎn)換為 in_addr類型,如addrto.sin_addr.s_addr=inet_addr(192.168.0.2);本例子中由于是廣播地址,所以沒有使用這個(gè)函數(shù)。其反函數(shù)是 inet_ntoa,可以把一個(gè) in_addr 類型轉(zhuǎn)換為一個(gè)字符串。sockaddr_in 的含義比 in_a
17、ddr 的含義要廣泛,其各個(gè)字段的含義和取值如下:第一個(gè)字段 short sin_family,代表網(wǎng)絡(luò)地址族,如前所述,只能取值 AF_INET;第二個(gè)字段 u_short sin_port,代表 IP 地址端口,由程序員指定;第三個(gè)字段 struct in_addr sin_addr,代表 IP 地址;第四個(gè)字段 char sin_zero8,是為了保證 sockaddr_in 與 SOCKADDR 類型的長度相等而填充進(jìn)來的字段。5 5實(shí)驗(yàn)代碼實(shí)驗(yàn)代碼5.15.1TCPTCP 服務(wù)器程序:服務(wù)器程序:#include #include #include #include #pragma
18、comment (lib, Ws2_32.lib)SOCKET sock1,sock2;/創(chuàng)建套接字-socket()int sin_size ;struct sockaddr_in my_addr,their_addr;/是一個(gè)存放協(xié)議族協(xié)議族,端口地址,存儲(chǔ) IP 的結(jié)構(gòu),為和 sockaddr 兼容而保持的補(bǔ)足 8 字節(jié)char name20;/初始化函數(shù) Tcpvoid Init() const WORD wMinver=0 x0101;/固定 wMinver 的數(shù)值WSADATA wsadata; printf(nnn Server: TCPnnn);/建立套接字if(0!=WSAS
19、tartup(wMinver,&wsadata)perror(Start socket error!);第 6 頁 共 17 頁 if(INVALID_SOCKET=(sock1=socket(AF_INET,SOCK_STREAM,0)perror(Create socket error!);my_addr.sin_family=AF_INET;my_addr.sin_addr.S_un.S_addr=INADDR_ANY;my_addr.sin_port=htons(1000);if(SOCKET_ERROR=bind(sock1,(struct sockaddr*)&my
20、_addr,sizeof(my_addr)/將套接字地址與所創(chuàng)建的套接字號聯(lián)系起來perror(Binding stream socket);exit(1);/開始偵聽if(SOCKET_ERROR=listen(sock1,5)perror(Listening stream socket);exit(1);/接受連接printf( Ready to serve client. Please connect.nnn);sin_size = sizeof(struct sockaddr_in);if(sock2=accept(sock1,(struct sockaddr *)&their
21、_addr,&sin_size)=-1)perror(Accepting stream socket);exit(1); printf( Accepting a new connet:%s,inet_ntoa(their_addr.sin_addr);/選擇菜單int menu()char *s=(char*)malloc(2*sizeof(char);int c;printf(nnn Server: Menunnn);printf( *nn);printf( * 1.Send Message *n);printf( * 2.Receive Message *n);printf( *
22、3.Exit *nn);printf( *n);doprintf(n Enter your choice:);gets(s);if(s0=0)gets(s);c=atoi(s);while(c3);free(s);return c;/消息發(fā)送函數(shù)第 7 頁 共 17 頁void Send()char Msg10240; printf(nPlease Input the message:);gets(Msg); Msg10239=0; send(sock2,Msg,strlen(Msg),0);/消息接收函數(shù)void Receive()int len,i;char buf10240;for(i=
23、0;i10240;i+)bufi=0; if(len=recv(sock2,buf,10240,0)=-1)perror(Receving data error);exit(1);printf(The Received Message:%sn,buf);/主函數(shù)void main() Init();for(;)switch(menu()case 1:Send();break;case 2:Receive();break;case 3:exit(0);/closesocket(sock2);closesocket(sock1);WSACleanup();第 8 頁 共 17 頁5.25.2TCP
24、TCP 客戶端:客戶端:#include #include #include #include #pragma comment (lib, Ws2_32.lib)SOCKET sock1,sock2;int sin_size ;struct sockaddr_in my_addr,their_addr;char name20;/初始化函數(shù) Tcpvoid Init() const WORD wMinver=0 x0101;WSADATA wsadata;char IP16=0; printf(nnn Client: TCPnnn);printf(n 請輸入你要連接的 IP 地址:);scanf
25、(%s,IP);/建立套接字if(0!=WSAStartup(wMinver,&wsadata)perror(Start socket error!); if(INVALID_SOCKET=(sock1=socket(AF_INET,SOCK_STREAM,0)perror(Create socket error!);my_addr.sin_family=AF_INET; my_addr.sin_addr.S_un.S_addr=inet_addr(IP);my_addr.sin_port=htons(1000);/請求連接printf( connecting.);sin_size =
26、 sizeof(struct sockaddr_in);if(sock2=(connect(sock1,(LPSOCKADDR)&my_addr,sin_size)=-1)perror(Accepting stream socket);exit(1);/選擇菜單int menu()char *s=(char*)malloc(2*sizeof(char);int c;printf(nnn Client: luoxinnn);printf( *nn);第 9 頁 共 17 頁printf( * 1.Send Message *n);printf( * 2.Receive Message *
27、n);printf( * 3.Exit *nn);printf( *n);doprintf(n Enter your choice:);gets(s);if(s0=0)gets(s);c=atoi(s);while(c3);free(s);return c;/消息發(fā)送函數(shù)void Send() char Msg10240;printf(nPlease Input the message:);gets(Msg); Msg10239=0; send(sock1,Msg,strlen(Msg),0); /消息接收函數(shù)void Receive()int len,i;char buf10240;for(
28、i=0;i10240;i+)bufi=0; if(len=recv(sock1,buf,10240,0)=-1)perror(Receving data error);exit(1);printf(The Received Message:%sn,buf);/主函數(shù)void main() Init();for(;)switch(menu()第 10 頁 共 17 頁case 1:Send();break;case 2:Receive();break;case 3:exit(0);closesocket(sock2);closesocket(sock1);WSACleanup();5.35.3T
29、CPTCP 端口掃描:端口掃描:#include stdafx.h#include #include #pragma comment (lib,ws2_32.lib) int main() int mysocket,i; /i_端口int pcount = 0; int Min=0,Max=0;char IP16=0;struct sockaddr_in my_addr;/定義一個(gè) struct 結(jié)構(gòu)WSADATA wsaData; WORD wVersionRequested=MAKEWORD(1,1); /宏創(chuàng)建一個(gè)被指定變量連接而成的 WORD 變量。返回一個(gè) WORD 變量。if (W
30、SAStartup(wVersionRequested , &wsaData) printf(Winsock Initialization failed.n); exit(1); printf(please input the host you want to scan:n);scanf(%s,IP);printf(please input the min Port you want to scan:n);scanf(%d,&Min);printf(please input the max Port you want to scan:n);scanf(%d,&Max);
31、第 11 頁 共 17 頁for(i=Min; iMax; i+) if(mysocket = socket(AF_INET, SOCK_STREAM,0) = INVALID_SOCKET) printf(Socket Error); exit(1); my_addr.sin_family = AF_INET; /代表網(wǎng)絡(luò)地址族,目前只有一種取值是有效的,即 AF_INET,代表 internet 地址族;my_addr.sin_port = htons(i); /端口號; Htons 函數(shù)是轉(zhuǎn)換結(jié)構(gòu),通常該函數(shù)用于設(shè)定 socket 端口時(shí)的轉(zhuǎn)換my_addr.sin_addr.s_add
32、r = inet_addr(IP);/成員 sin_addr 給出的是套接字的主機(jī) IP 地址,可以使用函數(shù) inet_addr 對點(diǎn)式 IP 地址進(jìn)行轉(zhuǎn)換if(connect(mysocket, (struct sockaddr *)&my_addr, sizeof(struct sockaddr) = SOCKET_ERROR)/Windows Sockets 的 connect 函數(shù)將與一個(gè)特定的套接字建立連接,如果調(diào)用失敗,這個(gè)函數(shù)就會(huì)返回一個(gè) SOCKET_ERROR,錯(cuò)誤信息可以通過 WSAGetLastError 函數(shù)返回。closesocket(mysocket); /函數(shù)用來結(jié)束一個(gè)已經(jīng)存在的套接字,當(dāng)一個(gè)套接字不再使用時(shí),需要調(diào)用這個(gè)函數(shù)來釋放套接字。printf(Port %d - closedn, i); else pcount+; printf(Port %d - openn, i); printf(n %d ports open on host - %sn, pcount, IP); printf(n);closesocket(mysocket); WSACleanup(); return 0; 6 6實(shí)驗(yàn)操作手冊實(shí)驗(yàn)操作手冊一、一、TCPTCP 客戶端和服務(wù)器之
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- GB/T 17817-2024飼料中維生素A的測定高效液相色譜法
- 2025年度環(huán)保二零二五版環(huán)保產(chǎn)業(yè)園區(qū)入駐協(xié)議書3篇
- 電影院地下停車場建設(shè)招標(biāo)
- 2025年度白酒企業(yè)市場拓展與品牌合作合同3篇
- 住宅小區(qū)照明工程安裝協(xié)議
- 漁業(yè)項(xiàng)目招標(biāo)困境與解決方案
- 2025年度基站建設(shè)場地使用權(quán)及通信設(shè)備租賃與維護(hù)合同3篇
- 書店門頭安裝工程合同
- 食品安全召回程序指南
- 礦山采掘設(shè)備電路鋪設(shè)合同
- GB/T 40169-2021超高分子量聚乙烯(PE-UHMW)和高密度聚乙烯(PE-HD)模塑板材
- GB/T 31579-2015糧油檢驗(yàn)芝麻油中芝麻素和芝麻林素的測定高效液相色譜法
- 教師政治紀(jì)律方面存在的問題及整改措施集合5篇 教師政治紀(jì)律方面存在的問題及整改措施怎么寫
- GB/T 16552-2017珠寶玉石名稱
- GB 15618-1995土壤環(huán)境質(zhì)量標(biāo)準(zhǔn)
- Unit4 Video time 課件-高中英語人教版(2019)選擇性必修第一冊
- 小學(xué)門崗保安服務(wù)方案
- 個(gè)人車位租賃合同電子版
- 中央空調(diào)工程施工合同
- 公務(wù)用車車輛使用及管理辦法
- 論語十二章理解性默寫題及答案
評論
0/150
提交評論