一、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、全局变量:

以下是所有全局变量的定义:

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

2、StartScan 线程:

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

01.DWORD WINAPI StartScan(LPVOID lpParam)
02.{  
03.tag_PORTS* pScanParam = (tag_PORTS*)lpParam;
04. 
05.DWORD dwThreadId;
06.unsigned short i;
07. 
08.if (pScanParam->bSepecifiedPort)
09.{
10.for(i=0; i<=pScanParam->nCount; i++)
11.{
12.if (g_bTerminate)  
13.{
14.break;  //用户已发出结束扫描命令
15.}
16.while(g_nThreadCount >= g_nMaxThread)
17.{
18.Sleep(10);
19.}          
20. 
21.if (CreateThread(NULL,
22.0,
23.DoScanPort,
24.(LPVOID)new short(pScanParam->nArrOfPorts[i]),
25.0,
26.&dwThreadId) != NULL)
27.{
28.g_nThreadCount ++;
29.}
30.}  
31.}
32.else
33.{      
34.for(i=pScanParam->iStartPort; i<=pScanParam->iEndPort; i++)
35.{
36.if (g_bTerminate)  
37.{
38.break;  //用户已发出结束扫描命令
39.}
40.while(g_nThreadCount >= g_nMaxThread)
41.{
42.Sleep(10);
43.}  
44. 
45.if (CreateThread(NULL, 0, DoScanPort, (LPVOID)new short(i), 0, &dwThreadId) != NULL)
46.{
47.g_nThreadCount ++;
48.}
49.}
50.}
51. 
52.//等待各端口扫描线程结束
53.while (g_nThreadCount > 0)
54.{
55.Sleep(50);
56.}
57.::SendMessage(g_hWnd, SCAN_THREAD, STARTSCAN_COMPLETE, 0);
58.delete pScanParam;
59.return ERROR_SUCCESS;
60.}

3、DoScanPort 线程:

这个线程负责具体扫描指定的端口,并将结果SendMessage给主对话框。下面是其代码:

01.DWORD WINAPI DoScanPort(LPVOID lpParam)
02.{
03.DWORD dwRet;
04.short nPort = *(short*) lpParam;
05.delete lpParam;
06. 
07.SOCKET sock = socket(AF_INET, SOCK_STREAM, 0);
08.if(sock == INVALID_SOCKET)
09.{
10.AfxMessageBox("创建套接字失败!");
11.dwRet = ERROR_CREATE_SOCKET;
12.}
13.else
14.{      
15.unsigned long flag = 1;    
16.if ((ioctlsocket(sock, FIONBIO, &flag) != 0))
17.{
18.AfxMessageBox("未能改为非阻塞模式!");
19.dwRet = ERROR_MODIFY_FIONBIO;
20.}
21.else
22.{
23.sockaddr_in severAddr;
24.severAddr.sin_family = AF_INET;
25.severAddr.sin_port = htons(nPort);     
26.severAddr.sin_addr.S_un.S_addr = g_ulAddr;
27.connect(sock, (sockaddr*)&severAddr, sizeof(severAddr));
28. 
29.struct fd_set mask;        
30.FD_ZERO(&mask);
31.FD_SET(sock, &mask);
32. 
33.struct timeval timeout;
34.timeout.tv_sec = g_dwTimeOut / 1000;
35.timeout.tv_usec = g_dwTimeOut % 1000;
36. 
37.switch(select(0, NULL, &mask, NULL, &timeout))
38.{
39.case -1:
40.dwRet = ERROR_SELECT;
41.break;
42. 
43.case 0:
44.dwRet = ERROR_SELECT_TIMEOUT;
45.break;
46. 
47.default:       
48.dwRet = ERROR_SUCCESS;
49.};
50.}      
51.closesocket(sock);
52.}
53.g_nThreadCount --;
54.if (dwRet == ERROR_SUCCESS)
55.{
56.::SendMessage(g_hWnd, SCAN_THREAD, DOSCAN_FIND_PORT, nPort);
57.}
58.else
59.{
60.::SendMessage(g_hWnd, SCAN_THREAD, DOSCAN_END_PORT, nPort);
61.}
62.return dwRet;
63.}

三、运行结果

本程序在VC6+WinXp下编写调试运行正确,在Win98下运行正确。

在我的计算机扫描本机1-5000号端口,超时设置1000ms,200个最大线程数,约需要45秒。当超时设置再短一些时速度可达每秒150个端口的速度。

四、结束语

事实上,速度要想再提高,可能需要其它方法了。如果线程数开得过多,则由于线程的调度开销过大,速度反而会降低。如果超时设置过短,可能引起扫描的结果不正确(这须视网络情况决定),并且由于是多线程,超时等待的时间也可能小于因线程调度而等待的时间,则也不能提高速度。

另外我还发现了一个问题,就是扫描本机时,如果以IP地址127.0.0.1时,则139#端口没有开放;如果设置为本机的实际IP时则139#端口是开放的,这不知是何原因,还望高手指点。

本程序还有一个需要改进的地方,就是不象大多数端口扫描器可扫描指定的IP段,而只设计成扫描指定的某一台主机。

 

一、TCP扫描技术的更多相关文章

  1. 单片机联网需求攀升 WIZnet全硬件TCP/IP技术崛起

    --新华龙电子为韩国WIZnet公司网络芯片授权代理商,具有20多年的专业团队IC应用开发实力-- 如今不管是在企业还是小区.街道,甚至是居民室内,以太网接口无处不在.有鉴于此,电子设备必将向更加智能 ...

  2. iOS-条形码扫描技术SDK:ZBar(转)

    ios条形码扫描技术 iOS 应用里实现条形码扫描功能,有个免费开源的 SDK:ZBar(http://zbar.sourceforge.net/iphone/sdkdoc/install.html) ...

  3. 浅谈TCP扫描与SYN扫描与FIN扫描

    下面就这三种方法来小小的探讨一下,不对的地方还请多多指教! 1:TCP扫描 相对来说是速度比较慢的一种,为什么会慢呢?因为这种方法在扫描的时候会从本地主机的一个端口向目标主机的一个端口发出一个连接请求 ...

  4. Linux系统扫描技术及安全防范

    1.概述 一.主机扫描 二.路由扫描 三.批量服务扫描 四.linux防范恶意扫描安全策略 一个典型的网络安全事件 ·案例:通过网络扫描方式获取某运营商核心设备管理权限 step01:通过tracer ...

  5. 小白日记10:kali渗透测试之端口扫描-UDP、TCP、僵尸扫描、隐蔽扫描

    端口扫描 二三四层发现的目的只是为了准确发现所有活着主机IP,确定攻击面,端口扫描即发现攻击点,发现开放端口.端口对应网络服务及应用端程序,服务端程序的漏洞通过端口攻入.[所有的扫描结果,都不要完全相 ...

  6. 2018-2019-2 网络对抗技术 20165237 Exp6 信息搜集与漏洞扫描

    2018-2019-2 网络对抗技术 20165237 Exp6 信息搜集与漏洞扫描 实验目标 1 各种搜索技巧的应用: 2 DNS IP注册信息的查询: 3 基本的扫描技术: 主机发现.端口扫描.O ...

  7. 2018-2019-2 20165221 【网络对抗技术】-- Exp6 信息搜集与漏洞扫描

    2018-2019-2 20165221 [网络对抗技术]-- Exp6 信息搜集与漏洞扫描 目录 1. 实践目标 2. 实践内容 3. 各种搜索技巧的应用 a. 搜索网址的目录结构 b.使用IP路由 ...

  8. 2018-2019-2 网络对抗技术 20165328 Exp6 信息收集与漏洞扫描

    目录 实验要求 基础问题回答: 实验过程: 各种搜索技巧的应用及DNS IP注册信息的查询 基本扫描技术 漏洞扫描--使用OpenVAS 实验感想 实验要求 (1)各种搜索技巧的应用 (2)DNS I ...

  9. 2018-2019-2 网络对抗技术 20165323 Exp6 信息搜集与漏洞扫描

    一.实验内容 二.实验步骤 1.各种搜索技巧的应用 2.DNS IP注册信息的查询 3.基本的扫描技术 主机发现 端口扫描 OS及服务版本探测 具体服务的查点 4.漏洞扫描 三.实验中遇到的问题 四. ...

随机推荐

  1. 【洛谷p1507】NASA的食物计划

    (一次a……) NASA的食物计划[传送门] 好的上算法标签: 嗯这是个二维背包 (万年不变分隔线) 二维的题就是在一维基础上增加了一个条件,这个背包不仅含有质量还有体积.所以我们增加一层循环.核心算 ...

  2. 【洛谷p2142】高精度减法

    高精度减法第一遍没有过 高精度减法[传送门] 洛谷算法标签: 总之技术都在高精上了吧. 附代码: #include<iostream> #include<cstdio> #in ...

  3. pycharm配置appium 提示unsrsloved reference

    1.如:进入C:\Users\Administrator\PycharmProjects\project\venv 输入:在cmd 下进入 venv  输入   Scripts\activate 回车 ...

  4. php网站多语言

    1.获取语言的函数: $lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 4); //只取前4位,这样只判断最优先的语言.如果取前5位,可能出现en ...

  5. MongoDB 教程(五):连接、新建数据库、删除数据库

    连接 启动 MongoDB 服务 只需要在 MongoDB 安装目录的 bin 目录下执行 mongodb 即可. 执行启动操作后,mongodb 在输出一些必要信息后不会输出任何信息,之后就等待连接 ...

  6. C# 3.0 / C# 3.5 隐式(推断)类型 var

    概述 你可能对隐式类型(或隐式推断类型)这个名称比较陌生,但是 var 这个关键字应该很熟悉. 在 C# 中使用 var 声明一个对象时编译器会自动根据赋值语句推断这个局部变量的类型. 赋值以后,这个 ...

  7. CNN autoencoder 先降维再使用kmeans进行图像聚类 是不是也可以降维以后进行iforest处理?

    import keras from keras.datasets import mnist from keras.models import Sequential from keras.layers ...

  8. spring boot cloud

    eclipse spring boot 项目创建 https://www.cnblogs.com/shuaihan/p/8027082.html https://www.cnblogs.com/LUA ...

  9. SpringBoot的日志

    1.日志框架小张:开发一个大型系统:1.System.out.pringtln("");将关键数据打印在控制台:去掉?写在一个文件?2.框架来记录系统的一些运行信息:日志:zhan ...

  10. Oracle的创建表和创建约束的Sql语句

    Oracle的创建表和创建约束的Sql语法 1.创建表的语句 ---1.创建模拟的数据表 --- --1.1.创建学生表Student create table Student( StuId NUMB ...