C#端口扫描

端口扫描

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
//增加的如下..
using System.Data;
using System.Net.Sockets;
using System.Net;
using System.IO;
using System.Text;
using System.Threading;

namespace iPortScan
{
 /// <summary>
 /// Summary description for Form1.
 /// </summary>
 public class Form1 : System.Windows.Forms.Form
 {
  //该处放的是程序要用到的公共变量
  public string scanHost = Dns.GetHostName(); //默认当前本机IP
  public Int32 tport = 0; //当前连接端口编号
  public Int32 connState = 0; //扫描状态
  public int portSum = 0 ; //端口总计
  public bool endThread = false; //结束状态
  public AutoResetEvent asyncOpsAreDone = new AutoResetEvent(false);
  private System.Windows.Forms.Label label1 = new Label();
  private System.Windows.Forms.TextBox txtHostname;
  private System.Windows.Forms.Button cmdExec;
  private System.Windows.Forms.ListBox logList;
  public System.Windows.Forms.CheckedListBox portList;
  private System.Windows.Forms.Label label2;
  private System.Windows.Forms.Label label3;
  private System.Windows.Forms.NumericUpDown sNum;
  private System.Windows.Forms.NumericUpDown eNum;
  private System.Windows.Forms.CheckBox showdie;
  private System.Windows.Forms.Label label4;
  private System.Windows.Forms.Button button1;
  private System.Windows.Forms.ToolTip toolTip1;
  private System.Windows.Forms.StatusBar statusBar1;
  private System.Windows.Forms.LinkLabel linkLabel1;
  private System.Windows.Forms.LinkLabel linkLabel2;
  private System.ComponentModel.IContainer components;
  /*
  此处省略了各个调用的控件的属性设置代码
  */
  static void Main()
  {
   Application.Run(new Form1());
  }

  private void cmdExec_Click(object sender, System.EventArgs e)
  {
   Int32 startPort = (Int32)sNum.Value;
   Int32 endPort = (Int32)eNum.Value;
   if(txtHostname.Text.Length==0)
   {
    MessageBox.Show("请输入一个主机的名称吧!","系统提示");
    txtHostname.Text = scanHost.ToString();
    txtHostname.Focus();
    return;
   }
   if(startPort>endPort)
   {
    MessageBox.Show("错误,起始端口必须要小于结束的端口!","系统提示");
    startPort = endPort-1;
    sNum.Text = startPort.ToString();
    sNum.Focus();
    return ;
   }

   if(cmdExec.Text=="&Scan")
   {
    endThread= false;
    cmdExec.Text= "&Stop";
   }
   else
   {
    endThread= true;
    cmdExec.Text= "&Scan";
   }

   if(endThread!=true)
   {
    connState = 0;
    portSum = 0;
    scanHost = txtHostname.Text;
    try
    {
     IPAddress ipaddr =(IPAddress)Dns.Resolve(scanHost).AddressList.GetValue(0);
     txtHostname.Text = ipaddr.ToString();
    }
    catch
    {
     txtHostname.Focus();
     MessageBox.Show("请输入正确的主机地址,该地址DNS无法解析","系统提示");
     return ;
    }
    logList.Items.Clear();

    for (Int32 threadNum = startPort; threadNum <=endPort; threadNum++)
    {
     ThreadPool.QueueUserWorkItem(new WaitCallback(Startscan),threadNum);
     logList.Items.Add ("扫描端口:" + threadNum.ToString());
    }

   }
  }
  public void Startscan(Object state)
  {
   Int32 port = (Int32) state;
   string tMsg = "";
   string getData = "";
   int lindex = 0;
   int eindex = 0;
   connState++; //判断线程数目
   if(endThread==true)
   {
    if(connState==((Int32)eNum.Value-(Int32)sNum.Value))
    {
     cmdExec.Text = "&Scan";
     logList.Items.Add ("扫描完毕!");
    }
    else
    {
     cmdExec.Text = "&Stop";
     logList.Items.Add ("正在停止对"+port.ToString()+"端口的扫描线程");
    }
    logList.Items.Add("结束线程:"+port.ToString());
    asyncOpsAreDone.Close();
   }
   else
   {
    try
    {
     TcpClient tcp = new TcpClient();
     tcp.Connect(scanHost,port);
     //该处如果建立连接错误的话,将不执行下面的代码..
     portSum ++;
     lindex = portList.Items.Add(port.ToString() + "端口开放",false);
     portList.SelectedIndex=lindex;
     Stream sm = tcp.GetStream();
     sm.Write(Encoding.Default.GetBytes(tMsg.ToCharArray()),0,tMsg.Length);
     StreamReader sr = new StreamReader(tcp.GetStream(),Encoding.Default);
     getData = sr.ReadLine();
     if(lindex!=0&&getData.Length!=0)
     {
      tMsg = " +-" + port.ToString() + "端口数据:"+getData.ToString();
      eindex = portList.Items.Add(tMsg); //插入一条信息记录
      portList.Items.Insert(lindex+1,tMsg);
      portList.Items.RemoveAt(eindex);
     }
     sr.Close();
     sm.Close();
     tcp.Close();
    }
    catch
    {
     //显示坏死的端口
     if(showdie.Checked==true)
     {
      portList.Items.Add(port.ToString()+"端口无法连接,回传数据为空");
     }
    }
    finally
    {
     Thread.Sleep(0);
     logList.Items.Add("结束线程:"+port.ToString());
     asyncOpsAreDone.Close();
     statusBar1.Text = "端口总计:"+portSum.ToString() ;
     if(connState==((Int32)eNum.Value-(Int32)sNum.Value))
     {
      cmdExec.Text = "&Scan";
     }
    }
   }
  }

  private void button1_Click(object sender, System.EventArgs e)
  {
   Application.Exit();
  }

 }
}

时间: 2024-11-03 13:30:48

C#端口扫描的相关文章

ASP实现TCP端口扫描的方法

本文详细介绍关于ASP实现TCP端口扫描的方法的文章专题. 用ASP久了,就会感到有个很郁闷的地方:ASP不像其他脚本语言那样能访问Socket.所以或许你用过PHP.Perl等实现的端口扫描器,惟独没见过ASP的.嘿嘿,所以今天本文的目的就是利用"曲线救国"的策略实现ASP端口扫描器.Only for enjoy! 所谓曲线,呵呵,当然是利用其他的访问网络的组件,那么ASP有哪些组件可以访问网络呢? 第一个很容易想到,对,就是XMLHTTP.这个组件是以HTTP协议访问网络,当然可以

端口扫描程序java实现

程序|端口扫描 怎么样扫描计算机系统本地和远程的端口,监测其是打开还是关闭的在很多应用程序中都要用到,下面是用java实现的简单的端口扫描程序. Source Code: -------------------------------------------------------------------------------- /* * Created on 2005-3-22 * * TODO To change the template for this generated file g

TCP端口扫描的ASP实现方法

端口扫描 用ASP久了,就会感到有个很郁闷的地方:ASP不像其他脚本语言那样能访问Socket.所以或许你用过PHP.Perl等实现的端口扫描器,惟独没见过ASP的.嘿嘿,所以今天本文的目的就是利用"曲线救国"的策略实现ASP端口扫描器.Only for enjoy! 所谓曲线,呵呵,当然是利用其他的访问网络的组件,那么ASP有哪些组件可以访问网络呢? 第一个很容易想到,对,就是XMLHTTP.这个组件是以HTTP协议访问网络,当然可以用作端口扫描.但存在一个很难解决的问题:如果某端口

C#编写的多线程端口扫描程序

程序|端口扫描|多线程 作者: 萧寒雪 有幸购买到Visual studio .net 的光盘,急忙安装一套,一用感觉非常好,所学写端口扫描程序一只,献给本版的朋友们:) using System;: using System.Drawing;: using System.Collections;: using System.ComponentModel;: using System.Windows.Forms;: //增加的如下.. using System.Data;: using Syst

利用Java线程池技术实现TCP端口扫描

一个简单的利用线程池技术实现端口扫描(TCP)的小程序: 关键代码如下: // 扫描本机private void getLocal(){ String ip = getIP(); String portStart = txPortStart1.getText().trim(); String portEnd = txPortEnd1.getText().trim(); if (portStart.length() == 0 || portEnd.length() == 0) return; in

一个简单的端口扫描程序题

一.TCP扫描技术 常用的端口扫描技术有很多种,如 TCP connect() 扫描 .TCP SYN 扫描.TCP FIN 扫描 等,网络上也有很多文章专门介绍,比如 :http://www.antai-genecon.com/suml/zhishiyy/jingong/duankougj.htm 上就介绍了很多我的程序 所使用的最基本的扫描技术:TCP 扫描. 操作系统提供的 connect() 系统调用,用来与每一个感兴趣的目标计算机的端口进行连接.如果端口处于侦听状态,那么connect

如何防止网络监听与端口扫描

1.使用安全工具 有许多工具可以让我们发现系统中的漏洞,如SATAN等.SATAN是一个分析网络的管理.测试和报告许多信息,识别一些与网络相关的安全问题. 对所发现的问题,SATAN提供对这个问题的解释以及可能对系统和网络安全造成影响的程度,并且通过工具所附的资料,还能解释如何处理这些问题. 当然还有很多像这样的安全工具.包括对TCP端口的扫描或者对多台主机的所有TCP端口实现监听:分析网络协议.监视控制多个网段等,正确使用这些安全工具,及时发现系统漏洞,才能防患于未然. 而对于WindowsN

Linux管理员:企业端口扫描策略

  企业端口扫描策略 1.端口扫描的目的 对于位于网络中的计算机系统来说,一个端口就是一个潜在的通信通道,也就是一个入侵通道.对目标计算机进行端口扫描,能得到许多有用的信息从而发现系统的安全漏洞.通过其可以使系统用户了解系统目前向外界提供了哪些服务,从而为系统用户管理网络提供了一种参考的手段. 从技术原理上来说,端口扫描向目标主机的TCP/UDP服务端口发送探测数据包,并记录目标主机的响应.通过分析响应来判断服务端口是打开还是关闭,就可以得知端口提供的服务或信息. 端口扫描也可以通过捕获本地主机

Python实现的多线程端口扫描工具分享_python

昨晚今晚写了两晚,总算把Py Port Scanner 写完了,姑且称之为0.1版本,算是一个Python多线程端口扫描工具. 水平有限,实话中间有一些困惑和不解的地方,代码可能也写的比较乱.有些问题并未找到很好的解决方法,还望大家谅解.速度大家自己试验,我感觉还行. 送上效果图两份,分别是扫单IP和扫IP段: 源码: 复制代码 代码如下: # -*- coding: utf-8 -*- __author__ = 'Phtih0n' import threading, socket, sys,