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

一、TCP扫描技术

常用的端口扫描技术有很多种,如 TCP connect() 扫描 、TCP SYN 扫描、TCP FIN 扫描 等,网络上也有很多文章专门介绍,比如 :http://www.antai-genecon.com/suml/zhishiyy/jingong/duankougj.htm 上就介绍了很多我的程序 所使用的最基本的扫描技术:TCP 扫描。

操作系统提供的 connect() 系统调用,用来与每一个感兴趣的目标计算机的端口进行连接。如果端口处于侦听状态,那么connect()就能成功。否则,这个端口是不能用的,即没有提供服务。这个技术的一个最大的优点是,你不需要任何权限。系统中的任何用户都有权利使用这个调用。另一个好处就是速度。如果对每个目标端口以线性的方式,使用单独的connect()调用,那么将会花费相当长的时间,你可以通过同时打开多个套接字,从而加速扫描。使用非阻塞 I/O 允许你设置一个低的时间用尽周期,同时观察多个套接字。但这种方法的缺点是很容易被发觉,并且被过滤掉。目标计算机的logs文件会显示一连串的连接和连接是出错的服务消息,并且能很快的使它关闭。

作者提示:未经许可扫描他人的计算机端口属非法行为。本程序只是展示一种端口扫描技术,请不得将其用于非法目的,否则后果自负。

二、程序简介

为了提高扫描速度,本程序采用了多线程技术和非阻塞I/O的技术。程序的主界面是一个对话框,下面是程序框架示意图:


1、全局变量:

以下是所有全局变量的定义:HWND g_hWnd = NULL; //处理消息的窗口句柄
unsigned long g_ulAddr = INADDR_NONE; //扫描的主机地址
DWORD g_dwTimeOut = 1000; //连接超时时间,以ms计
bool g_bTerminate = false; //是否用户发出结束扫描的标志
short g_nMaxThread = 200; //最大允许的扫描线程数,经试验不宜大于200
short g_nThreadCount = 0; //当前正在扫描的进程数
2、StartScan 线程:

这个线程完成的任务是启动具体的扫描DoScanPort线程,对某一个端口进行扫描。该进程启动的DoScanPort线程的最大数量在设定的值范围内,如果线程数已达最大,则会等待某些线程结束后再启动新的线程。如果用户发出结束扫描信息,则不再启动新的线程,而等待已启动的线程结束后返回。下面是这线程的执行体代码:DWORD WINAPI StartScan(LPVOID lpParam)
{
  tag_PORTS* pScanParam = (tag_PORTS*)lpParam;

  DWORD dwThreadId;
  unsigned short i;
  if (pScanParam->bSepecifiedPort)
  {
    for(i=0; i<=pScanParam->nCount; i++)
    {
      if (g_bTerminate)
      {
        break;  //用户已发出结束扫描命令
      }
      while(g_nThreadCount >= g_nMaxThread)
      {
        Sleep(10);
      }

      if (CreateThread(NULL,
               0,
               DoScanPort,
               (LPVOID)new short(pScanParam->nArrOfPorts[i]),
               0,
               &dwThreadId) != NULL)
      {
        g_nThreadCount ++;
      }
    }
  }
  else
  {
    for(i=pScanParam->iStartPort; i<=pScanParam->iEndPort; i++)
    {
      if (g_bTerminate)
      {
        break;  //用户已发出结束扫描命令
      }
        while(g_nThreadCount >= g_nMaxThread)
      {
        Sleep(10);
      }
      if (CreateThread(NULL, 0, DoScanPort, (LPVOID)new short(i), 0, &dwThreadId) != NULL)
      {
        g_nThreadCount ++;
      }
    }
  }

  //等待各端口扫描线程结束
  while (g_nThreadCount > 0)
  {
    Sleep(50);
  }
  ::SendMessage(g_hWnd, SCAN_THREAD, STARTSCAN_COMPLETE, 0);
  delete pScanParam;
  return ERROR_SUCCESS;
}

时间: 2024-08-03 12:51:15

一个简单的端口扫描程序题的相关文章

端口扫描程序java实现

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

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

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

构建一个简单的演示应用程序Watson Films

本文将使用 Watson Question and Answer (Q&A) 技术和 Watson 所公开的 Q&A API 构建一个简单的演示应用程序 Watson Films.认知存在于人类所做的几乎任何活动中,比如语言理解.感觉.判断.运动技巧.学习.空间处理和社交行为.我们越来越期望所使用的机器能表现出相同的认知行为.IBM Watson 代表着向认知系统(一个新的计算时代)进军的第一步.除了使用编程计算,Watson 拥有 3 大让它变得真正独一无二的功能: 自然语言处理 假设生

使用NetBeans IDE创建并运行一个简单的web应用程序

在本教程中,您将使用 NetBeans IDE 创建并运行一个简单的 web 应用程序,Hello Web.本示例应用程序要求您输入一个名字,之后使用那个名字显示一条信息.首先,您需要使用一个输入框来实现这个页面.之后您使用一个用户可以选择名字的下拉列表来替换那个输入框.下拉列表中输入的名字来自数据库表. 本教程需要以下技术以及资源的支持 JavaServer Faces 组件/Java EE 平台 1.2 with Java EE 5*1.1 with J2EE 1.4 Travel 数据库

Java核心技术卷I基础知识3.1 一个简单的Java应用程序

第3章 Java的基本程序设计结构 ▲  一个简单的Java应用程序     ▲  字符串 ▲  注释                      ▲  输入输出 ▲  数据类型               ▲  控制流 ▲  变量                      ▲  大数值 ▲  运算符                  ▲  数组   现在,假定已经成功地安装了JDK,并且能够运行第2章中给出的示例程序.我们从现在开始将介绍Java应用程序设计.本章主要介绍程序设计的基本概念(如数

Cocoa练习01:一个简单的Todo list程序

写一个简单的todo list程序,界面如下图: 在TextField区域输入文字,点击Add按钮会将文字显示在下面的TableView列表中.TableView列表有2列,第一列是文字的输入时间:第二列是文字内容本身.同时TableView的第二列是可以实时手动编辑修改的,修改后自动会修正对应第一列的时间: 1.在AppDelegate类的接口中首先绑定2个outlet和1个action: - (IBAction)add:(id)sender; @property (weak) IBOutle

《精通 ASP.NET MVC 5》----2.4 创建一个简单的数据录入应用程序

2.4 创建一个简单的数据录入应用程序 本章的其余部分将通过建立一个简单的数据录入应用程序来考查MVC的更多基本特性.本小节打算分步进行,目的是演示MVC的运用,因此会跳过对幕后工作原理的一些解释.但不必担心,在后面的章节中会重新深入地讨论这些论题. 2.4.1 设置场景 假设一个朋友决定举行一个"新年除夕晚会",于是她请笔者为其创建一个Web应用程序,以便让受邀人进行电子回复(RSVP).她的要求有以下4个关键特性. 一个显示此晚会信息的首页. 一个可以用来进行电子回复(RSVP)的

《精通 ASP.NET MVC 4》----2.4 创建一个简单的数据录入应用程序

2.4 创建一个简单的数据录入应用程序 精通 ASP.NET MVC 4 本章的其余部分将通过建立一个简单的数据录入应用程序,来考察MVC的更多基本特性.本节将分步进行,目的是演示MVC的运转,因此会跳过对幕后工作原理的一些解释.不用担心--在后面的章节中还会重新深入地讨论这些论题. 2.4.1 设置场景 设想一个朋友要主办一个"新年除夕晚会",需要创建一个Web网站,以便让被邀请人进行RSVP(电子回复).这个网站需要以下四个关键特性: 一个显示此晚会信息的主页: 一个可以用来进行R

Go语言实现的简单网络端口扫描方法_Golang

本文实例讲述了Go语言实现的简单网络端口扫描方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: package main import (  "net"  "fmt"  "os"  "runtime"  "time"  "strconv" ) func loop(startport, endport int, inport chan int) {   for i :=