信息安全课程设计报告-基于tcp协议的端口扫描程序设计Word文档格式.doc
《信息安全课程设计报告-基于tcp协议的端口扫描程序设计Word文档格式.doc》由会员分享,可在线阅读,更多相关《信息安全课程设计报告-基于tcp协议的端口扫描程序设计Word文档格式.doc(16页珍藏版)》请在冰豆网上搜索。
TCP扫描支持多线程,能对单个指定的主机进行扫描或对指定网段内的主机进行逐个扫描。
能扫描特定的部分端口号或对指定的端口段内的端口进行逐个扫描。
此端口扫描程序能快速地进行TCP扫描,准确地检测出对TCP协议开放的端口。
扫描结果以列表的形式直观地展现出来。
关键词:
端口扫描、TCP扫描、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 TCPconnect()扫描 8
3.5.1基本原理 8
3.5.2扫描多个主机多端口多线程的实现 8
3.5.3扫描结果的显示 9
4 测试报告 10
4.1 TCP扫描检测 10
4.1.1扫描本机 10
4.1.2扫描网络中其他主机 11
结论 13
参考文献 13
1引言
1.1课题的背景及意义
网络中每台计算机犹如一座城堡,这些城堡中,有些是对外完全开放的,有些却是大门紧闭的。
入侵者们是如何找到,并打开它们的城门呢?
这些城门究竟通向何处?
在网络中,把这些城堡的“城门”称之为计算机的“端口”。
端口扫描是入侵者搜索信息的几种常用方法之一,也正是这一种方法最容易暴露入侵者的身份和意图。
一般说来,扫描端口有以下目的:
判断目标主机上开放了哪些服务
判断目标主机的操作系统
如果入侵者掌握了目标主机开放了哪些服务,运行何种操作系统,他们就能使用相应的手段实现入侵。
而如果管理员先掌握了这些端口服务的安全漏洞,就能采取有效的安全措施,防范相应的入侵。
1.2端口扫描现状
一个端口就是一个潜在的通信通道,也就是一个入侵通道。
对目标计算机进行端口扫描,能得到许多有用的信息。
扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法,可以搜集到很多关于目标主机的各种有用的信息,从而发现目标机的某些内在的弱点。
2系统设计
2.1系统主要目标
本程序主要实现了:
简易的TCPconnect()扫描,支持多线程;
UDP扫描功能;
能对单个指定的主机进行扫描或扫描指定网段内的主机;
能扫描特定的部分端口号或对指定的端口段内的端口进行逐个扫描;
2.2开发环境及工具
测试平台:
Windows7
使用软件:
VisualC++6.0
开发语言:
C语言
2.3功能模块与系统结构
作为端口扫描程序,首先需要完成的功能就是对于系统操作系统的服务端口进行扫描,返回扫描结果。
对于端口的扫描,包括对于本机系统服务端口,局域网内目标机系统,以及远程IP的系统服务端口进行扫描。
有些时候,用户并不需要去扫描整个系统的所有端口,因为这样的话不仅会浪费大量的时间,而且可能导致难以找到自己需要了解的端口的扫描结果。
所以,对于选择性地对端口进行扫描也非常重要。
这当然也是扫描程序需要实现的功能之一。
用户在等待扫描的时候,往往希望知道它的工作进度。
这样用户可以更好地控制自己的操作。
站在用户的角度思考,设置进度是程序需要完成的,这样就能知道程序扫描的进度。
系统必须提供的服务是功能需求的基本,本着站在用户角度思考的原则,做出如上叙述需求,从简列举如下:
扫描功能;
地址选择功能;
端口选择功能;
进度显示功能;
端口扫描程序功能模块如下图所示:
端口扫描系统
操作
显示
设置地址
设置端口
设置协议
开始扫描
进度显示
结果显示
程序运行流程图:
开始
设置扫描参数(IP、端口、协议)
读入用户设置的IP、端口号、协议
nowAddr=StartAddr
i=0
初始化进度条
进行TCP扫描
nowAddr<
=EndAddr
i++
i<
totalPort
进行UDP扫描
显示打开端口
AfxBeginThread(DoScanPort_TCP,&
inforabout,0,0,0,NULL)
nowAddr++
DoScanPort_UDP(&
inforabout)
结束
是
否
3系统功能程序设计
本程序主要实现了简易的TCPconnect()扫描和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(*(structin_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;
if(-1!
=pos)
nCount=pos-pre_pos-len;
else
nCount=source.GetLength()-pre_pos-len;
}
dest.Add(source.Mid(iFirst,nCount));
pre_pos=pos;
}
3.3获取待扫描的IP地址
通过判断选择的哪个RadioButton的值,来选择从对应的IPAddress控件中读入用户输入的值,若是单个的IP则将开始地址StartAddr和结束地址EndAddr都赋值为IPAddress控件的值;
若是IP范围,则第一个IP地址赋值给StartAddr,最后一个IP地址赋值给EndAddr。
voidCPortScanDlg:
:
setAddr(DWORD&
StartAddr,DWORD&
EndAddr)
switch(m_conf_IP.m_IP)
{
case0:
m_conf_IP.m_IP_Self.GetAddress(StartAddr);
m_conf_IP.m_IP_Self.GetAddress(EndAddr);
break;
case1:
m_conf_IP.m_IP_Design.GetAddress(StartAddr);
m_conf_IP.m_IP_Design.GetAddress(EndAddr);
case2:
m_conf_IP.m_IP_Start.GetAddress(StartAddr);
m_conf_IP.m_IP_End.GetAddress(EndAddr);
default:
3.4获取待扫描的端口号
首先读入用户设置的允许的最大线程数。
再通过判断选择的哪个RadioButton的值,来选择从对应的EditBox控件中读入用户输入的值。
若是指定的端口号,则循环读入EditBox中的端口号(一个端口号占用一行,一次读入一行),每行的字符不超过9字符,再在读入的每行字符的末尾添加字符串结束标记’\0’,再通过atoi()函数把字符型转换为整型,存放在定义的数组结构中,并保存端口号的总个数。
若是端口范围,则第一个端口号的值和最后一个端口号的值分别读入存放在定义的结构体中。
setPort(tag_PORTS*pScanParam,int&
ThreadNum)
ThreadNum=m_conf_Port.m_ThreadNum;
switch(m_conf_Port.m_Port)
{
shortnCount=0;
charbuff[10];
for(inti=0;
i<
m_conf_Port.m_DesignP