C#進行端口掃描的代碼

xg48 9年前發布 | 3K 次閱讀 C#

主要是利用套接字,來和遠程主機的逐個端口進行連接,如果連接上說明該端口是開放的,否則是關閉的。當然現在各種安全技術發展迅速,使得這種方法掃描的端口可能不太準確,但是總得從最基本的學起吧~~

實現起來也不難,關鍵是看執行效率如何,如果使用傳統的逐個端口掃描,效率很低,即使是掃描本機,平均每個端口也需要1秒左右。提高效率的方法有很多如多線程、異步掃描。我采用的是異步掃描方式,其實這種方式也是一種多線程的方式,只是線程是交由系統創建的。

代碼轉自:http://blog.csdn.net/xiaohui_hubei/

</div>


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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!