C#進行端口掃描的代碼
主要是利用套接字,來和遠程主機的逐個端口進行連接,如果連接上說明該端口是開放的,否則是關閉的。當然現在各種安全技術發展迅速,使得這種方法掃描的端口可能不太準確,但是總得從最基本的學起吧~~
實現起來也不難,關鍵是看執行效率如何,如果使用傳統的逐個端口掃描,效率很低,即使是掃描本機,平均每個端口也需要1秒左右。提高效率的方法有很多如多線程、異步掃描。我采用的是異步掃描方式,其實這種方式也是一種多線程的方式,只是線程是交由系統創建的。
代碼轉自:http://blog.csdn.net/xiaohui_hubei/
using System; using System.Net; using System.Net.Sockets; using System.Collections;namespace PortScan { class Program { static void Main(string[] args) { IPAddress ip; int startPort, endPort; if (GetPortRange(args, out ip, out startPort, out endPort) == true) //提取命令行參數 { Scan(ip, startPort, endPort); //端口掃描 Console.ReadKey(); } }
#region 從命令行參數 中提取端口 + static bool GetPortRange(string[] args, out int startPort, out int endPort) /// <summary> /// 從命令行參數 中提取端口 /// </summary> /// <param name="args">命令行參數</param> /// <param name="ip">輸出 IP地址</param> /// <param name="startPort">輸出 起始端口號</param> /// <param name="endPort">輸出 終止端口號</param> /// <returns>提取成功返回true,否則返回false</returns> private static bool GetPortRange(string[] args,out IPAddress ip, out int startPort, out int endPort) { ip = null; startPort = endPort = 0; //幫助 命令 if (args.Length != 0 && (args[0] == "/?" || args[0] == "/help")) { Console.WriteLine("Scan port from startPort to endPort of the host specified by the IPAddress."); Console.WriteLine("Command Format:"); Console.WriteLine("PortScan IPAddress startPort endPort"); Console.WriteLine("For example:"); Console.WriteLine("PortScan 127.0.0.1 1 1024"); return false; } if (args.Length == 3) { //解析端口號成功 if (IPAddress.TryParse(args[0],out ip) && int.TryParse(args[1], out startPort) && int.TryParse(args[2], out endPort)) { return true; } else { Console.WriteLine("參數格式不正確!"); return false; } } else { Console.WriteLine("參數數目不正確!"); return false; } } #endregion /// <summary> /// 端口 掃描 /// </summary> /// <param name="ip">掃描的 IP地址</param> /// <param name="startPort">起始端口號</param> /// <param name="endPort">終止端口號</param> static void Scan(IPAddress ip, int startPort, int endPort) { Random rand = new Random((int)DateTime.Now.Ticks); Console.WriteLine("Begin Scan..."); for (int port = startPort; port < endPort; port++) { Socket scanSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.IP); //尋找一個未使用的端口進行綁定 do { try { scanSocket.Bind(new IPEndPoint(IPAddress.Any, rand.Next(65535))); break; } catch { //綁定失敗 } } while (true); try { scanSocket.BeginConnect(new IPEndPoint(ip, port), ScanCallBack, new ArrayList() { scanSocket, port}); } catch { // Console.WriteLine("port {0,5}\tClosed.\n{1}", port, ex.Message); continue; } } Console.WriteLine("Port Scan Completed!"); } /// <summary> /// BeginConnect的回調函數 /// </summary> /// <param name="result">異步Connect的結果</param> static void ScanCallBack(IAsyncResult result) { //解析 回調函數輸入 參數 ArrayList arrList = (ArrayList)result.AsyncState; Socket scanSocket = (Socket)arrList[0]; int port = (int)arrList[1]; //判斷端口是否開放 if (result.IsCompleted && scanSocket.Connected) { Console.WriteLine("port {0,5}\tOpen.", port); } else { //Console.WriteLine("port {0,5}\tClosed.", port); } //關閉套接字 scanSocket.Close(); } }
} </pre>
本文由用戶 xg48 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!