沈宮新

摘要摘要:C#語言一方面繼承了C 語言和C++ 語言簡潔高效的優點,另一方面吸收了JAVA語言面向對象的設計思想,是目前主流的編程語言之一。C#語言可以高效便捷地開發各種應用程序,微軟公司提供了完備的類庫以方便程序員開發。在網絡開發方面,端口掃描程序是網絡軟件常用的功能模塊。通過分析端口掃描程序中出現的問題,找出問題產生的原因,提出相應解決辦法,對采用C#語言開發類似軟件有一定的參考作用。
關鍵詞關鍵詞:C#語言;網絡軟件;端口掃描
DOIDOI:10.11907/rjdk.162211
中圖分類號:TP312文獻標識碼:A文章編號文章編號:16727800(2017)001003803
0引言
C#語言是目前主流的編程語言之一。它采用控件事件來綁定窗體方法,實現了消息的便捷傳遞,大大簡化了窗體程序的編寫,使程序員可以專注于業務邏輯開發,不必花費時間在消息路由上。本文采用C#語言實現一個具有WinForm窗體的端口掃描程序,并重點分析可能出現的幾個問題,為開發者提供參考。1端口掃描程序原理
端口掃描作為網絡安全掃描的核心技術之一,廣泛應用于網絡掃描器中,如著名的Namp和Nessus。在計算機中,一個端口就是一個潛在的通信通道,對目標計算機進行端口掃描,可使用戶了解本機對外界提供了哪些服務,從而為管理網絡提供參考。
端口掃描技術原理[1]:向目標計算機的TCP/IP服務算法的基礎上加上T-BCJR的復雜度,而高信噪比時,錯誤幀數量少,此時的復雜度基本接近SOVA算法。總體上,改進譯碼算法的復雜度與SOVA算法相近。
4結語
連續相位調制是一種先進的調制技術,近年來在通信、遙感等領域得到廣泛重視。本文介紹了連續相位調制系統的主要譯碼算法,并針對算法的局限性在高斯白噪聲信道下給出了一種改進的算法。通過仿真驗證了該算法的可行性,當誤比特率達到104時,改進譯碼的信噪比只比BCJR算法低0.15dB左右,復雜度也大大降低。
斷服務端口是打開還是關閉,得到端口提交的服務和信息。端口掃描的常見種類有TCP SIN掃描、TCP Connect掃描、秘密掃描和其它掃描。掃描分類如圖1所示。
本文使用其中的TCP connect 掃描,它是最基本的TCP掃描。操作系統提供connect()系統調用,用來與每個感興趣的目標計算機端口連接。如果端口處于偵聽狀態,那么connect()就能成功。否則,這個端口不能用,即沒有提供服務。這種技術最大的優點是不需要任何權限,系統中的任何用戶都有權使用這個調用;另一個好處就是速度:如果對每個目標端口以線性方式使用單獨的connect()調用,會花費相當長的時間,而這里可以同時打開多個套接字,從而加速掃描。
2端口掃描程序設計
本開發除了系統提供的默認命名空間和窗體命名空間外,還要用到和網絡開發和線程開發相關的命名空間。主要流程是在掃描窗體界面中設定目標主機IP地址和掃描端口范圍[2-3],在主線程中啟動多個線程來掃描端口。2.1命名空間和類
涉及的網絡相關命名空間包括System.net命名空間,要使用其中的IPAddress類和IPEndPoint類來構建統一、簡單的網絡編程接口。使用System.Net.Sockets命名空間中的Socket類來實現Berkeley套接字。引用System.Threading命名空間,使用其中的Thread類來實現多個線程同時掃描端口以加快掃描速度。2.2端口掃描程序流程
啟動多個線程,在線程中開始掃描端口,掃描程序中設定的套接字,以目標主機和端口為端點執行TCP connect方法。執行后,通過判斷套接字的Connected屬性來確定端口是否開放。主要流程如圖2所示。
3端口掃描程序中的問題及分析
對掃描程序進行測試。首先在局域網IP地址為10.110.32.16的主機上開放80端口,然后啟動掃描程序,在目標IP中填入10.110.32.16,端口選擇79到80端口,點擊開始掃描。3.1掃描端口不能顯示
盡管已經開放了80端口,可是掃描后并沒有發現該端口被寫入相應控件,但確實調用了Listbox控件的Items集合屬性的add方法并添加了具體的開放端口。經過分析,C#在UI線程創建子線程操作UI控件時,也就是在UI 線程以外的子線程操作UI控件時,系統引發了一個InvalidOperationException異常,因為訪問 Windows 窗體控件本質上不是安全線程。如果有兩個或多個線程操作某一控件,則可能會迫使該控件進入一種不一致狀態,還可能出現其它與線程相關的錯誤,包括爭用和死鎖。因此,確保以線程安全方式訪問控件非常重要。解決這個問題有3種方法[4-5]:
(1)在窗體Load方法中設置CheckForIllegalCrossThreadCalls為false,不檢查交叉線程調用,直接忽視InvalidOperationException異常,此法不推薦使用。
(2)利用委托來實現。在窗體函數中定義委托AppendStringDelegate,同時定義委托方法addString來觸發。把原來在線程中的通過控件添加的方法調用,修改為通過addString方法修改控件,以避免線程沖突,關鍵代碼如下:
(3)通過使用 BackgroundWorker 組件實現多線程的交叉引用。BackgroundWorker組件非常適合在后臺運行任務前臺顯示結果的應用場景,而且提供了完善的取消工作、報告進度和異常處理功能,解決了跨線程訪問可視化組件問題。輔助線程運行 DoWork 事件處理程序,在掃描按鈕點擊事件中調用方法RunWorkerAsync完成后臺線程異步觸發。
本文推薦使用第(2)或第(3)種方法來解決上述問題。3.2掃描端口結果重復顯示
采用上述委托處理線程訪問UI中控件,發現在Listbox控件中掃描結果出現兩次“端口開放80”字樣。端口掃描代碼在窗體類中定義一個類變量portnow,在掃描程序中通過一個for循環來啟動多個線程,執行從開始端口到終止端口的掃描,在循環中將i值賦給portnow。因為portnow是類變量,在線程中根據portnow的值確定掃描端口,代碼看似沒有問題,但經過跟蹤分析,發現線程在執行掃描79端口時,UI主線程繼續執行,并不會等待,此時,i值修改為80,又啟動下一個線程掃描80端口,而此時掃描79端口的線程也才剛剛為portnow賦值,因此出現了兩次都是連接80端口的情況。圖3中,通過跟蹤線程堆棧發現,在切換掃描79號端口線程時,UI線程繼續執行,i值被修改,導致一開始就執行掃描79號端口,portnow值就變成80,造成重復連接80端口問題。為了解決線程調用中portnow和所掃描端口不同步問題,考慮把i值作為一個參數傳給線程,更簡單的方法是直接把線程命名為i值。同時,在掃描程序中通過下列代碼實現portnow同步獲取:
4結語
本文通過C#語言端口掃描程序設計與實現,分析了程序中出現的問題,對端口掃描結果不能出現、端口掃描結果重復出現問題進行了分析,提出了相應的解決方法,提示C#編程者進一步了解網絡編程中線程使用的注意要點,避免發生線程使用不當導致程序無法正常運行,對類似系統實現提供了有益的參考。
參考文獻:
[1]譚逸逸.常見的端口掃描類[EB/OL].http://360doc.com/content/12/0302/13/3725126_191092221.shtml.
[2]陳青華.C#網絡開發項目教程[M] .北京:電子工業出版社, 2012:91113.
[3]馬駿.C#網絡應用編程[M] 北京:人民郵電出版社, 2014:3848.
[4]卜春芬. C#后臺處理與多線程技術的應用[J]. 昆明學院學報, 2010(3):1218.
[5]周廣川.多線程應用程序調試技術[J]. 現代計算機:專業版, 2011(3):154156.
[6]孫小平.網絡系統安全漏洞掃描淺析[J] .網絡安全技術與應用, 2016(2):7880.
責任編輯(責任編輯:杜能鋼)