C#實現一個多線程端口掃描器:PortScanner
PortScanner項目(C#實現多線程端口掃描器)說明
1. 概述
文件結構
1.1 課程設計目的
加深TCP/IP協議的理解,掌握TCP四次握手機制,同時熟悉socket編程。
1.2 課程設計內容
實現一個端口掃描器:
- 支持多進程/線程;
- 能對單個指定主機進行掃描或掃描指定網段內的主機;
- 能掃描特定的部分端口或對指定的端口段內的端口進行逐個掃描;
- 能夠顯示所開放端口的服務名稱;
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版