信息安全课程设计报告-基于tcp协议的端口扫描程序设计.doc
- 文档编号:358771
- 上传时间:2023-04-29
- 格式:DOC
- 页数:16
- 大小:135KB
信息安全课程设计报告-基于tcp协议的端口扫描程序设计.doc
《信息安全课程设计报告-基于tcp协议的端口扫描程序设计.doc》由会员分享,可在线阅读,更多相关《信息安全课程设计报告-基于tcp协议的端口扫描程序设计.doc(16页珍藏版)》请在冰点文库上搜索。
成都工业学院
课程设计报告
课程名称:
计算机网络信息安全
姓名:
XXX
班级:
13XXXXX
学号:
25
指导教师:
宋XX
时间:
2016.11.21---2016.11.25
成都工业学院
计算机工程学院
基于tcp协议的端口扫描程序设计
摘要
计算机信息网络的发展加速了信息化时代的进程,但是随着社会网络化程度的增加,对计算机网络的依赖也越来越大,网络安全问题也日益明显。
端口扫描技术是发现安全问题的重要手段之一。
本程序是在Windows系统中使用C语言用MFC完成的一个端口扫描程序。
此程序主要完成了TCPconnect()扫描的功能。
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 进行UDP扫描 显示打开端口 AfxBeginThread(DoScanPort_TCP,&inforabout,0,0,0,NULL) nowAddr++ nowAddr<=EndAddr nowAddr=StartAddr i=0 i DoScanPort_UDP(&inforabout) i++ 显示打开端口 nowAddr++ 结束 是 是 是 是 是 是 否 否 否 否 否 否 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); break; case2: m_conf_IP.m_IP_Start.GetAddress(StartAddr); m_conf_IP.m_IP_End.GetAddress(EndAddr); break; default: break; } } 3.4获取待扫描的端口号 首先读入用户设置的允许的最大线程数。 再通过判断选择的哪个RadioButton的值,来选择从对应的EditBox控件中读入用户输入的值。 若是指定的端口号,则循环读入EditBox中的端口号(一个端口号占用一行,一次读入一行),每行的字符不超过9字符,再在读入的每行字符的末尾添加字符串结束标记’\0’,再通过atoi()函数把字符型转换为整型,存放在定义的数组结构中,并保存端口号的总个数。 若是端口范围,则第一个端口号的值和最后一个端口号的值分别读入存放在定义的结构体中。 voidCPortScanDlg: : setPort(tag_PORTS*pScanParam,int&ThreadNum) { ThreadNum=m_conf_Port.m_ThreadNum; switch(m_conf_Port.m_Port) { case0: { shortnCount=0; charbuff[10]; for(inti=0;i { intlen=m_conf_Port.m_DesignPort.GetLine(i,buff,9); if(len! =0) { buff[len]='\0'; pScanParam->nArrOfPorts[nCount++]=atoi(buff); } } pScanParam->nCount=nCount; pScanParam->bSepecifiedPort=0; break; } case1: pScanParam->bSepecifiedPort=1; pScanParam->iStartPort=m_conf_Port.m_StartPort; pScanParam->iEndPort=m_conf_Port.m_EndPort; break; default: break; } 3.4.1指定端口号的初始化 首先试着读取DefaultPorts.txt文件中保存的端口号,若读入成功,则显示该文本文档中保存的值;若该文件不存在或读入异常,则显示默认设置的值。 voidconf_Port: : ReadDefaultPorts() { try { CStdioFilef("DefaultPorts.txt",CFile: : modeRead|CFile: : typeText); CStrings,ss; while(f.ReadString(ss)) { s+=ss; s+="\r\n"; } GetDlgItem(IDC_EDIT_DesignPort)->SetWindowText(s); f.Close(); } catch(...) { CStrings="13\r\n37\r\n123\r\n135\r\n139\r\n489\r\n1002"; GetDlgItem(IDC_EDIT_DesignPort)->SetWindowText(s); } } 3.4.2指定端口号的保存 在运行端口扫描时会将指定端口保存进文本文档DefaultPorts.txt中,若此文件不存在,则创建此文件。 voidconf_Port: : SaveDefaultPorts() { CStdioFilef("DefaultPorts.txt",CFile: : modeCreate|CFile: : modeWrite|CFile: : typeText); charbuff[10]; for(inti=0;i { intlen=m_DesignPort.GetLine(i,buff,9); if(len! =0) { buff[len]='\0'; f.WriteString(buff); f.WriteString("\r\n"); } } f.Close(); } 3.5TCPconnect()扫描 这是最基本的TCP扫描。 操作系统提供的connect()系统调用,用来与每一个感兴趣的目标计算机的端口进行连接。 如果端口处于侦听状态,那么connect()就能成功。 否则,这个端口是不能用的,即没有提供服务。 这个技术的一个最大的优点是,你不需要任何权限。 系统中的任何用户都有权利使用这个调用。 另一个好处就是速度。 如果对每个目标端口以线性的方式,使用单独的connect()调用,那么将会花费相当长的时间,你可以通过同时打开多个套接字,从而加速扫描。 使用非阻塞I/O允许你设置一个低的时间用尽周期,同时观察多个套接字。 但这种方法的缺点是很容易被发觉,并且被过滤掉。 目标计算机的logs文件会显示一连串的连接和连接是出错的服务消息,并且能很快的使它关闭。 3.5.1基本原理 调用connect()函数,根据返回值来判断端口是否打开的,connect()函数返回0说明建立连接成功,说明该端口是打开的,就将该端口保存进静态字符串变量中,然后关闭连接,则线程数减一。 RunThreadNum是用来控制最大线程数量的。 UINTCPortScanDlg: : DoScanPort_TCP(LPVOIDlp) { ……………………… ret=connect(sock,(structsockaddr*)&sin,sizeof(sin)); if(ret==0) { str.Format("%d",ntohs(sin.sin_port)); showout_tcp+=str+"|"; } closesocket(sock); RunThreadNum--; ……………………… } 3.5.2扫描多个主机多端口多线程的实现 扫描多个主机是使用for循环来实现逐个扫描的,多端口也是使用for循环来实现逐个扫描的。 最大线程数量是通过变量RunThreadNum的值来控制的,当其值大于允许的最大线程数maxthread时,便Sleep等待,直到存活的线程数小于maxthread,经过测试最大线程数maxthread设置为150效果较好,不宜大于200。 多线程的创建是通过调用AfxBeginThread()函数来实现的。 for(nowAddr=StartAddr;nowAddr<=EndAddr;nowAddr++) { ………………… for(inti=0;i { ………………… while(RunThreadNum>maxthread) { Sleep(20); } ………………………… hThreadTcp=AfxBeginThread(DoScanPort_TCP,&inforabout,0,0,0,NULL); CloseHandle(hThreadTcp); Sleep(10); } …………………………. } 3.5.3扫描结果的显示 首先判断静态字符串变量showout_tcp是否为空,若为空说明没有端口是打开的。 若存在打开的端口,则调用分割字符串函数将打开的端口号提取出来存放到Array数组中,再分别显示出来。 if(showout_tcp! ="") { ……………………… ArrayNum=Split_CString(showout_tcp,Array,"|"); temp=0; while(temp { ………………………… m_result.InsertItems(intRow,strId,strIp,strPort,ProtocolTCP,strOpen); temp++; intRow++; } } 4测试报告 4.1TCP扫描检测 4.1.1扫描本机 1.IP设置 查看本地ip为10.20.124.199 (1)IP设置为本地IP(10.20.124.199): (2)IP设置为环回地址127.0.0.1: 2.端口设置为起始端口(开始端口: 0,结束端口1024) 3.扫描结果 (1)IP设置为本地IP(10.20.124.199)的扫描结果: (2)IP设置为127.0.0.1的扫描结果: 设置为扫描本地IP和设置为扫描127.0.0.1时扫描结果会有差别: 扫描127.0.0.1时扫描不出端口139,具体原因还不清楚。 4.1.2扫描网络中其他主机 经过ping命令发现百度IP为119.75.218.70的主机能ping通 1.设置IP 2.端口设置为0-1024 扫描结果如下: 由扫描结果可知能正常扫描,能正确扫描出能进行TCP连接的端口 结论 本设计经过近1周的努力,基本满足了一个端口扫描程序的基本要求。 完成后的程序实现了TCPconnect()扫描功能,TCP扫描支持多线程,能大大加快扫描速度。 能对单个指定的主机进行扫描或扫描指定网段内的主机。 能对指定的端口段内的端口进行逐个扫描,或扫描特定的部分端口号,以避免在不需要了解的端口号上浪费时间。 进度条显示,能方便用户随时知道扫描的进度。 系统设计期间,学习到很多课堂上没有的知识,还积累了很多实践经验,增强了动手能力和解决实际问题的能力。 通过这次的课程设计,对网络编程有了更深入的了解,进一步熟悉了TCP和UDP协议的内容,掌握了TCP、UDP扫描端口的基本原理,学会了运用sockt套接字构造UDP数据包并发送,以及如何接收ICMP数据包。 对编程思想有了进一步的体会,养成了一些良好的编程习惯。 系统虽然完成,但还有很多不足之处,希望自己能不断学习和实践,争取以后做得更好。 虽然此软件实现了支持多线程的TCPconnect()扫描功能,但也还有很多不足之处,如扫描功能单一: 不支持TCPSYN扫描、TCPFIN扫描以及IP段扫描等功能,对UDP扫描不支持多线程功能,而且在扫描主机前没有发送ICMP报文去判断主机是否在线,还需要进一步完善。 限于本人知识水平和经验有限,此程序还有许多有待完善和改正的地方,恳请各位老师和读者批评指正。 参考文献 [1]甘刚、闫丽丽、盛志伟、冼进.Linux/UNIX网络编程.中国水利水电出版社.2008年第1版。 [2]范建华、胥光辉、张涛等译.TCP/IP详解卷1: 协议.机械工业出版社.2009年第1版。 [3]黄维通.java面向对象与可视化程序设计(第2版).清华大学出版社.2013年第2版 [4]郑莉、董渊、张瑞丰.java语言程序设计(第3版).清华大学出版社.2012年第3版 13
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息 安全 课程设计 报告 基于 tcp 协议 端口扫描 程序设计
![提示](https://static.bingdoc.com/images/bang_tan.gif)