65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 ASP.NET 进行端口扫描

starIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIconemptyStarIcon

1.43/5 (8投票s)

2005年10月16日

CPOL

2分钟阅读

viewsIcon

62147

downloadIcon

1534

我查阅了许多资料,但没有找到用 C# 和 ASP.NET 编写的端口扫描器。

引言

这是一种老式的方法,用于了解目标端口是否打开。我找过一些快速且不错的端口扫描器,但没有找到,而且这个扫描器当然不像 nmap 那样,它只是连接端口,如果连接成功就说明端口已打开。

顺便说一下,HTTP 指纹识别是这个 Web 应用程序的一部分,它检查目标端口 80 是否打开,并输出结果。我想用户在看到输出后,就能理解目标运行的是什么操作系统。

用法

你只需要提供 IP 地址或 URL,以及起始端口和结束端口。然后,观看神奇的发生。

一些性能技巧

如果不使用线程,它会比现在慢 10 倍。实际上,我们不需要使用数据库来解释端口,但这样看起来更好,可以查看迄今为止在这些端口上看到的内容。

ASP.NET 2 和 System.Net.Sockets 非常强大且易于使用。

 
StartPort = Convert.ToInt32(numStart.Text);
EndPort = Convert.ToInt32(numEnd.Text);
ipAdres = txtIP.Text;
Thread[] pool = new Thread[(EndPort - StartPort) + 1];
int i = 0;

DateTime start = DateTime.Now;
// Loop through the ports between start port and end port
for (int CurrPort = StartPort; CurrPort <= EndPort; CurrPort++)
{
    Thread th = 
         new Thread(new System.Threading.ParameterizedThreadStart(portAc));
    //NOTE: better to leave to system.
    // th.Priority = ThreadPriority.AboveNormal;
    th.Start(CurrPort);
    pool[i] = th;
    i++;
}
#region thread pool
int k = --i;
int retryCount = 0;
for (; i >= 0; i--)
{
    if (pool[i].IsAlive)
    {
        i = k;
        retryCount++;
        continue;
    }
    if (retryCount == 1000)
    {
        break;
    }
}
#endregion

#region httpfinger
if (http)
{
    // Create a request for the URL.         
    WebRequest request = WebRequest.Create("http://" + txtIP.Text);
    // If required by the server, set the credentials.
    request.Credentials = CredentialCache.DefaultCredentials;
    // Get the response.
    try{
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();

        string serverType = response.Headers["server"];
        if (serverType.Contains("IIS"))
        {
            lblServer.Text = "Windows System ";
            if (serverType.Contains("5."))
            {
                lblServer.Text += "XP/2000";
            }
            if (serverType.Contains("6."))
            {
                lblServer.Text += "2003";
            }
        }
        if (serverType.ToLower().Contains("apache"))
        {
            lblServer.Text += "probably linux";
        }
        lblServer.Text += "
" + serverType;
    }
    catch(Exception Err){
        //sometime which returns 404 and it makes a problem.
    }
}
#endregion

DateTime end = DateTime.Now;
TimeSpan sonuc = end - start;
lblzaman.Text = sonuc.TotalSeconds + " total secs";
   
这段代码完成了主要的工作,当然,我们需要为端口打开和连接提供线程函数。

public void portAc(object portNoObj)
{
    int portNo = (int)portNoObj;
    TcpClient TcpScan = new TcpClient();
    try
    {
        // Try to connect
        TcpScan.Connect(ipAdres, portNo);

        if (!TcpScan.Connected) return;
        // If there's no exception, we can say the port is open
        log += "Port " + portNo + " open\r\n";

        //NOTE: We may include more finger tips to here
        switch (portNo)
        {
            case 80: http = true; break;
        }

        try
        {
            DataRow dr = dt.NewRow();
            dr[0] = "http://www.portsdb.org/bin/portsdb.cgi?portnumber=" + 
                     portNo + "&protocol=ANY&String=";
            dt.Rows.Add(dr);
        } // Ends Try
        catch (Exception Err)
        {
            throw Err;
        }
    }
    catch
    {
        // An exception occured, thus the port is probably closed
    }
}

    

TcpClient 类提供了简单的连接、发送和接收网络流数据的同步阻塞模式方法。但我们只是使用了它的 Connect 函数来查看端口是否打开。你可以使用一个 for 循环来尝试这个 portAc 函数,自己看看。如果我们没有使用线程,我们会损失多少时间。

合法性问题

对我来说是合法的,而且 Google 也不知道你怎么看。如果你将其用于安全目的,并查看发生了什么,那不是什么大问题。

结论

扫描器的代码非常容易理解。只需下载源代码并享受乐趣。此应用程序无法在 ASP.NET 1.x 下运行。你需要 ASP.NET 2.0。

© . All rights reserved.