上網很久的朋友一定對端口掃描器不會陌生吧。XScanner,SuperScanner大家一定都使用過。
今天我們就用最新的.Net技術來制作一個自己的端口掃描器!
今天主要使用到的是System.Net和System.Threading名稱空間.
1 2using System; 3using System.Collections.Generic; 4using System.Text; 5 6using System.Net; 7using System.Net.Sockets; 8 9using System.Threading; 10 11namespace PortScanner 12{ 13 class Program 14 { 15 //已掃描端口數目 16 internal static int scannedCount = 0; 17 //正在運行的線程數目 18 internal static int runningThreadCount = 0; 19 //打開的端口數目 20 internal static List<int> openedPorts = new List<int>(); 21 //起始掃描端口 22 static int startPort = 1; 23 //結束端口號 24 static int endPort = 500; 25 //最大工作線程數 26 static int maxThread = 100; 27 static void Main(string[] args) 28 { 29 //接收傳入參數一作為要掃描的主機 30 string host = args[0]; 31 //接收傳入參數二作為端口掃描范圍,如1-4000 32 string portRange = args[1]; 33 startPort = int.Parse(portRange.Split('-')[0].Trim()); 34 endPort = int.Parse(portRange.Split('-')[1].Trim()); 35 36 for (int port = startPort; port < endPort; port++) 37 { 38 //創建掃描類 39 Scanner scanner = new Scanner(host, port); 40 Thread thread = new Thread(new ThreadStart(scanner.Scan)); 41 thread.Name = port.ToString(); 42 thread.IsBackground = true; 43 //啟動掃描線程 44 thread.Start(); 45 46 runningThreadCount++; 47 48 Thread.Sleep(10); 49 //循環,直到某個線程工作完畢才啟動另一新線程,也可以叫做推拉窗技術 50 while (runningThreadCount >= maxThread) ; 51 } 52 53 //空循環,直到所有端口掃描完畢 54 while (scannedCount + 1 < (endPort - startPort)) ; 55 56 Console.WriteLine(); 57 Console.WriteLine(); 58 //輸出結果 59 Console.WriteLine("Scan for host: {0} has been completed , total {1} ports scanned, opened ports :{2}", 60 host, (endPort - startPort), openedPorts.Count); 61 62 foreach (int port in openedPorts) 63 Console.WriteLine(" Port: {0} is open", port.ToString().PadLeft(6)); 64 } 65 } 66 67 //掃描類 68 class Scanner 69 { 70 string m_host; 71 int m_port; 72 73 public Scanner(string host, int port) 74 { 75 m_host = host; m_port = port; 76 } 77 78 public void Scan() 79 { 80 //我們直接使用比較高級的TcpClient類 81 TcpClient tc = new TcpClient(); 82 //設置超時時間 83 tc.SendTimeout = tc.ReceiveTimeout = 2000; 84 try 85 { 86 //Console.Write("Checking port: {0}", m_port); 87 //嘗試連接 88 tc.Connect(m_host, m_port); 89 if (tc.Connected) 90 { 91 //如果連接上,證明此商品為開放狀態 92 Console.WriteLine("Port {0} is Open", m_port.ToString().PadRight(6)); 93 Program.openedPorts.Add(m_port); 94 } 95 } 96 catch (System.Net.Sockets.SocketException e) 97 { 98 //容錯處理 99 Console.WriteLine("Port {0} is closed", m_port.ToString().PadRight(6)); 100 //Console.WriteLine(e.Message); 101 } 102 finally 103 { 104 tc.Close(); 105 tc = null; 106 Program.scannedCount++; 107 Program.runningThreadCount--; 108 109 //Console.WriteLine(Program.scannedCount); 110 111 } 112 } 113 } 114} 115 116 117
好了,代碼很簡單吧!只能掃描TCP端口哦。