端口掃描程序的設計49681_第1頁
端口掃描程序的設計49681_第2頁
端口掃描程序的設計49681_第3頁
已閱讀5頁,還剩14頁未讀, 繼續免費閱讀

下載本文檔

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

文檔簡介

1、課程設計題 目:端口掃描程序設計院、 系:計算機科學與技術學院網絡工程系班 級:學 號:姓 名:同組成員:指導教師: 成 績:一.系統設計的目標:掃描器是網絡信息收集的一種方法,從功能上可分為漏洞掃描器和端口掃描器。通 過此次課程設計,能夠掌握漏洞、端口的基礎知識,掌握掃描器的基本原理并設計實現 端口掃描和漏洞掃描程序。二.系統原理:常用的端口掃描技術有以下幾種:2.1 TCP conn ect()掃描:簡介:這是最基本的TCP掃描,操作系統提供的connect()系統調用可以用來與每一個感 興趣的目標計算機的端口進行連接。如果端口處于偵聽狀態,那么connect()就能成功。否則,這個端口是

2、不能用的,即沒有提供服務。優點:不需要任何權限。系統中的任何用戶都有權利使用這個調用。另一個好處就是速度,如果對每個目標端口以線性的方式,使用單獨的connect()調用,那么將會花費相當長的時間,使用者可以通過同時打開多個套接字來加速掃描。使用非阻塞I/O允許你設置一個低的時間用盡周期,同時觀察多個套接字。缺點:很容易被察覺,并且被防火墻將掃描信息包過濾掉。目標計算機的logs文件會顯示 一連串的連接和連接出錯消息,并且能很快使它關閉。2.2 TCP SYN 掃描:簡介:這種技術通常認為是“半開放”掃描,這是因為掃描程序不必要打開一個完全的 TCP 連接。掃描程序發送的是一個 SYN數據包,

3、好象準備打開一個實際的連接并等待反 應一樣(參考TCP的三次握手建立一個TCP連接的過程)。一個SYN|ACK勺返回信息 表示端口處于偵聽狀態:返回RST表示端口沒有處于偵聽態。如果收到一個SYN|ACK 則掃描程序必須再發送一個RST信號,來關閉這個連接過程。優點:一般不會在目標計算機上留下記錄。缺點:必須要有root權限才能建立自己的SYN數據包。2.3 TCP FIN 掃描:簡介:SYN掃描雖然是“半開放”方式掃描,但在某些時候也不能完全隱藏掃描者的動作, 防火墻和包過濾器會對管理員指定的端口進行監視,有的程序能檢測到這些掃描。 相反,FIN數據包在掃描過程中卻不會遇到過多問題,這種掃描

4、方法的思想是關閉 的端口會用適當的RST來回復FIN數據包。另一方面,打開的端口會忽略對FIN數據包的回復。這種方法和系統的實現有一定的關系,有的系統不管端口是否打開都 會回復RST在這種情況下此種掃描就不適用了。另外這種掃描方法可以非常容易 的區分服務器是運行 Unix系統還是NT系統。優點:SYN掃FIN數據包可以不惹任何麻煩的通過。缺點:這種方法和系統的實現有一定的關系,有些系統不論是打開的或關閉的端口對FIN數據包都要給以回復,這種情況下該方法就不實用了。2.4 IP 段掃描:簡介:這種掃描方式并不是新技術,它并不是直接發送TCP探測數據包,而是將數據包分成兩個較小的IP段。這樣就將一

5、個TCP頭分成好幾個數據包。優點:過濾器就很難探測到。缺點:一些程序在處理這些小數據包時會有些麻煩。2.5 TCP反向ide nt掃描:簡介:ide nt協議允許(rfc1413)看到通過TCP連接的任何進程的擁有者的用戶名,即使這 個連接不是由這個進程開始的。例如掃描者可以連接到 http端口,然后用identd 來發現服務器是否正在以root權限運行。優點:通過TCP連接的任何進程的擁有者的用戶名。缺點:這種方法只能在和目標端口建立了一個完整的TCP連接后才能看到。2.6 FTP返回攻擊簡介:FTP協議的一個有趣的特點是它支持代理(proxy ) FTP連接,即入侵者可以從自己 的計算機

6、和目標主機 的FTP server-PI(協議解釋器)連接, 建立一個控制通信連接。然后請求這個server-PI激活一個有效的server-DTP(數據傳輸進程)來給In ternet上任何地方發送文件。優點:建立一個控制通信連接。缺點:能用來發送不能跟蹤的郵件和新聞,給許多服務器造成打擊,用盡磁盤,企圖越過 防火墻。三. 系統功能分析:作為端口掃描程序,首先需要完成的功能就是對于系統操作系統的服務端口進行掃 描,返回掃描結果。對于端口的掃描,包括對于本機系統服務端口,局域網內目標機系 統,以及遠程IP的系統服務端口進行掃描。有些時候,用戶并不需要去掃描整個系統的所有端口,因為這樣的話不僅會

7、浪費大 量的時間,而且可能導致難以找到自己需要了解的端口的掃描結果。所以,對于選擇性 地對端口進行掃描也非常重要。這當然也是掃描程序需要實現的功能之一。用戶在等待掃描的時候,往往希望知道它的工作進度。這樣用戶可以更好地控制自 己的操作。站在用戶的角度思考,設置進度是程序需要完成的,這樣就能知道程序掃描 的進度。系統必須提供的服務是功能需求的基本,本著站在用戶角度思考的原則,做出如上 敘述需求,從簡列舉如下:掃描功能;地址選擇功能;端口選擇功能;本程序主要實現了簡易的TCP connect()掃描,對TCP掃描支持多線程掃描。四. 系統實現:4.1步驟:先輸入想要掃描的網段;然后將輸入的網段轉化

8、為可排序的ip數組建立多個線程,每個線程掃描一個ip。每個線程內先建立數據流套接字,然后綁定ip端口進行掃描。將掃描端口保存到 g_map_ScanResult。清理結束后進程,輸出結果。計算所用時間。4.2程序中主要的函數:程序簡介int mai n();主函數In itProc();初始化User In put();輸入Sca nlp(g_startlp,g_e ndlp,g_map_Sca nResult);開始掃描Clea nProc();清理結束后進程OutPutSca nIn fo();輸出結果DWORD WINAPI ThreadFu nc(LPVOID th_pa ra)掃描線

9、程每一個ipun sig ned long In vertIp( un sig ned long srcIp)將ip化為長整型int GetIpToSca n(const stri ng&Startlp,const將所有ip排序放在一個數組內stri ng &En dIp, vector< un sig ned long&vec_ip)4.3實驗結果:C:User5'.J asonDsk: p De bu gcccc. exe端口掃描器itiMKHEKJt nw aocacMiMKJt nw aocarn atx可掃描一個或多個IP,輸人同一網段的兩個IP

10、d格式為 W1 的.1 192-168-1-254.只掃描一個IF時輸入兩個相同1P- 掃描多個IP時輸入兩個不相同】P-X JC M MJ( K JC K M JC JC J(SC M JC JC H'tHC-W'M JC M M M )(K J4 M M M )( M"3( JC JC KJC 3( JC JC M M X JCJC 34 M M J4現在請輸入需要掃描的IF圖4-1開始界面時間為二?2 - 049秒圖4-2掃描界面t s29i29118 6 1描2 3 02 5 0描的IF34EfelP:192.168 結東IP為:燦.価富錄

11、要記記 Ip4 書示為為為 fcir址 主 的放放放JffCTffi到到到圖4-3掃描結果附錄:源程序代碼:#pragma comment(lib,"ws2_32.lib")#pragma warning (disable:4786)#in clude <iostream>#in clude <strstream>#in clude <win sock2.h>#in clude <stri ng>#in clude <vector>#in clude <map>#in clude <fstream

12、>#in clude <time.h>#in clude "IpSca n.h"using n amespace std;/全局變量:II待掃描的端口shortg_portsTOsca n=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,80805const short PORT

13、SNUM = sizeof(g_portsTOsca n) / sizeof(short);/端口個數II等掃描的IPvector<un sig ned longg_vec_lpToSca n;string g_startlp;stri ng g_en dlp;/開啟的線程數,目前為1個IP1個線程long g_run ThreadNum;/socket 相關TIMEVAL g_timeout; /阻塞等待時間FD_SET g_mask; /socket模式設置,儲存 socket 信息con st short TIMEOUT = 1; /阻塞等待時間WSADATA g_wsadata;

14、 /socket版本信息/線程中的互斥體HANDLE g_PortMute x;HANDLE g_ThreadNumMute x;HANDLE g_ResultMutex; /輸入結果的互斥量/保存IP掃描的結果multimapv un sig ned long, stri ng> g_map_Sca nResult;/ /線程函數,掃描每一個IPDWORD WINAPI ThreadFu nc(LPVOID th_para)/ 獲取需要掃描的IP/char *pStrIp = (char*)th_para;int in dex = 0;/端口索引描述 異步返回值 正在掃描的端口un s

15、ig ned long ulSca nip = *(un sig ned Ion g*)th_para;SOCKET li nk_sock;/SOCKETFD_SET set_flag;/SOCKETshort select_ret; /select short port;/while (i ndex < PORTSNUM)port = g_portsTOsca ni ndex;/創建數據流套接字lin k_sock = socket(AF_INET, SOCK_STREAM, 0);if (li nk_sock = INVALID_SOCKET)/cout << "

16、;創建 link_sock socket 失?。哄e誤號為:"<< GetLastError() << endl;WaitForSi ngleObject(g_ThreadNumMutex,INFINITE);g_run ThreadNum-;ReleaseMutex(g_ThreadNumMutex);/cout << "* return -1;還有 _"<< g_run ThreadNum << "_ 個掃描線程進行中 *"<< endl;FD_ZERO(&set

17、_flag);/將指定文件描述符清空FD_SET(li nk_sock, &set_flag); /用于在文件描述符集合中增加一個新的文件描述符/設置連接地址SOCKADDR_IN scan_addr;sca n_addr.sin_family = AF_INET;sca n_addr.s in _addr.s_addr = ulSca nip;sca n_addr.s in _port = hton s(port);un sig ned long sock_set = 1;ioctlsocket(link_sock,FIONBIO,&sock_set);/設置套接字為非阻塞模

18、式,第 3 個參數非0為非阻塞conn ect(l in k_sock,(struct sockaddr *) &sca n_addr, sizeof(sca n_addr);連接指定IP端口異步返回值select_ret = select(0,NULL, &set_flag,NULL, &g_timeout);if (select_ret = 0 | select_ret = -1)+in dex;con ti nue;elsestrstream stream_result;struct in _addr ipaddr;ipaddr.s_addr = ulSca ni

19、p;char *pStrlp = inet_n toa(ipaddr);stream_result << "t主機地址為:"<< pStrIp << "t找到開放的端口 : " << port <<'0'stri ng str_result(stream_result.str();/將掃描結果儲存到輸出變量中去WaitForSi ngleObject(g_ResultMutex,INFINITE);g_map_Sca nResult.i nsert(make_pair(ulSca

20、 nlp,str_result);ReleaseMutex(g_ResultMutex);+i ndex;/掃描完一個線程shutdow n( li nk_sock, 0);closesocket(li nk_sock);WaitForSi ngleObject(g_ThreadNumMutex,INFINITE);g_run ThreadNum-;ReleaseMutex(g_ThreadNumMutex);/cout << "*還有 _"<< g_ru nThreadNum << "_ 個掃描線程進行中 *"<

21、;< endl;return 0;/將IP轉化成能直接遞增和遞減的地址un sig ned long In vertIp( un sig ned long srcIp)un sig ned char first;un sig ned char sec ond;un sig ned char third;un sig ned char fourth;first = srcIp & OxOOFF;seco nd = (srcIp >> 8)& OxOOFF;third = (srcIp >> 16) & OxOOFF;fourth = (src

22、Ip >> 24) & OxOOFF;return (first << 24) | (second << 16) | (third << 8) | fourth; /將IP內的IP轉化成一個一個unsigned long類型存在數組中int GetIpToScan(conststring &StartIp, const string&EndIp, vector<unsignedlong &vec_ip)/判斷輸入的IP是否合法un sig ned long ulStartIp = in et_addr(Sta

23、rtlp.c_str();un sig ned long ulE ndlp = in et_addr(E ndlp.c_str();if(INADDR_NONE = ulStartIpIIINADDR_NONE = ulE ndlp)cout << "請輸入合法的IP" << endl;return -1;/判斷查詢的是一個IP 還是 IP 段/if (ulStartIp = ulE ndlp && ulStartlp !=0)vec_ip.push_back(ulStartlp);return 0;if (ulStartIp = 0

24、 && ulE ndlp = 0)return 0;if (ulStartIp = 0)vec_ip.push_back(ulE ndlp);return 0;if (ulE ndlp = 0)vec_ip.push_back(ulStartIp);return 0;/ 將IP轉換成可以遞增比較的類型ulStartIp = In vertlp(ulStartlp);ulE ndlp = In vertIp(ulE ndlp);/指定前后順序,ulEndlp較大un sig ned long max_ip;if (ulStartIp > ulE ndlp)max_ip =

25、ulStartIp;ulStartIp = ulE ndlp;ulE ndlp = max_ip;int ipnums = ulEndlp - ulStartlp;for(i nt i = 0;i <= ipnu ms;+i)/將每個IP的unsigned long型存到數組中供掃描vec_ip.push_back(l nvertlp(ulStartlp+);return 0;/功能:輸入一個IP段,輸出該IP段內的端口開放情況信息int Scanlp(const string &start_lp, const string &endlp, multimap<uns

26、igned long, string>&ouputMap)/ 分解IP段內的IP到全局數組中去GetlpToSca n( start_lp,e ndlp,g_vec_lpToSca n);int sca nNum = g_vec_IpToSca n.size();/線程總數g_run ThreadNum = sca nNum;cout<<e ndl;cout<<e ndl;cout<<"*5cout << "共有 ”<< scanNum <<"個 IP 要掃描"<

27、< en dl;/ 對每個IP開一個線程for (int i = 0; i < sca nNum; +i)CreateThread(NULL,O,ThreadFu nc,& g_vec_IpToSca n i,0,NULL);/要是不間隔時間的話,同時創建socket會出現10093錯誤Sleep(50);return 0;/輸出掃描結果int OutPutSca nln fo()cout <<"掃描到 "<< g_map_Sca nResult.size() << "條記錄"<< en

28、 dl;multimapv un sig ned long, stri ng>:iterator iter = g_map_Sca nResult.begi n();ofstream out("out.txt");cout <<"顯示總"<< g_map_ScanResult.size() << "條記錄:"<< en dl;cout<<e ndl;for (; iter!=g_map_Sca nResult.e nd(); +iter)out << ite

29、r->sec ond << en dl;cout << iter->sec ond << en dl;return 0;/ void UserI nput() cout<<" "<<e ndl;*端口掃描器*cout<<" "<<e ndl;cout<<" "<<e ndl;cout<<" "<<e ndl;cout<<" "<<

30、e ndl;cout<<" "<<e ndl;cout<<" "<<e ndl;cout<<"*"<<e ndl;cout<<"*可掃描一個或多個IP,輸入同一網段的兩個IP。*"<<e ndl;cout<<"*"<<e ndl; cout<<"*"<<e ndl; cout<<"*"<<e

31、 ndl;格式為 54.只掃描一個IP時,輸入兩個相同IP.掃描多個IP時,輸入兩個不相同IP.cout<<"*"<< endl;cout<<e ndl;cout<<e ndl;cout<<"*5cout<<"現在請輸入需要掃描的IPcout<<"cin >> g_startlp;cout<<"cin >> g_en dIp;起始IP為:"結束IP為:"

32、cout<<"*"<< endl;/初始化相關信息void Ini tProc()/ 初始化socket相關信息int ws_result;ws_result = WSAStartup(MAKEWORD(2,2), &g_wsadata);if (ws_result != 0)cout << "socket WSAStartup初始化失敗"<< endl;/設置阻塞函數的超時時間g_timeout.tv_sec = TIMEOUT;g_PortMutex = CreateMutex(NULL, FA

33、LSE, "port mutex"); g_ThreadNumMutex= CreateMutex(NULL, FALSE, "thread nums mutex");g_ResultMutex = CreateMutex(NULL, FALSE, "result mutex");/ /清理void Clea nProc()/線程都執行完后清理socket相關信息/while (1)WaitForSi ngleObject(g_ThreadNumMutex,INFINITE);if (g_r un ThreadNum = 0)brea

34、k;ReleaseMutex(g_ThreadNumMutex);Sleep(100);/ 清理socket相關信息WSAClea nup();int mai n() / 主函數clock_t start_time;clock_t en d_time;double cost_time = 0;start_time = clock();In itProc();初始化UserI nput();/ 輸入Scanl p(g_startIp,g_e ndlp,g_map_Sca nResult);/開始掃描Clea nProc(); 清理結束后進程OutPutSca nln fo();/ 輸出結果/計算程序運行時間en d_time = clock();cost_time = (double) (en d_time - start_time) / CLOCKS_PER_SEC;cout<<e ndl;cout <<"時間為:

溫馨提示

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

評論

0/150

提交評論