- 上网很久的朋友一定对端口扫描器不会陌生吧。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 , /n total {1} ports scanned, /nopened ports :{2}",
- 60 host, (endPort - startPort), openedPorts.Count);
- 61
- 62 foreach (int port in openedPorts)
- 63 Console.WriteLine("/tPort: {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端口哦。