基于C#实现的端口扫描器实例代码

本文所述为基于C#实现的端口扫描器代码,代码内包括了窗体和逻辑处理两部分代码。在代码中,创建TcpClient对象,把TcpClient用于为TCP网络服务提供客户端连接,创建线程,并创建ThreadStart委托对象,端口扫描范围为[0-65536],也可自定义扫描范围。

功能主要代码如下:

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Net.Sockets;
using System.Threading;
namespace PortScanner
{
 public class Form1: System.Windows.Forms.Form
 {
 private System.Windows.Forms.TextBox txtAddr;
 private System.Windows.Forms.TextBox txtStart;
 private System.Windows.Forms.TextBox txtEnd;
 private System.Windows.Forms.Label label1;
 private System.Windows.Forms.Label label2;
 private System.Windows.Forms.Label label3;
 private System.Windows.Forms.Splitter splitter1;
 private System.Windows.Forms.ListBox lbResult;
 private System.Windows.Forms.Button btnScan;
 private System.Windows.Forms.ProgressBar progressBar1;
 private System.Windows.Forms.Label lblStart;
 private System.Windows.Forms.Label lblStop;
 private System.Windows.Forms.Label lblNow;
 //自定义变量
 private int port;
 private string Addr;
 private bool[] done = new bool[65536];
 private int start;
 private int end;
 private Thread scanThread;
 private bool OK;
 public Form1()
 {
  InitializeComponent();
 }
 private void InitializeComponent()
 {
  this.lbResult = new System.Windows.Forms.ListBox();
  this.txtAddr = new System.Windows.Forms.TextBox();
  this.txtStart = new System.Windows.Forms.TextBox();
  this.txtEnd = new System.Windows.Forms.TextBox();
  this.label1 = new System.Windows.Forms.Label();
  this.label2 = new System.Windows.Forms.Label();
  this.label3 = new System.Windows.Forms.Label();
  this.splitter1 = new System.Windows.Forms.Splitter();
  this.btnScan = new System.Windows.Forms.Button();
  this.progressBar1 = new System.Windows.Forms.ProgressBar();
  this.lblStart = new System.Windows.Forms.Label();
  this.lblStop = new System.Windows.Forms.Label();
  this.lblNow = new System.Windows.Forms.Label();
  this.SuspendLayout();
  //
  // lbResult
  //
  this.lbResult.Dock = System.Windows.Forms.DockStyle.Right;
  this.lbResult.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
  this.lbResult.ItemHeight = 14;
  this.lbResult.Location = new System.Drawing.Point(224, 0);
  this.lbResult.Name = "lbResult";
  this.lbResult.Size = new System.Drawing.Size(264, 270);
  this.lbResult.TabIndex = 0;
  //
  // txtAddr
  //
  this.txtAddr.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
  this.txtAddr.Location = new System.Drawing.Point(72, 16);
  this.txtAddr.Name = "txtAddr";
  this.txtAddr.Size = new System.Drawing.Size(136, 22);
  this.txtAddr.TabIndex = 1;
  this.txtAddr.Text = "";
  //
  // txtStart
  //
  this.txtStart.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
  this.txtStart.Location = new System.Drawing.Point(72, 48);
  this.txtStart.Name = "txtStart";
  this.txtStart.Size = new System.Drawing.Size(136, 22);
  this.txtStart.TabIndex = 2;
  this.txtStart.Text = "";
  this.txtStart.TextChanged += new System.EventHandler(this.txtStart_TextChanged);
  //
  // txtEnd
  //
  this.txtEnd.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
  this.txtEnd.Location = new System.Drawing.Point(72, 80);
  this.txtEnd.Name = "txtEnd";
  this.txtEnd.Size = new System.Drawing.Size(136, 22);
  this.txtEnd.TabIndex = 3;
  this.txtEnd.Text = "";
  this.txtEnd.TextChanged += new System.EventHandler(this.txtEnd_TextChanged);
  //
  // label1
  //
  this.label1.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
  this.label1.Location = new System.Drawing.Point(8, 16);
  this.label1.Name = "label1";
  this.label1.Size = new System.Drawing.Size(64, 23);
  this.label1.TabIndex = 4;
  this.label1.Text = "主机地址";
  //
  // label2
  //
  this.label2.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
  this.label2.Location = new System.Drawing.Point(8, 80);
  this.label2.Name = "label2";
  this.label2.Size = new System.Drawing.Size(64, 23);
  this.label2.TabIndex = 5;
  this.label2.Text = "结束端口";
  //
  // label3
  //
  this.label3.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
  this.label3.Location = new System.Drawing.Point(8, 48);
  this.label3.Name = "label3";
  this.label3.Size = new System.Drawing.Size(64, 23);
  this.label3.TabIndex = 6;
  this.label3.Text = "起始端口";
  //
  // splitter1
  //
  this.splitter1.Dock = System.Windows.Forms.DockStyle.Right;
  this.splitter1.Location = new System.Drawing.Point(221, 0);
  this.splitter1.Name = "splitter1";
  this.splitter1.RightToLeft = System.Windows.Forms.RightToLeft.Yes;
  this.splitter1.Size = new System.Drawing.Size(3, 273);
  this.splitter1.TabIndex = 7;
  this.splitter1.TabStop = false;
  //
  // btnScan
  //
  this.btnScan.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
  this.btnScan.Location = new System.Drawing.Point(72, 200);
  this.btnScan.Name = "btnScan";
  this.btnScan.TabIndex = 8;
  this.btnScan.Text = "扫描";
  this.btnScan.Click += new System.EventHandler(this.btnScan_Click);
  //
  // progressBar1
  //
  this.progressBar1.Location = new System.Drawing.Point(8, 112);
  this.progressBar1.Name = "progressBar1";
  this.progressBar1.Size = new System.Drawing.Size(200, 23);
  this.progressBar1.Step = 1;
  this.progressBar1.TabIndex = 9;
  //
  // lblStart
  //
  this.lblStart.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
  this.lblStart.Location = new System.Drawing.Point(8, 144);
  this.lblStart.Name = "lblStart";
  this.lblStart.Size = new System.Drawing.Size(48, 23);
  this.lblStart.TabIndex = 10;
  //
  // lblStop
  //
  this.lblStop.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
  this.lblStop.Location = new System.Drawing.Point(160, 144);
  this.lblStop.Name = "lblStop";
  this.lblStop.Size = new System.Drawing.Size(48, 23);
  this.lblStop.TabIndex = 11;
  //
  // lblNow
  //
  this.lblNow.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
  this.lblNow.Location = new System.Drawing.Point(84, 144);
  this.lblNow.Name = "lblNow";
  this.lblNow.Size = new System.Drawing.Size(48, 23);
  this.lblNow.TabIndex = 12;
  this.AutoScaleBaseSize = new System.Drawing.Size(6, 15);
  this.ClientSize = new System.Drawing.Size(488, 273);
  this.Controls.Add(this.lblNow);
  this.Controls.Add(this.lblStop);
  this.Controls.Add(this.lblStart);
  this.Controls.Add(this.progressBar1);
  this.Controls.Add(this.btnScan);
  this.Controls.Add(this.splitter1);
  this.Controls.Add(this.label3);
  this.Controls.Add(this.label2);
  this.Controls.Add(this.label1);
  this.Controls.Add(this.txtEnd);
  this.Controls.Add(this.txtStart);
  this.Controls.Add(this.txtAddr);
  this.Controls.Add(this.lbResult);
  this.Font = new System.Drawing.Font("Tahoma", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(0)));
  this.Name = "Form1";
  this.Text = "端口扫描器";
  this.ResumeLayout(false);
 }
 [STAThread]
 static void Main()
 {
  Application.Run(new Form1());
 }
 private void btnScan_Click(object sender, System.EventArgs e)
 {
  //创建线程,并创建ThreadStart委托对象
  Thread process = new Thread(new ThreadStart(PortScan));
  process.Start();
  //显示端口扫描的范围
  progressBar1.Minimum = Int32.Parse(txtStart.Text);
  progressBar1.Maximum = Int32.Parse(txtEnd.Text);
  //显示框初始化
  lbResult.Items.Clear();
  lbResult.Items.Add("端口扫描器 v1.0.");
  lbResult.Items.Add("");
 }
 private void PortScan()
 {
  start = Int32.Parse(txtStart.Text);
  end = Int32.Parse(txtEnd.Text);
  //检查输入范围合法性
  if ((start >= 0 && start <= 65536) && (end >= 0 && end <= 65536) && (start <= end))
  {
  lbResult.Items.Add("开始扫描... (可能需要请您等待几分钟)");
  Addr = txtAddr.Text;
  for (int i = start; i <= end; i++)
  {
   port = i;
   //使用该端口的扫描线程
   scanThread = new Thread(new ThreadStart(Scan));
   scanThread.Start();
   //使线程睡眠
   System.Threading.Thread.Sleep(100);
   progressBar1.Value = i;
   lblNow.Text = i.ToString();
  }
  //未完成时情况
  while (!OK)
  {
   OK = true;
   for (int i = start; i <= end; i++)
   {
   if (!done[i])
   {
    OK = false;
    break;
   }
   }
   System.Threading.Thread.Sleep(1000);
  }
  lbResult.Items.Add("扫描结束!");
  }
  else
  {
  MessageBox.Show("输入错误,端口范围为[0-65536]");
  }
 }
 private void Scan()
 {
  int portnow = port;
  //创建线程变量
  Thread Threadnow = scanThread;
  done[portnow] = true;
  //创建TcpClient对象,TcpClient用于为TCP网络服务提供客户端连接
  TcpClient objTCP = null;
  //扫描端口,成功则写入信息
  try
  {
  //用TcpClient对象扫描端口
  objTCP = new TcpClient(Addr, portnow);
  lbResult.Items.Add("端口 " + portnow.ToString() + " 开放!");
  }
  catch
  {
  }
 }
 private void txtStart_TextChanged(object sender, System.EventArgs e)
 {
  //获取输入的起始端口值
  lblStart.Text = txtStart.Text;
 }
 private void txtEnd_TextChanged(object sender, System.EventArgs e)
 {
  //获取输入的接受端口值
  lblStop.Text = txtEnd.Text;
 }
 }
}
时间: 2014-07-23

C实现的非阻塞方式命令行端口扫描器源码

该实例是一个C实现的基于命令行模式端口扫描代码,并且是以非阻塞方式来实现对IP和端口的连接测试.为了大家使用和学习方便,已在代码中尽可能多的地方加入了注释,相信对于帮助大家理解C端口扫描有很大帮助. 具体功能代码如下: #include <afxext.h> #include <winsock.h> // 编译时需使用的库 #pragma comment(lib,"wsock32.lib") // select()成员定义 #define ZERO (fd_se

c++ 端口扫描程序实现案例

第一.原理 端口扫描的原理很简单,就是建立socket通信,切换不通端口,通过connect函数,如果成功则代表端口开发者,否则端口关闭. 所有需要多socket程序熟悉,本内容是在window环境下的 第二.单线程实现方式 // PortScanf.cpp : 定义控制台应用程序的入口点. // #define WIN32_LEAN_AND_MEAN #include "stdafx.h" #include <WinSock2.h> #pragma comment(lib

基于Python socket的端口扫描程序实例代码

本文研究的主要是Python的端口扫描程序,具体实例代码如下. 先来看看第一个端口扫描程序代码,获取本机的IP和端口号: import socket def get_my_ip(): try: csock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) csock.connect(('8.8.8.8', 80)) (addr, port) = csock.getsockname() csock.close() return addr,port

Python实现的端口扫描功能示例

本文实例讲述了Python实现的端口扫描功能.分享给大家供大家参考,具体如下: 一 代码 import sys import socket import multiprocessing def ports(ports_service): #获取常用端口对应的服务名称 for port in list(range(1,100))+[143,145,113,443,445,3389, 8080]: try: ports_service[port] = socket.getservbyport(por

Python端口扫描简单程序

本文实例为大家分享了Python端口扫描的实现代码,供大家参考,具体内容如下 获取本机的IP和端口号: import socket def get_my_ip(): try: csock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) csock.connect(('8.8.8.8', 80)) (addr, port) = csock.getsockname() csock.close() return addr,port except s

PowerShell脚本开发之对指定IP进行端口扫描

前些天看到一篇关于Metasploit与PowerShell的文章,里面提到了一句关于端口扫描的语句,写的很简练,思路很不错,可以抛开笨重的Nmap直接扫描指定的指定IP的端口: 复制代码 代码如下: 1..1024 | %{ echo ((new-object Net.Sockets.TcpClient).Connect("192.168.10.26",$_)) "$_ is open"} 2>$null 语句中直接通过..列举了1到1024之间的数字,通过

python实现的多线程端口扫描功能示例

本文实例讲述了python实现的多线程端口扫描功能.分享给大家供大家参考,具体如下: 下面的程序给出了对给定的ip主机进行多线程扫描的Python代码 #!/usr/bin/env python #encoding: utf-8 import socket, sys, thread, time openPortNum = 0 socket.setdefaulttimeout(3) def usage(): print '''''Usage: Scan the port of one IP: py

python端口扫描系统实现方法

本文实例讲述了python端口扫描系统实现方法.分享给大家供大家参考.具体实现方法如下: 该程序的主要功能如下: 1. 从自有API接口获取所有的外网IP段: 2. 用Nmap 遍历扫描所有的IP段,-oX 生成XML的扫描报告: 3. 用xml.etree.ElementTree模块方法读取XML文件,将ip,开放端口,对应服务等写入Mysql数据库. 功能很简单,没有满足老大高大上的需求,所以这个小项目就这么英勇的挂掉了!~~~完全都还没考虑程序异常终止,扫描服务器异常歇菜的情况. 贴上代码

python基础教程之udp端口扫描

一.概述任务描述:开发一个程序,用于获取局域网中开启snmp服务的主机ip地址列表,并写入相应文件以便其它程序使用.背景知识:SNMP是基于UDP的,而且标准的SNMP服务使用161和162端口.思路:1.获取局域在线主机列表:2.获取各个主机的snmp端口(比如161)开启状况:3.以特定格式写入特定文件.这里只实现前两步. 二.nmap实现1.安装nmapLinux平台(CentOS为例): yum install nmap -y     widows平台(下载地址):http://nmap

python3实现高效的端口扫描

我们通过python-nmap实现一个高效的端口扫描工具,与定时作业crontab及邮件告警结合,可以很好的帮助我们及时发现异常开放的高危端口.当然,该工具也可以作为业务服务端口的可用性探测,例如扫描192.168.209.121-125网段Web服务端口80s是否处于open状态.我们这里所采用的scan方法arguments参数指定为-v -PE -p + 端口, -v表示启用细节模式,可以返回非up状态主机清单:-PE表示采用TCP同步扫描(TCP SYN)方式; -p指定扫描端口范围.程

python基于socket函数实现端口扫描

本文实例为大家分享了python基于socket实现端口扫描的具体代码,供大家参考,具体内容如下 自学Python一段时间,写个端口扫描器练练手.有什么不足之处,请见谅 这是基于socket函数对端口进行端口扫描 所以,首先要导入socket模块 from socket import * 其次,通过正侧表达式来判断输入的是不是IP地址 compile_ip = re.compile( '^(1\d{2}|2[0-4]\d|25[0-5]|[1-9]\d|[1-9])\.(1\d{2}|2[0-4