主机端口扫描程序设计

  • 格式:doc
  • 大小:154.00 KB
  • 文档页数:19

下载文档原格式

  / 19
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

主机端口扫描程序设计

摘要

计算机信息网络的发展加速了信息化时代的进程,但是随着社会网络化程度的增加,对计算机网络的依赖也越来越大,网络安全问题也日益明显。端口扫描技术是发现安全问题的重要手段之一。

本程序是在Windows系统中使用C语言用MFC完成的一个端口扫描程序。此程序主要完成了TCP connect()扫描和UDP扫描功能。TCP扫描支持多线程,能对单个指定的主机进行扫描或对指定网段内的主机进行逐个扫描。能扫描特定的部分端口号或对指定的端口段内的端口进行逐个扫描。此端口扫描程序能快速地进行TCP扫描,准确地检测出对TCP协议开放的端口。而对于UDP扫描只支持单线程,速度较慢。扫描结果以列表的形式直观地展现出来。

关键词:端口扫描、TCP扫描、UDP扫描、TCP多线程扫描

目录

1引言 (1)

1.1 课题的背景及意义 (1)

1.2 端口扫描现状 (1)

2系统设计 (1)

2.1 系统主要目标 (1)

2.2 开发环境及工具 (1)

2.3 功能模块与系统结构 (2)

3系统功能程序设计 (4)

3.1 获取本机IP (4)

3.2 分割字符串函数的实现 (4)

3.3 获取待扫描的IP地址 (5)

3.4 获取待扫描的端口号 (5)

3.4.1 指定端口号的初始化 (6)

3.4.2 指定端口号的保存 (7)

3.5 TCP CONNECT()扫描 (8)

3.5.1 基本原理 (8)

3.5.2 扫描多个主机多端口多线程的实现 (8)

3.5.3 扫描结果的显示 (9)

3.6 UDP扫描 (10)

3.6.1 基本原理 (10)

3.6.2 计算效验和 (11)

3.6.3 发送UDP数据包 (11)

3.6.4 接收ICMP数据包 (12)

4测试报告 (12)

4.1 TCP扫描检测 (12)

4.1.1扫描本机 (12)

4.1.2扫描网络中其他主机 (13)

4.1.3 扫描IP段 (13)

4.2 UDP扫描检测 (14)

4.2.1 扫描本机 (14)

4.1.2扫描网络中其他主机 (15)

4.3 TCP、UDP一起扫描 (16)

结论 (17)

参考文献 (17)

1引言

1.1 课题的背景及意义

网络中每台计算机犹如一座城堡,这些城堡中,有些是对外完全开放的,有些却是大门紧闭的。入侵者们是如何找到,并打开它们的城门呢?这些城门究竟通向何处?

在网络中,把这些城堡的“城门”称之为计算机的“端口”。端口扫描是入侵者搜索信息的几种常用方法之一,也正是这一种方法最容易暴露入侵者的身份和意图。一般说来,扫描端口有以下目的:

判断目标主机上开放了哪些服务

判断目标主机的操作系统

如果入侵者掌握了目标主机开放了哪些服务,运行何种操作系统,他们就能使用相应的手段实现入侵。而如果管理员先掌握了这些端口服务的安全漏洞,就能采取有效的安全措施,防范相应的入侵。

1.2 端口扫描现状

计算机信息网络的发展加速了信息化时代的进程,但是随着社会网络化程度的增加,对计算机网络的依赖也越来越大,网络安全问题也日益明显。端口扫描技术是发现安全问题的重要手段之一。一个端口就是一个潜在的通信通道,也就是一个入侵通道。对目标计算机进行端口扫描,能得到许多有用的信息。扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法,可以搜集到很多关于目标主机的各种有用的信息,从而发现目标机的某些内在的弱点。

2系统设计

2.1 系统主要目标

本程序主要实现了:

简易的TCP connect()扫描,支持多线程;

UDP扫描功能;

能对单个指定的主机进行扫描或扫描指定网段内的主机;

能扫描特定的部分端口号或对指定的端口段内的端口进行逐个扫描;

2.2 开发环境及工具

测试平台:Windows XP Professional

使用软件:Visual C++ 6.0

开发语言:C语言

2.3 功能模块与系统结构

作为端口扫描程序,首先需要完成的功能就是对于系统操作系统的服务端口进行扫描,返回扫描结果。对于端口的扫描,包括对于本机系统服务端口,局域网内目标机系统,以及远程IP的系统服务端口进行扫描。

有些时候,用户并不需要去扫描整个系统的所有端口,因为这样的话不仅会浪费大量的时间,而且可能导致难以找到自己需要了解的端口的扫描结果。所以,对于选择性地对端口进行扫描也非常重要。这当然也是扫描程序需要实现的功能之一。

用户在等待扫描的时候,往往希望知道它的工作进度。这样用户可以更好地控制自己的操作。站在用户的角度思考,设置进度是程序需要完成的,这样就能知道程序扫描的进度。

系统必须提供的服务是功能需求的基本,本着站在用户角度思考的原则,做出如上叙述需求,从简列举如下:

扫描功能;

地址选择功能;

端口选择功能;

进度显示功能;

端口扫描程序功能模块如下图所示:

程序运行流程图:

3系统功能程序设计

本程序主要实现了简易的TCP connect()扫描和UDP扫描功能,对TCP扫描支持多线程扫描,UDP扫描仅支持单线程。

3.1 获取本机IP

首先使用winsock中的gethostname()函数获取本地主机的标准主机名,再使用函数gethostbyname()主机名字和地址信息的hostent结构指针,最后通过inet_ntoa()函数将地址转化为字符形式返回给主调函数。

if( gethostname(szHostName, 128) == 0 )

{

pHost = gethostbyname(szHostName);

for( i = 0; pHost!= NULL && pHost->h_addr_list[i]!= NULL; i++ )

{/*对每一个IP地址进行处理*/

pszAddr = inet_ntoa (*(struct in_addr *)pHost->h_addr_list[i]);

break;

}

}

3.2 分割字符串函数的实现

由于扫描结果是使用静态字符串保存的,所以最后显示的时候,需要用到分割字符串函数,来将字符串中扫描出的端口号分离出来显示。本函数主要是通过Find()函数来查找用作分隔符的字符串在待查找的字符串中的位置,然后通过Add()函数将分隔符之间的字符保存进数组中,来达到分割字符的目的。

while( -1 != pos ){

if( -1 == pre_pos )

pos = source.Find(division,pos);

else

pos = source.Find(division,(pos+1));

if( -1 == pre_pos ) {

iFirst = 0;

if( -1 == pos )

nCount = source.GetLength();

else

nCount = pos;

} else{

iFirst = pre_pos+len;