端口

时间:2024.5.19

端口

1. 端口状态分为listening ,time_wait ,netstat/a ,estabelished ,close_wait这五种。

2.如何查看:在命令提示符中输入:netstat –an(注意netstat和-之间有一个空格)即可看到各个端口的状态信息。)

3.端口状态的详细介绍

①listening : ftp服务启动后首先处于侦听(listening)状态,是服务器监听客户端用的,相当于“地址”,是服务器和客户端之间的纽带。(注意:只有TCP端口才可以这样,如果是UDP的话,那么肯定是木马。)

②time_wait 我方主动调用close()断开连接,收到对方的确认后状态变为time_wait.TCP 规定time_wait状态会一直持续2MSL(即两倍的分段最大生存期),以此来确保旧的链接状态不会对新的连接状态产生影响。处于time_wait状态的连接占用的资源不会被内核释放,所以作为服务器,在可能的情况下,尽量不要主动断开连接,以减少time_wait状态造成的资源浪费。

③ netstat/a :显示的所有端口都是开启的.

④ estabelished : 正在连接状态,资源共享 (如果135或者3389端口这样的话,注意杀毒)。 ⑤close_wait : 对方主动关闭连接或者网络异常导致连接中断,这时我方的状态会变成CLOSE_WAIT 此时我方要调用close()来使得连接正确关闭。表示有过连接,但是现在已经结束。

4.在连接撤销过程中,有如下过程:

1.HOST1上的应用程序关闭己方的连接导致TCP发送一个FIN消息给HOST2。

2.HOST2发送一个确认消息给HOST1,并且HOST2把FIN作为EOF递交给HOST2上的应用程序。

3.一段时间过后,HOST2上的应用程序关闭它那边的连接,引发一个FIN消息给HOST1。

4.HOST1给HOST2发送一个确认消息,然后HOST2关闭连接并释放资源,然而,HOST1却没有关闭连接,而是进入了TIME_WAIT状态,并为两个最大段生存时间(2MSL)保留在

此状态.

5.为什么需要TIME_WAIT?

1.因为在第四步的时候,HOST1发送的ACK可能丢失并导致HOST2重新发送FIN消息,TIME_WAIT维护连接状态.

如果执行主动关闭的一方HOST1 不进入到TIME_WAIT状态就关闭连接那会发生什么呢?当重传的FIN消息到达时,因为TCP已经不再有连接的信息了,所以就用RST(重新启动)消息应答,导致HOST2进入错误的状态而不是有序终止状态,如果发送最后ACK消息的一方处于TIME_WAIT状态并仍然记录着连接的信息,它就可以正确的响应对等方HOST2的FIN消息了.

2.TIME_WAIT为连接中”离群的段”提供从网络中消失的时间.

考虑一下,如果延迟或者重传段在连接关闭后到达时会发生什么呢?通常情况下,因为TCP仅仅丢弃该数据并响应RST消息,所以这不会造成任何问题。当RST消息到达发出延时段的主机时,因为该主机也没有记录连接的任何信息,所以它也丢弃该段。然而,如果两个相同主机之间又建立了一个具有相同端口号的新连接,那么离群的段就可能被看成是新连接的,如果离群的段中数据的任何序列号恰恰在新连接的当前接收窗口中,数据就会被重新接收,其结果就是破坏新连接。

6.预防措施

第一关闭没有使用过的敏感端口,第二检查各端口,有端口扫描的症状时,立即屏蔽该端口,这就需要使用防火墙。

7.防火墙的工作原理

首先检查每个到达你的电脑的数据包,在这个包被你机上运行的任何软件看到之前,防火墙有完全的否决权,可以禁止你的电脑接收Internet上的任何东西。当第一个请求建立连接的包被你的电脑回应后,一个“TCP/IP端口”被打开;端口扫描时,对方计算机不断和本地计算机建立连接,并逐渐打开各个服务所对应的“TCP/IP端口”及闲置端口,防火墙经过自带的拦截规则判断,就能够知道对方是否正进行端口扫描,并拦截掉对方发送过来的所有扫描需要的数据包。

8.常用端口的作用

端口号的范围是从1~65535。总共分为两大类:

(1)服务器端使用的端口号

其中1~1024是被RFC 3232规定好了的,被称作“熟知端口号”(Well Known Ports)或系统端口号;

数值为1024~49151的叫做登记端口号。这类端口号是为没有熟知端口号的应用程序试用的。

一些常见的端口号及其用途如下:

TCP 21端口:FTP 文件传输服务

TCP 23端口:TELNET 终端仿真服务

TCP 25端口:SMTP 简单邮件传输服务

UDP 53端口:DNS 域名解析服务

TCP 80端口:HTTP 超文本传输服务

TCP 110端口:POP3 “邮局协议版本3”使用的端口

TCP 443端口:HTTPS 加密的超文本传输服务

TCP 1521端口:Oracle数据库服务

TCP 1863端口:MSN Messenger的文件传输功能所使用的端口

TCP 3389端口:Microsoft RDP 微软远程桌面使用的端口

TCP 5631端口:Symantec pcAnywhere 远程控制数据传输时使用的端口

UDP 5632端口:Symantec pcAnywhere 主控端扫描被控端时使用的端口

TCP 5000端口:MS SQL Server使用的端口

UDP 8000端口:腾讯QQ

(2)客户端使用的端口号

数值为49152~65535.这类端口号仅在客户进程运行时才动态选择,又叫短暂端口号。当客户端与服务器使用这类端口号通信结束后,其端口号就不复存在,可以供其他客户进程以后使用。


第二篇:简单的端口扫描器实现


安 阳 师 范 学 院

安阳师范学院本科学生毕业论文

简单的端口扫描器实现

作 者 李港

系(院) 人文管理学院 专 业 计算机科学与技术 年 级 2013 级专升本 学 号 134xxxxxxxx 指导教师 宋老师 论文成绩 日 期 2015 年5月

安 阳 师 范 学 院

诚信承诺书

郑重承诺:所呈交的论文是作者个人在导师指导下进行的研究工作及取得的研究成果。除了文中特别加以标注和致谢的地方外,论文中不包含其他人已经发表或撰写的研究成果,也不包含为获得安阳师范学院或其他教育机构的学位或证书所使用过的材料。与作者一同工作的同志对本研究所做的任何贡献均已在论文中作了明确的说明并表示了谢意。

作者签名: 日期: 导师签名: 日期: 院长签名: 日期:

论文使用授权说明

本人完全了解安阳师范学院有关保留、使用学位论文的规定,即:学校有权保留送交论文的复印件,允许论文被查阅和借阅;学校可以公布论文的全部或部分内容,可以采用影印、缩印或其他复制手段保存论文。保密论文在解密后遵守此规定。 作者签名: 导师签名: 日期:

安 阳 师 范 学 院

目 录

1 引言 ...................................................................... 2

2 端口扫描概述 .............................................................. 2

3 端口扫描相关知识 .......................................................... 2

3.1 端口的基本概念 ...................................................... 2

3.2 常见端口介绍 ........................................................ 3

3.3 端口扫描器功能简介 .................................................. 3

3.4 常用端口扫描技术 .................................................... 3

3.4.1 TCP connect()扫描 ............................................. 3

3.4.2 TCP SYN扫描 ................................................... 4

3.4.3 TCP FIN 扫描 ................................................... 4

3.4.4 IP段扫描 ...................................................... 4

3.4.5 TCP反向 ident扫描 ............................................. 4

3.4.6 FTP 返回攻击 ................................................... 4

4 实验流程和运行流程 ........................................................ 4

4.1 实现流程 ............................................................ 4

4.2 程序中主要的函数 .................................................... 7

4.3 主流程图 ............................................................ 8

5 总结 ..................................................................... 10

5.1 提出问题 ........................................................... 10

5.2 解决问题 ........................................................... 10

5.3 心得体会 ........................................................... 10

6 致谢 ..................................................................... 11

参考文献 ................................................................... 11

第1页

安 阳 师 范 学 院

简单的端口扫描器实现

李 涛

(安阳师范学院 人文管理学院,河南 安阳 455002)

摘 要:本设计通过端口扫描器的研究来提高对计算机安全的认识。利用TCPconnect扫描原理,扫描主机通过TCP/IP协议的三次握手与目标主机的指定端口建立一次完整的连接,如果目标主机该端口有回复,则说明该端口开放。利用多线程技术实现了对一目标IP进行设定数目的端口扫描,计算机端口扫描技术就是这种主动防御策略实现的重要技术手段。该端口扫描器采用c++语言开发,在VC6.0编译环境下通过测试。

关键词:端口扫描器 ;IP段扫描;信息安全

1 引言

扫描器是网络信息收集的一种方法之一,从功能上可化分为漏洞扫描器和端口扫描器。理解客户机-服务器与端口扫描之间的工作原理,完成对目标主机端口扫描功能的实现,即发现目标主机开启的端口信息。可见,端口与进程是一一对应的,如果某个进程正在等待连接,称之为该进程正在监听,那么就会出现与它相对应的端口。由此可见,通过扫描端口,便可以判断出目标计算机有哪些通信进程正在等待连接。

2 端口扫描概述

对于毕业设计建设,首先应考虑选择一个实验平台,考虑到windows操作系统在pc机上的垄断地位,再加上microsoft提供的办公软件、数据软件的通用性,使得现有的信息系统大都建立在windows操作系统基础上,而且,现有的信息安全攻击操作系统或漏洞威胁,大多数是针对windows操作系统[1],因此,我们选择windows系统作为实现平台。本毕业论文的目标是设计并实现一个简单的端口扫描器,它通过与目标主机TCP/IP端口建立连接并请求某些服务,记录目标主机的应答,分析目标主机相关信息,从而发现目标主机某些内在的安全弱点。扫描器通常分两类:漏洞扫描器和端口扫描器。端口扫描器用来扫描目标机开放的服务端口以及端口相关信息[2],漏洞扫描器检查目标中可能包含的大量已知的漏洞,如果发现潜在的漏洞可能性,就报告给扫描者。

网络漏洞端口扫描器对目标系统进行检测时,首先探测目标系统的存活主机,对存活主机进行端口扫描,确定系统开放的端口,然后扫描器对开放的端口进行网络服务类型的识别,确定其提供的网络服务。漏洞扫描器根据目标系统的操作系统平台和提供的网络服务,调用漏洞资料库中已知的各种漏洞进行逐一检测,通过对探测响应数据包的分析判断是否存在漏洞。在分析总结目前现有的扫描软件,掌握扫描器的原理基础上,首先设计、实现一种端口扫描程序,存储扫描结果。

3 端口扫描相关知识

3.1 端口的基本概念

我们这里所说的端口,不是计算机硬件的i/o端口,而是软件形式上的概念。服务器可以向外提供多种服务,比如,一台服务器可以同时是web服务器,也可以是ftp服务器,同时,它也可以是邮件服务器。为什么一台服务器可以同时提供那么多的服务呢?其中一

第2页

安 阳 师 范 学 院

个很主要的方面,就是各种服务采用不同的端口分别提供不同的服务。 根据提供服务类型的不同,端口分为两种,一种是tcp端口,一种是udp端口。计算机之间相互通信的时候,分为两种方式:一种是发送信息以后,可以确认信息是否到达,也就是有应答的方式,这种方式大多采用tcp协议;一种是发送以后就不管了,不去确认信息是否到达,这种方式大多采用udp协议。对应这两种协议服务提供的端口,也就分为tcp端口和udp端口。那么,如果攻击者使用软件扫描目标计算机,得到目标计算机打开的端口,也就了解了目标计算机提供了那些服务。

计算机信息网络的发展加速了信息化时代的进程,但是随着社会网络化程度的增加,对计算机网络的依赖也越来越大,网络安全问题也日益明显[3],端口扫描技术是发现安全问题的重要手段之一。一个端口就是一个潜在的通信通道,也就是一个入侵通道。网络安全从其本质来讲就是网络上信息安全[4],它涉及的领域相当广泛,这是因为目前的公用通信网络中存在着各式各样的安全漏洞和威胁。对目标计算机进行端口扫描,能得到许多有用的信息。扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法,可以搜集到很多关于目标主机的各种有用的信息,从而发现目标机的某些内在的弱点。

3.2 常见端口介绍

端口是一个16 bit的地址,用端口号进行标识不同作用的端口。端口一般分为两类。 熟知端口号:范围从0到1023,这些端口号一般固定分配给一些服务。比如21端口分配给FTP服务,25端口分配给SMTP服务,就是所说的邮件服务。80端口分配给HTTP服务,135端口分配给RPC服务等等。动态端口号:动态端口的范围从1024到65535,这些端口号一般不固定分配给某个服务,也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。比如8080端口就是分配给第一个向系统发出申请的程序。在关闭程序进程后,就会释放所占用的端口号。

3.3 端口扫描器功能简介

端口分为源端口和目的端口,源端口是本机打开的,目的端口是在和本机通信的另一台计算机的端口。端口是由计算机的通信协议TCP/IP协议定义的。其中规定,用IP地址和端口作为套接字,它代表TCP连接的一个连接端,一般称为Socket。具体来说,就是用IP端口来定位一台主机中的进程。可以做这样的比喻,端口相当于两台计算机进程间的大门,可以随便定义,其目的只是为了让两台计算机能够找到对方的进程。计算机就像一座大楼,这个大楼有好多入口(端口),进到不同的入口中就可以找到不同的公司(进程)。如果要和远程主机A的程序通信,那么只要把数据发向A端口就可以实现通信了。可见,端口与进程是一一对应的,如果某个进程正在等待连接,称之为该进程正在监听,那么就会出现与它相对应的端口。由此可见,通过扫描端口,便可以判断出目标计算机有哪些通信进程正在等待连接。服务器上所开放的端口就是潜在的通信通道,也就是一个入侵通道。对目

[5]标计算机进行端口扫描,能得到许多有用的信息,进行端口扫描的方法很多,可以是手

工进行扫描、也可以用端口扫描软件进行。

扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法可以搜集到很多关于目标主机的各种有用的信息,例如远程系统是否支持匿名登陆、是否存在可写的FTP目录、是否开放TELNET服务和HTTPD服务等。

3.4 常用端口扫描技术

3.4.1 TCP connect()扫描

这是最基本的TCP扫描,操作系统提供的connect()系统调用可以用来与每一个感兴趣的目标计算机的端口进行连接。如果端口处于侦听状态,那么connect()就能成功。否则,

第3页

安 阳 师 范 学 院

这个端口是不能用的,即没有提供服务。这个技术的一个最大的优点是,你不需要任何权限。优点:稳定可靠,不需要特殊的权限。系统中的任何用户都有权利使用这个调用。另一个好处就是速度快。如果对每个目标端口以线性的方式,使用单独的connects调用,那么将花费相当长的时间,你可以通过同时打开多个套接字,从而加速扫描。缺点是扫描方式不隐蔽。

3.4.2 TCP SYN扫描

TCP SYN 扫描是使用最为广泛的扫描方式,其原理就是向待扫描端口发送SYN 数据包,如果能够收到SYN+ACK 数据包,则代表此端口开放,如收到RST数据包,则证明此端口关闭,如未收到任何数据包,且确定该主机存在,则证明该端口被防火墙等安全设备过滤。由于SYN扫描并不会完成TCP连接的三次握手过程,所以SYN 扫描又叫做半开放扫描。SYN 扫描的最大优点就是速度,在Internet上,如果不存在防火墙,SYN扫描每秒钟可以扫描数千个端口,但是SYN 扫描由于其扫描行为较为明显,容易被入侵检测系统发现,也容易被防火墙屏蔽,且构造原始数据包需要较高系统权限。

3.4.3 TCP FIN 扫描

有的时候有可能SYN扫描都不够秘密。一些防火墙和包过滤器会对一些指定的端口进行监视,有的程序能检测到这些扫描。如果目标主机该端口是“关”状态,则返回一个TCP RST数据包;否则不回复。根据这一原理可以判断对方端口是处于“开”还是“关”状态。相反,FIN数据包可能会没有任何麻烦的通过。这种扫描方法的思想是关闭的端口会用适当的RST来回复FIN数据包。另一方面,打开的端口会忽略对FIN数据包的回复。FIN 扫描具有较好的隐蔽性,不会留下日志,但是其应用具有很大局限性:由于不同系统实现网络协议栈的细节不同,FIN 扫描只能扫描Linux/UNIX 系统,如果是Windows 系统,无论端口开放与否都会直接返回RST 数据包,无法对端口状态进行判断。

3.4.4 IP段扫描

这种扫描方式并不是新技术,它并不是直接发送TCP探测数据包,而是将数据包分成两个较小的IP段。这样就将一个TCP头分成好几个数据包,从而过滤器就很难探测到。但必须小心:一些程序在处理这些小数据包时会有些麻烦。

3.4.5 TCP反向 ident扫描

ident 协议允许(rfc1413)看到通过TCP连接的任何进程的拥有者的用户名,即使这个连接不是由这个进程开始的,该服务就会读取指定TCP连接的查询数据,将拥有指定TCP连接的用户信息反馈给对方,。例如扫描者可以连接到http端口,然后用identd来发现服务器是否正在以root权限运行。这种方法只能在和目标端口建立了一个完整的TCP连接后才能看到。

3.4.6 FTP 返回攻击

FTP协议的一个有趣的特点是它支持代理(proxy)FTP连接,即入侵者可以从自己的计算机self.com和目标主机target.com 的FTP server-PI(协议解释器)连接,建立一个控制通信连接。然后请求这个server-PI激活一个有效的server-DTP(数据传输进程)来给Internet上任何地方发送文件。对于一个User-DTP,尽管RFC明确地定义请求一个服务器发送文件到另一个服务器是可以的,但是现在这个方法并不是非常有效。这种方法的优点很明显,它不容易被追踪,并可能穿过防火墙。这个协议的缺点是“能用来发送不能跟踪的邮件和新闻,给许多服务器造成打击,用尽磁盘,企图越过防火墙”。 4 实验流程和运行流程

4.1 实现流程

(1)对源代码仔细检查,看是否出现异常,确保程序可以正常运行。

第4页

安 阳 师 范 学 院

图 1 源程序编译页面

(2)输入想要扫描的网段,然后将输入的网段转化为可排序的ip数组。 //功能: 输入一个IP段,输出该IP段内的端口开放情况信息

int ScanIp(const string &start_Ip, const string &endIp, multimap<unsigned long, string> &ouputMap)

{

//分解IP段内的IP到全局数组中去

GetIpToScan(start_Ip,endIp,g_vec_IpToScan);

int scanNum = g_vec_IpToScan.size();

//线程总数

g_runThreadNum = scanNum;

第5页

简单的端口扫描器实现

安 阳 师 范 学 院

cout<<endl;

cout<<endl;

cout<<"********************************************************************************";

cout << " 共有 " << scanNum <<" 个IP要扫描 " << endl;

//对每个IP开一个线程

for (int i = 0; i < scanNum; ++i)

{

CreateThread(NULL,0,ThreadFunc,&g_vec_IpToScan[i],0,NULL);

//要是不间隔时间的话,同时创建socket会出现10093错误

Sleep(50);

}

return 0;

}

(3)建立多个线程,每个线程扫描一个ip。每个线程内先建立数据流套接字,然后绑定ip端口进行扫描。将扫描端口保存到g_map_ScanResult。

//保存IP扫描的结果

multimap<unsigned long, string> g_map_ScanResult;

//线程函数,扫描每一个IP

DWORD WINAPI ThreadFunc(LPVOID th_para)

{

//获取需要扫描的IP

//char *pStrIp = (char*)th_para;

unsigned long ulScanIp = *(unsigned long*)th_para;

int index = 0; //端口索引

SOCKET link_sock; //SOCKET

FD_SET set_flag; //SOCKET描述

short select_ret; //select异步返回值

short port; //正在扫描的端口

while (index < PORTSNUM)

{

port = g_portsTOscan[index];//创建数据流套接字

link_sock = socket(AF_INET, SOCK_STREAM, 0);

if (link_sock == INVALID_SOCKET)

//cout << "创建link_sock socket失败:错误号为:

" << GetLastError() << endl;

WaitForSingleObject(g_ThreadNumMutex,INFINITE);

g_runThreadNum--;

ReleaseMutex(g_ThreadNumMutex);

//cout << "***还有_"<< g_runThreadNum

<< "_个扫描线程进行中**"<< endl;

return -1;

}

第6页

安 阳 师 范 学 院

(4)清理结束后进程,输出结果。

void CleanProc()//清理

{

////////////////线程都执行完后清理socket相关信息//////

while (1)

{

WaitForSingleObject(g_ThreadNumMutex,INFINITE);

if (g_runThreadNum == 0)

{

break;

}

ReleaseMutex(g_ThreadNumMutex);

Sleep(100);

}

//清理socket相关信息

WSACleanup();

}

//输出扫描结果

int OutPutScanInfo()

{

cout <<" 扫描到 " << g_map_ScanResult.size() << " 条记录 " << endl;

multimap<unsigned long, string>::iterator iter = g_map_ScanResult.begin(); ofstream out("out.txt");

cout <<" 显示总 " << g_map_ScanResult.size() << " 条记录: " << endl;

cout<<endl;

for (; iter!=g_map_ScanResult.end(); ++iter)

{

out << iter->second << endl;

cout << iter->second << endl;

}

4.2 程序中主要的函数

int main(); 主函数

InitProc(); 初始化

UserInput(); 输入

ScanIp(g_startIp,g_endIp,g_map_ScanResult); 开始扫描

CleanProc(); 清理结束后进程

OutPutScanInfo(); 输出结果

DWORD WINAPI ThreadFunc(LPVOID th_para); 扫描线程每一个ip

unsigned long InvertIp(unsigned long srcIp);

将ip化为长整型

int GetIpToScan(const string &StartIp, const string &EndIp, vector<unsigned long> &vec_ip) ;将所有ip排序放在一个数组内

第7页

安 阳 师 范 学 院

4.3 主流程图

简单的端口扫描器实现

图 2 函数主流程图

4.4 结果

简单的端口扫描器实现

图 3 开始界面

说明:可扫描的IP段为192.168.1.1-192.168.1.254。

简单的端口扫描器实现

第8页

安 阳 师 范 学 院

图 4 扫描界面

说明:本程序需要在联网的情况下才能完全找到开放的端口。

简单的端口扫描器实现

图 5 结果界面

4.5 扫描结果说明

80端口说明:80端口是为HTTP(HyperText Transport Protocol)即超文本传输协议

第9页

简单的端口扫描器实现

安 阳 师 范 学 院

开放的,此为上网冲浪使用次数最多的协议,主要用于WWW(World Wide Web)即万维网传输信息的协议。可以通过HTTP地址(即常说的“网址”)加“:80”来访问网站,因为浏览网页服务默认的端口号都是80,因此只需输入网址即可,不用输入“:80”了。有些木马程序可以利用80端口来攻击计算机的,例如Executor、RingZero等。

135端口说明:135端口主要用于使用RPC(Remote Procedure Call,远程过程调用)协议并提供DCOM(分布式组件对象模型)服务,通过RPC可以保证在一台计算机上运行的程序可以顺利地执行远程计算机上的代码;使用DCOM可以通过网络直接进行通信,能够跨过包括HTTP协议在内的多种网络传输。冲击波病毒就是利用RPC漏洞来攻击计算机的。RPC本身在处理通过TCP/IP的消息交换部分有一个漏洞,该漏洞是由于错误地处理格式不正确的消息造成的。该漏洞会影响到RPC与DCOM之间的一个接口,该接口侦听的端口就是135。

139端口说明:通过139端口入侵是网络攻击中常见的一种攻击手段,一般情况下139端口开启是由于NetBIOS网络协议的使用。NetBIOS即网络基本输入输出系统,系统可以利用WINS服务、广播及Lmhost文件等多种模式将NetBIOS名解析为相应IP地址,从而实现与对方计算机进行共享资源的连接。

445端口说明:445端口是一个毁誉参半的端口,有了它我们可以在局域网中轻松访问各种共享文件夹或共享打印机,但也正是因为有了它,黑客们才有了可乘之机,他们能通过该端口偷偷共享你的硬盘,甚至会在悄无声息中将你的硬盘格式化掉!我们所能做的就是想办法不让黑客有机可乘,封堵住445端口漏洞。

3306端口说明:MySQL的默认端口。这个是数据库端口,进去后,可以查看数据库中的数据。

5 总结

5.1 提出问题

(1)确定选题后,综合考虑选择哪种技术去实现端口扫描,写出原因。

(2)面对大量端口需要扫描,怎么样做到既保持程序效率又保持程序的稳定性。

(3)在程序设计完成后,怎样经过调试确定最大连接线程数。

5.2 解决问题

首先综合考虑各种技术及背景,发现用connect()函数去连接这个方法更加可靠且易于实现和调试,在出现问题后可相对容易的对其解决。而且在本学期学过网络安全tcp/ip的课程,对connect()函数的连接过程有些许掌握,更有利于软件的开发。在面对几千甚至上万个端口需要扫描时,需要考虑到并发处理端口,我们想到了多线程,在对其多线程设计中,要注意控制线程的数量,如果线程数量过多,会造成程序的崩溃,若太少,则程序运行太慢。所以用多线程并发技术并加以最大线程数量来控制。

程序在运行中,与程序性能有关的首先是本机硬件条件和对方应答所需时间,不同端口号处理响应请求时间也不一样而且跟网络环境也有一定关系。一般来说,机器处理器速度越快,则处理每个端口的速度越快。所以程序应该在实际运行中,通过不断修改最大线程数并运行来找到一个合适的最大线程数量,可以将范围从1000设置到10000,再到60000,不断进行调试达到最佳。

5.3 心得体会

本设计经过一学期的努力,基本满足了一个端口扫描程序的基本要求。完成后的程序实现了ip端口扫描功能,能对单个ip扫描或多个ip。系统设计期间,学习到很多课堂上没有的知识,还积累了很多实践经验,增强了动手能力和解决实际问题的能力。通过这次的课程设计,对网络编程有了更深入的了解,进一步熟悉了TCP和UDP协议的内容,掌握

第10页

安 阳 师 范 学 院 了ip扫描端口的基本原理。对编程思想有了进一步的体会,养成了一些良好的编程习惯。系统虽然完成,但还有很多不足之处,希望自己能不断学习和实践,争取以后做得更好。 通过这次端口扫描器的实验深化了信息对抗,信息安全的意识。对于网络扫描器有了整体上的认识。了解了socket函数的基本用法和端口扫描的基本原理,更加熟练掌握了c++语言。在这次设计中在处理线程上遇到了很大麻烦,不过通过上网查找和书本,基本解决,还有就是刚开始在socket的运用上很是不懂,经过上网查找也顺利解决。总之这次设计,不仅是对以前只是的巩固,也学习到了许多新知识。

6.致谢

从接受课题到现在完成毕业设计论文,衷心地感谢我的指导老师宋俊昌老师,本系统是在宋老师的悉心指导和耐心教导下完成的,他给予了我很大的帮助,在系统的设计开发过程中向我提供了相关的参考书籍与网站设计资料。在系统设计过程中,我遇到了许多自己靠看书查阅资料解决不了的技术上的问题宋老师都及时地给予指导。同时感谢系计算机教研室的其他老师与工作人员,他们给我提供了良好的学习和研究环境,并为我的论文提出了许多宝贵的参考意见,少走了不少弯路。还感谢我的亲人和朋友,是他们在背后默默的支持我,鼓励我。

本次论文的完成,学校为我们提供了便利的条件和开发环境,而我们的指导老师更是悉心辅导我们。完成毕业设计的过程中我深刻认识到学习是一个很严谨的过程,只有认真钻研,才能得到真知;而马虎大意将会一无所获。在系统开发过程中我还经常和同学们一起研究、探讨问题,我设计的网站中也有很多问题是在和同学的探讨中发现并改正的。在此对给予我帮助的同学同样表示衷心的感谢!

最后,再次向他们表示我最衷心的感谢和最诚挚的敬意,这次课程设计宋老师指导了很多,从算法原理到计算机原理知识都一并拓展,我受益颇多,感谢宋老师在这次课程设计中的指导和栽培,以及同学们的热心帮助,祝老师工作顺利、身体健康。

参考文献

[1] 赵树升,赵韶平.信息安全原理与实践[M].北京:清华大学出版社,2004.

[2] 李雷,端口扫描方法的原理.实现和防御[J].电脑编程技巧和维护,2004,(5):21-25.

[3] 刘文涛,网络安全编程技术与实例[M].北京:机械工业出版社2008.

[4] 邹新国. 计算机信息与网络安全技术[M]. 济南市:黄河出版社, 2008.08.

[5] 肖微,端口扫描技术的原理及原理[J].网络安全技术与应用,2006,(7):32-41.

Realize A Simple Port Scanner

第11页

安 阳 师 范 学 院

Li Tao

(Humanistic Management College of Anyang Normal University, Anyang, Henan 455002)

Abstract: The designed to improve computer security awareness through research port scanner. Use TCP connect scanning principle, designated scan host via TCP / IP protocol handshake with the target host port to establish a full connection, if the target host through the port with reply, it indicates that the port is open. The use of multi-threading technology to achieve a port scan on a target IP for a set number of computer port scanning technology is the active defense of this important technology to policy implementation. The port scanner using c++ language development, in VC6.0 compiler environment through the test.

Keywords: port scanner; IP scanner; information security

附录

#pragma comment(lib,"ws2_32.lib")

#pragma warning (disable:4786)

#include <iostream>

第12页

安 阳 师 范 学 院

#include <strstream>

#include <winsock2.h>

#include <windows.h>

#include <string>

#include <vector>

#include <map>

#include <fstream>

#include <time.h>

//#include "IpScan.h"

using namespace std;

//全局变量:

//待扫描的端口

short g_portsTOscan[]=

{20,21,22,23,25,42,43,47,53,63,67,68,79,80,95,106,107,109,110,113,135,137,138,139,143,

144,161,162,443,445,1024,1080,1433,1434,1755,3306,4000,5010,5190,5631,5632,8000,8080 }; const short PORTSNUM = sizeof(g_portsTOscan) / sizeof(short);//端口个数 //等扫描的IP

vector<unsigned long> g_vec_IpToScan;

string g_startIp;

string g_endIp;

//开启的线程数,目前为1个IP1个线程

long g_runThreadNum;

//socket相关

TIMEVAL g_timeout; //阻塞等待时间

//FD_SET g_mask; //socket模式设置,储存socket信息

const short TIMEOUT = 1; //阻塞等待时间

WSADATA g_wsadata; //socket版本信息

第13页

安 阳 师 范 学 院

//线程中的互斥体

HANDLE g_PortMutex;

HANDLE g_ThreadNumMutex;

HANDLE g_ResultMutex; //输入结果的互斥量

//保存IP扫描的结果

multimap<unsigned long, string> g_map_ScanResult;

//------------------------------------------------------------------------------------------------------------------- //线程函数,扫描每一个IP

DWORD WINAPI ThreadFunc(LPVOID th_para)

{

//获取需要扫描的IP

//char *pStrIp = (char*)th_para;

unsigned long ulScanIp = *(unsigned long*)th_para;

int index = 0; //端口索引

SOCKET link_sock; //SOCKET

FD_SET set_flag; //SOCKET描述

short select_ret; //select异步返回值

short port; //正在扫描的端口

while (index < PORTSNUM)

{

port = g_portsTOscan[index];

//创建数据流套接字

link_sock = socket(AF_INET, SOCK_STREAM, 0);

第14页

安 阳 师 范 学 院

if (link_sock == INVALID_SOCKET)

{

//cout << "创建link_sock socket失败:错误号为: " << GetLastError() << endl; WaitForSingleObject(g_ThreadNumMutex,INFINITE);

g_runThreadNum--;

ReleaseMutex(g_ThreadNumMutex);

//cout << "***还有_"<< g_runThreadNum << "_个扫描线程进行中**"<< endl; return -1;

}

FD_ZERO(&set_flag); //将指定文件描述符清空

FD_SET(link_sock,&set_flag); //用于在文件描述符集合中增加一个新的文件描述符

//设置连接地址

SOCKADDR_IN scan_addr;

scan_addr.sin_family = AF_INET;

scan_addr.sin_addr.s_addr = ulScanIp;

scan_addr.sin_port = htons(port);

unsigned long sock_set = 1;

ioctlsocket(link_sock,FIONBIO,&sock_set); //设置套接字为非阻塞模式,第3个参数非0为非阻塞

connect(link_sock,(struct sockaddr *) &scan_addr, sizeof(scan_addr));//连接指定IP端口

select_ret = select(0,NULL,&set_flag,NULL,&g_timeout);//异步返回值

if (select_ret == 0 || select_ret == -1)

第15页

安 阳 师 范 学 院

{

++index;

continue;

}

else

{

strstream stream_result;

struct in_addr ipaddr;

ipaddr.s_addr = ulScanIp;

char *pStrIp = inet_ntoa(ipaddr);

stream_result << "\t 主机地址为:" << pStrIp << "\t找到开放的端口: " << port <<'\0';

string str_result(stream_result.str());

//将扫描结果储存到输出变量中去

WaitForSingleObject(g_ResultMutex,INFINITE);

g_map_ScanResult.insert(make_pair(ulScanIp,str_result));

ReleaseMutex(g_ResultMutex);

}

++index;

}

//扫描完一个线程

shutdown(link_sock, 0);

closesocket(link_sock);

第16页

安 阳 师 范 学 院

WaitForSingleObject(g_ThreadNumMutex,INFINITE);

g_runThreadNum--;

ReleaseMutex(g_ThreadNumMutex);

//cout << "****还有_"<< g_runThreadNum << "_个扫描线程进行中****"<< endl;

return 0;

}

//---------------------------------------------------------------------------------------------------------- //将IP转化成能直接递增和递减的地址

unsigned long InvertIp(unsigned long srcIp)

{

unsigned char first;

unsigned char second;

unsigned char third;

unsigned char fourth;

first = srcIp & 0x00FF;

second = (srcIp >> 8) & 0x00FF;

third = (srcIp >> 16) & 0x00FF;

fourth = (srcIp >> 24) & 0x00FF;

return (first << 24) | (second << 16) | (third << 8) | fourth;

}

//------------------------------------------------------------------------------------------------ //将IP内的IP转化成一个一个unsigned long 类型存在数组中

int GetIpToScan(const string &StartIp, const string &EndIp, vector<unsigned long> &vec_ip) {

第17页

安 阳 师 范 学 院

//判断输入的IP是否合法

unsigned long ulStartIp = inet_addr(StartIp.c_str()); unsigned long ulEndIp = inet_addr(EndIp.c_str());

if(

INADDR_NONE == ulStartIp

||

INADDR_NONE == ulEndIp

)

{

cout << " 请输入合法的IP" << endl; return -1;

}

//////////////判断查询的是一个IP还是IP段///////////////////////////////////// if (ulStartIp == ulEndIp && ulStartIp !=0) {

vec_ip.push_back(ulStartIp);

return 0;

}

if (ulStartIp == 0 && ulEndIp == 0)

{

return 0;

}

if (ulStartIp == 0)

{

vec_ip.push_back(ulEndIp);

第18页

安 阳 师 范 学 院

return 0;

}

if (ulEndIp == 0)

{

vec_ip.push_back(ulStartIp);

return 0;

}

////////////////////////////////////////////////////////////////////////////

//将IP转换成可以递增比较的类型 ulStartIp = InvertIp(ulStartIp);

ulEndIp = InvertIp(ulEndIp);

//指定前后顺序,ulEndIp较大

unsigned long max_ip;

if (ulStartIp > ulEndIp)

{

max_ip = ulStartIp;

ulStartIp = ulEndIp;

ulEndIp = max_ip;

}

int ipnums = ulEndIp - ulStartIp;

for(int i = 0;i <= ipnums;++i)

{

//将每个IP的unsigned long型存到数组中供扫描

第19页

安 阳 师 范 学 院

vec_ip.push_back(InvertIp(ulStartIp++));

}

return 0;

}

//----------------------------------------------------------------------------------------------------------------- //功能: 输入一个IP段,输出该IP段内的端口开放情况信息

int ScanIp(const string &start_Ip, const string &endIp, multimap<unsigned long, string> &ouputMap)

{

//分解IP段内的IP到全局数组中去

GetIpToScan(start_Ip,endIp,g_vec_IpToScan);

int scanNum = g_vec_IpToScan.size();

//线程总数

g_runThreadNum = scanNum;

cout<<"********************************************************************************";

cout << " 共有 " << scanNum <<" 个IP要扫描 " << endl;

//对每个IP开一个线程

for (int i = 0; i < scanNum; ++i)

{

CreateThread(NULL,0,ThreadFunc,&g_vec_IpToScan[i],0,NULL);

第20页

cout<<endl; cout<<endl;

安 阳 师 范 学 院

//要是不间隔时间的话,同时创建socket会出现10093错误

Sleep(50);

}

return 0;

}

//------------------------------------------------------------------------------------------------------- //输出扫描结果

int OutPutScanInfo()

{

cout <<" 扫描到 " << g_map_ScanResult.size() << " 条记录 " << endl;

multimap<unsigned long, string>::iterator iter = g_map_ScanResult.begin();

ofstream out("out.txt");

cout <<" 显示总 " << g_map_ScanResult.size() << " 条记录: " << endl;

cout<<endl;

for (; iter!=g_map_ScanResult.end(); ++iter)

{

out << iter->second << endl;

cout << iter->second << endl;

}

return 0;

}

//---------------------------------------------------------------------------------------------------- void UserInput()

第21页

安 阳 师 范 学 院

{

cout<<" "<<endl;

cout<<" 简单的端口扫描器实现 "<<endl;

cout<<" "<<endl;

cout<<" "<<endl;

cout<<" 姓名:李涛 学号:134951007 "<<endl;

cout<<"________________________________________________________________________________"<<endl;

cout<<" 可扫描一个或多个IP,输入同一网段的两个IP. "<<endl;

cout<<" 格式为192.168.1.1 192.168.1.254. "<<endl;

cout<<" 只扫描一个IP时,输入两个相同IP. "<<endl;

cout<<" 扫描多个IP时,输入两个不相同IP. "<<endl;

cout<<"________________________________________________________________________________"<<endl;

cout<<endl;

cout<<"********************************************************************************";

第22页

cout<<endl;

安 阳 师 范 学 院

cout<<" 现在请输入需要扫描的IP ";

cout<<" 起始IP为:";

cin >> g_startIp;

cout<<" 结束IP为:";

cin >> g_endIp;

cout<<"********************************************************************************"<< endl;

}

//------------------------------------------------------------------------------------------------------------ //初始化相关信息

void InitProc()

{ SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_INTENSITY|FOREGROUND_GREEN);//设置绿色

//初始化socket相关信息

int ws_result;

ws_result = WSAStartup(MAKEWORD(2,2),&g_wsadata);

if (ws_result != 0)

{

cout << "socket WSAStartup初始化失败" << endl;

}

//设置阻塞函数的超时时间

g_timeout.tv_sec = TIMEOUT;

g_PortMutex = CreateMutex(NULL, FALSE, "port mutex");

g_ThreadNumMutex= CreateMutex(NULL, FALSE, "threadnums mutex");

第23页

安 阳 师 范 学 院

g_ResultMutex = CreateMutex(NULL, FALSE, "result mutex");

}

//------------------------------------------------------------------------------------------------------------------- //清理

void CleanProc()

{

////////////////线程都执行完后清理socket相关信息//////

while (1)

{

WaitForSingleObject(g_ThreadNumMutex,INFINITE);

if (g_runThreadNum == 0)

{

break;

}

ReleaseMutex(g_ThreadNumMutex);

Sleep(100);

}

//清理socket相关信息

WSACleanup();

}

int main() //主函数

{

clock_t start_time;

clock_t end_time;

double cost_time = 0;

start_time = clock();

InitProc();//初始化

UserInput();//输入

第24页

安 阳 师 范 学 院

ScanIp(g_startIp,g_endIp,g_map_ScanResult);//开始扫描

CleanProc();//清理结束后进程

OutPutScanInfo();//输出结果

//计算程序运行时间 end_time = clock();

cost_time = (double) (end_time - start_time) / CLOCKS_PER_SEC;

cout<<endl;

cout <<" 时间为: " << cost_time << " 秒" << endl;

cout<<"********************************************************************************";

cout<<endl; cout<<endl;

return 0;

}

第25页

更多相关推荐:
串口端口号设置说明

在启动软件之前鼠标移到我的电脑点击右键弹出以下图点击管理弹出如下如点击设备管理器再点击端口如下如果通讯端口不是com3就双击通讯端口弹出如下图然后点击端口设置再点击高级如下图在com端口号处有一个下拉菜单通过下...

修改系统中COM端口号的方法

用鼠标右键点击桌面上我的电脑图标在弹出菜单中选择属性出现下面的窗口点击硬件选择下面的设备管理器在打开的设备管理器窗口内可以看到端口选项点击前面的小号展开菜单可以看到ECP打印端口LPT1通讯端口COM1通讯端口...

Windows7下更改USB转串口转换器的端口号方法图解

Windows7下更改USB转串口转换器的端口号方法图解1打开设备管理器2找到端口部分3进入端口属性4进入高级选项即可修改注意转换器每换一个USB口系统所自动分配的串口号不一样如插在笔记本左侧的USB口分配为C...

查看端口状态时以太网口和串口的区别

查看端口状态时以太网口和串口的区别第一种情况端口被手动shutdown这个显示为端口administrativelydown当然协议就down的第二种情况端口和协议都是up链路是通的这种情况也容易理解第三种情况...

修改系统中COM端口号的方法

修改系统中COM端口号的方法用鼠标右键点击桌面上我的电脑图标在弹出菜单中选择属性出现下面的窗口点击硬件选择下面的设备管理器在打开的设备管理器窗口内可以看到端口选项点击前面的小号展开菜单可以看到ECP打印端口LP...

关于解决usb转串口com口序号的问题

关于解决usb转串口com口序号不断增加的问题一问题出现原因为了方便说明问题给笔记本电脑的usb口编上号分别为123当你首次使用1号usb口接入开发板得转串口后电脑分得的端口号是com3如图一图一如果你再使用2...

串口端口占用释放问题

USB虚拟串口被占用的问题怎样释放掉串口可以通过删除注册表中的一个数值项来清除这些配置在运行对话框中输入regedit进入注册表然后进入HKEYLOCALMACHINESYSTEMCurrentControlS...

2端口串口共享服务器产品

2口串口共享服务器产品型号简介C2322SU双口三线制RS232转以太网C4852SU双口RS485转以太网CMIX2SU1口RS2321口RS485转以太网带HV后缀的型号为DC848V宽压供电2口串口共享服...

电脑系统端口号

电脑中的道路电脑端口全面介绍电脑的端口就想一条条不同的道路各自分担着各类数据的通讯计算机quot端口quot是英文port的义译可以认为是计算机与外界通讯交流的出口其中硬件领域的端口又称接口如USB端口串行端口...

修改的端口号

cmdtlntadmnconfigport等于后面改为自己要修改的端口号即可21tcpFTP文件传输协议22tcpSSH安全登录文件传送SCP和端口重定向23tcpTelnet不安全的文本传送25tcpSMTP...

常用协议端口号

常用协议端口号1协议名称ACAPAIMBEEPCASTCMPCOPSPKTCABLECOPSPKTCABLEMMCOPSDAAPFODIAMETERTCCDLSWNPNSDSIDATAGIFTCSHTTPPRO...

常用协议端口号

常用协议端口号1813端口使用UDP传输3306端口使用TCP传输Tracert默认使用UDP数据包来探测路由路径端口为33434TCP协议支持协议名称TCP端口号协议名称解释ACAP674AIM5190BEE...

串口端口号(8篇)