1. 程式人生 > >C#專案實戰-實現一個多執行緒埠掃描器

C#專案實戰-實現一個多執行緒埠掃描器

歡迎Follow,或者給個Star哈

PortScanner專案(C#實現多執行緒埠掃描器)說明

1. 概述

檔案結構

這裡寫圖片描述

1.1 課程設計目的

加深TCP/IP協議的理解,掌握TCP四次握手機制,同時熟悉socket程式設計。

1.2 課程設計內容

實現一個埠掃描器:

  1. 支援多程序/執行緒;
  2. 能對單個指定主機進行掃描或掃描指定網段內的主機;
  3. 能掃描特定的部分埠或對指定的埠段內的埠進行逐個掃描;
  4. 能夠顯示所開放埠的服務名稱;

1.3 執行環境

Windows xp、Windows 7、Windows8,Visual Studio2013

2. 系統分析與設計

2.1 原理概述

埠掃描有好幾種,但其中TCP connect掃描是最基本的掃描,我們可以利用系統提供的connect()用來與每一個目標計算機的埠進行連線。如果埠處於偵聽狀態,那connect()就能成功。否則,這個埠即是不可用的,也就是說沒有提供服務。這個技術的一個最大的優點是,你不需要任何許可權。系統中的任何使用者都有權利使用這個呼叫。另一個好處就是速度,如果對每個目標埠以線性的方式,使用單獨的connect()呼叫,那麼將花費相當長的時間,使用者可以通過多執行緒同時開啟多個套接字來加速掃描。使用非阻塞I/O允許設定一個低的時間用盡週期,同時觀察多個套接字。但這種方法的缺點是很容易被察覺,並且被防火牆將掃描資訊包過濾掉。目標計算機的Logs檔案會顯示一連串的連線和連接出錯訊息,並且能很快使它關閉。

2.2 程式流程圖

這裡寫圖片描述

說明:掃描器可實現對單個主機單個埠的掃描也可實現對網段內主機和範圍內埠進行逐個掃描,因此操作時要注意是單個主機掃描還是多個IP地址掃描,以及掃描埠範圍。確定掃描IP和掃描埠後點擊開始即可對相應IP下的埠進行偵聽,並返回埠狀態,如果埠開放則同時返回埠服務,掃描結束後執行緒停止。

2.3 主要資料結構

private string ipStart;//起始IP地址
private string ipEnd;//終點IP地址
private int portStart;//開始埠
private int portEnd;//結束埠
private int numThread=20
;//分配的執行緒數,預設最小為20 private int overTime;//超時限制 private Thread t;//定義一個執行緒 private Thread scanthread;//埠掃描執行緒 private bool[] done = new bool[65536]; List<string> str;//掃描結果集

2.4 主要演算法

設定好IP地址和埠範圍後,開闢執行緒,開始掃描:

利用PingReply物件試探目標主機,如果超時則表示不可達,否則連通,顯示埠掃描狀態,如果埠開放,顯示服務。

詳細請見原始碼註釋。

2.5 主要函式說明

private void Form1_Load(object sender, EventArgs e) //介面初始化函式
private void button1_Click(object sender, EventArgs e)//開始按鈕函式
public void wait()//掃描IP地址執行緒
public string State(int i)//判斷埠狀態函式,返回(open或closed)
public string Service(int i)//根據開放埠號返回具體服務
public void Scan(object Point)//掃描埠執行緒
private void button2_Click(object sender, EventArgs e)//停止按鈕事件函式
private void button3_Click(object sender, EventArgs e)//關於按鈕事件函式
private void trackBar1_Scroll(object sender, EventArgs e)//超時設定函式
private void checkBox2_CheckedChanged(object sender, EventArgs e)//點選按鈕函式

3. 使用者使用手冊

(1),埠掃描器主介面如圖所示:
這裡寫圖片描述

執行程式系統進入主介面,主介面中主要包括以下佈局:IP地址設定、埠範圍設定、執行緒數設定、Ping超時時間限制、掃描進度、顯示掃描結果、開始停止和關於按鈕。
(2),掃描單個主機或單個埠:
當需要掃描單個主機或者單個埠是,需要點選“掃描單個主機”“掃面單個埠”選框,這時IP範圍設定和埠範圍設定各自的第二個編輯框變為只讀屬性,無法再填寫相應欄位。

這裡寫圖片描述

(3),設定執行緒數和超時限制:
由於多執行緒,可以分配多個執行緒,但為了避免消耗過多資源導致主機奔潰建議1-30;
超時限制可通過TrackBar滑動選擇,預設為10-30s,注意下方的編輯框是隻讀屬性。

這裡寫圖片描述

(4)開始、停止、關於按鈕:
設定好需要掃描的IP和埠後,點選開始按鈕,即可進行掃描,點選停止,將執行緒掛起,掃描結束。點選關於按鈕,彈出個人資訊及軟體反饋地址。

這裡寫圖片描述

(5),顯示掃描結果:
通過richTextBox控制元件顯示掃描結果找出開放埠,ListBox控制元件動態顯示掃描結果,包括掃描IP地址,埠號,埠狀態(closed、open),以及開放埠服務名稱。

這裡寫圖片描述

4. 心得體會與總結

4.1 心得體會

如圖:對主機就127.0.0.1進行測試,符合預期結果。

這裡寫圖片描述

這裡寫圖片描述

根據計算機網路知識,可以看到通過對單個主機和網段內的多個主機進行埠掃描都得到了正確結果。建立一個socket,通過TCP connect()測試該主機的某個埠是否能夠連通,獲得該埠的狀態,如果open則獲知它的服務。
當然由於採用TCP connect()方法,不可避免的有它的缺陷,因為大量無需許可權的訪問,容易被防火牆過濾掉,因此可以進行這方面的改進。可以採用TCP SYN掃描、TCP FIN掃描、TCP反向ident掃描、FTP返回攻擊等。

4.2 總結

通過這次課程設計,一方面我熟悉了C#方面基本的網路程式設計和socket程式設計,同時對TCP連線的過程有了更深入的理解,包括封裝API的呼叫,握手機制等。為了解決這一過程中遇到的問題,除了課本還查閱了很多資料,對網路程式設計也有了不少的心得,總得來說收穫滿滿!

參考資料

[1]<謝希仁>.《計算機網路》[M].電子工業出版社,2013.6第6版

[2]<明日科技>.《C#從入門到精通》[M].清華大學出版社,2012.9第3版