ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:128.72KB ,
资源ID:8517233      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/8517233.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(信息安全系统课程设计报告材料.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

信息安全系统课程设计报告材料.docx

1、信息安全系统课程设计报告材料工业学院课程设计报告课程名称:计算机网络信息安全某某:XXX班级: 13XXXXX 学号: 25 指导教师:宋XX时间: 2016.11.21-2016.11.25工业学院计算机工程学院基于tcp协议的端口扫描程序设计摘 要计算机信息网络的开展加速了信息化时代的进程,但是随着社会网络化程度的增加,对计算机网络的依赖也越来越大,网络安全问题也日益明显。端口扫描技术是发现安全问题的重要手段之一。本程序是在Windows系统中使用C语言用MFC完成的一个端口扫描程序。此程序主要完成了TCP connect()扫描的功能。TCP扫描支持多线程,能对单个指定的主机进展扫描或对

2、指定网段的主机进展逐个扫描。能扫描特定的局部端口号或对指定的端口段的端口进展逐个扫描。此端口扫描程序能快速地进展TCP扫描,准确地检测出对TCP协议开放的端口。扫描结果以列表的形式直观地展现出来。关键词:端口扫描、TCP扫描、TCP多线程扫描引言课题的背景与意义网络中每台计算机犹如一座城堡,这些城堡中,有些是对外完全开放的,有些却是大门紧闭的。入侵者们是如何找到,并打开它们的城门呢?这些城门终究通向何处?在网络中,把这些城堡的“城门称之为计算机的“端口。端口扫描是入侵者搜索信息的几种常用方法之一,也正是这一种方法最容易暴露入侵者的身份和意图。一般说来,扫描端口有以下目的:判断目标主机上开放了哪

3、些服务判断目标主机的操作系统如果入侵者掌握了目标主机开放了哪些服务,运行何种操作系统,他们就能使用相应的手段实现入侵。而如果管理员先掌握了这些端口服务的安全漏洞,就能采取有效的安全措施,防相应的入侵。端口扫描现状计算机信息网络的开展加速了信息化时代的进程,但是随着社会网络化程度的增加,对计算机网络的依赖也越来越大,网络安全问题也日益明显。端口扫描技术是发现安全问题的重要手段之一。一个端口就是一个潜在的通信通道,也就是一个入侵通道。对目标计算机进展端口扫描,能得到许多有用的信息。扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法,可以搜集到很多关于目标主机的各种有

4、用的信息,从而发现目标机的某些在的弱点。系统设计系统主要目标本程序主要实现了:简易的TCP connect()扫描,支持多线程;UDP扫描功能;能对单个指定的主机进展扫描或扫描指定网段的主机;能扫描特定的局部端口号或对指定的端口段的端口进展逐个扫描;开发环境与工具测试平台:Windows 7开发语言:C语言功能模块与系统结构作为端口扫描程序,首先需要完成的功能就是对于系统操作系统的服务端口进展扫描,返回扫描结果。对于端口的扫描,包括对于本机系统服务端口,局域网目标机系统,以与远程IP的系统服务端口进展扫描。有些时候,用户并不需要去扫描整个系统的所有端口,因为这样的话不仅会浪费大量的时间,而且可

5、能导致难以找到自己需要了解的端口的扫描结果。所以,对于选择性地对端口进展扫描也非常重要。这当然也是扫描程序需要实现的功能之一。用户在等待扫描的时候,往往希望知道它的工作进度。这样用户可以更好地控制自己的操作。站在用户的角度思考,设置进度是程序需要完成的,这样就能知道程序扫描的进度。系统必须提供的服务是功能需求的根本,本着站在用户角度思考的原如此,做出如上表示需求,从简列举如下:扫描功能;地址选择功能;端口选择功能;进度显示功能;端口扫描程序功能模块如如下图所示:程序运行流程图:系统功能程序设计本程序主要实现了简易的TCP connect()扫描和UDP扫描功能,对TCP扫描支持多线程扫描,UD

6、P扫描仅支持单线程。获取本机IP首先使用winsock中的gethostname()函数获取本地主机的标准主机名,再使用函数gethostbyname()主机名字和地址信息的hostent结构指针,最后通过inet_ntoa()函数将地址转化为字符形式返回给主调函数。if( gethostname(szHostName, 128) = 0 ) pHost = gethostbyname(szHostName);for( i = 0; pHost!= NULL & pHost-h_addr_listi!= NULL; i+ )/*对每一个IP地址进展处理*/ pszAddr = inet_nto

7、a (*(struct in_addr *)pHost-h_addr_listi); break; 分割字符串函数的实现由于扫描结果是使用静态字符串保存的,所以最后显示的时候,需要用到分割字符串函数,来将字符串中扫描出的端口号别离出来显示。本函数主要是通过Find()函数来查找用作分隔符的字符串在待查找的字符串中的位置,然后通过Add()函数将分隔符之间的字符保存进数组中,来达到分割字符的目的。 while( -1 != pos ) if( -1 = pre_pos ) pos = source.Find(division,pos); else pos = source.Find(divisi

8、on,(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; 获取待扫描的IP地址通过判断选择的哪个Radio

9、 Button的值,来选择从对应的IP Address控件中读入用户输入的值,假如是单个的IP如此将开始地址StartAddr和完毕地址EndAddr都赋值为IP Address控件的值;假如是IP围,如此第一个IP地址赋值给StartAddr,最后一个IP地址赋值给EndAddr。void CPortScanDlg:setAddr(DWORD& StartAddr,DWORD& EndAddr) switch(m_conf_IP.m_IP) case 0: m_conf_IP.m_IP_Self.GetAddress(StartAddr); m_conf_IP.m_IP_Self.GetAd

10、dress(EndAddr); break; case 1: m_conf_IP.m_IP_Design.GetAddress(StartAddr); m_conf_IP.m_IP_Design.GetAddress(EndAddr); break; case 2: m_conf_IP.m_IP_Start.GetAddress(StartAddr); m_conf_IP.m_IP_End.GetAddress(EndAddr); break; default: break; 获取待扫描的端口号首先读入用户设置的允许的最大线程数。再通过判断选择的哪个Radio Button的值,来选择从对应的

11、Edit Box控件中读入用户输入的值。假如是指定的端口号,如此循环读入Edit Box中的端口号 (一个端口号占用一行,一次读入一行),每行的字符不超过9字符,再在读入的每行字符的末尾添加字符串完毕标记 0,再通过atoi()函数把字符型转换为整型,存放在定义的数组结构中,并保存端口号的总个数。假如是端口围,如此第一个端口号的值和最后一个端口号的值分别读入存放在定义的结构体中。void CPortScanDlg:setPort(tag_PORTS *pScanParam,int& ThreadNum) ThreadNum=m_conf_Port.m_ThreadNum; switch(m_c

12、onf_Port.m_Port) case 0: short nCount = 0; char buff10; for(int i=0; inArrOfPortsnCount+= atoi(buff); pScanParam-nCount = nCount; pScanParam-bSepecifiedPort=0; break; case 1: pScanParam-bSepecifiedPort=1; pScanParam-iStartPort=m_conf_Port.m_StartPort; pScanParam-iEndPort=m_conf_Port.m_EndPort; break

13、; default: break; 3.4.1 指定端口号的初始化首先试着读取文件中保存的端口号,假如读入成功,如此显示该文本文档中保存的值;假如该文件不存在或读入异常,如此显示默认设置的值。void conf_Port:ReadDefaultPorts() try CStdioFile f(DefaultPorts.txt, CFile:modeRead|CFile:typeText); CString s, ss; while (f.ReadString(ss) s += ss; s += rn; GetDlgItem(IDC_EDIT_DesignPort)-SetWindowText(

14、s); f.Close(); catch(.) CString s = 13rn37rn123rn135rn139rn489rn1002; GetDlgItem(IDC_EDIT_DesignPort)-SetWindowText(s); 3.4.2 指定端口号的保存在运行端口扫描时会将指定端口保存进文本文档中,假如此文件不存在,如此创建此文件。void conf_Port:SaveDefaultPorts() CStdioFile f(DefaultPorts.txt, CFile:modeCreate|CFile:modeWrite|CFile:typeText); char buff10

15、; for(int i=0; im_DesignPort.GetLineCount(); i+) int len = m_DesignPort.GetLine(i, buff, 9); if (len != 0) bufflen = 0; f.WriteString(buff); f.WriteString(rn); f.Close(); TCP connect() 扫描这是最根本的TCP扫描。操作系统提供的connect()系统调用,用来与每一个感兴趣的目标计算机的端口进展连接。如果端口处于侦听状态,那么connect()就能成功。否如此,这个端口是不能用的,即没有提供服务。这个技术的一个最

16、大的优点是,你不需要任何权限。系统中的任何用户都有权利使用这个调用。另一个好处就是速度。如果对每个目标端口以线性的方式,使用单独的connect()调用,那么将会花费相当长的时间,你可以通过同时打开多个套接字,从而加速扫描。使用非阻塞I/O允许你设置一个低的时间用尽周期,同时观察多个套接字。但这种方法的缺点是很容易被觉察,并且被过滤掉。目标计算机的logs文件会显示一连串的连接和连接是出错的服务消息,并且能很快的使它关闭。3.5.1 根本原理调用connect()函数,根据返回值来判断端口是否打开的,connect()函数返回0说明建立连接成功,说明该端口是打开的,就将该端口保存进静态字符串变

17、量中,然后关闭连接,如此线程数减一。RunThreadNum是用来控制最大线程数量的。UINT CPortScanDlg:DoScanPort_TCP(LPVOID lp) ret=connect(sock,(struct sockaddr*)&sin,sizeof(sin); if(ret=0) str.Format(%d,ntohs(sin.sin_port); showout_tcp+=str+|; closesocket(sock); RunThreadNum-;3.5.2 扫描多个主机多端口多线程的实现扫描多个主机是使用for循环来实现逐个扫描的,多端口也是使用for循环来实现逐个扫

18、描的。最大线程数量是通过变量RunThreadNum的值来控制的,当其值大于允许的最大线程数maxthread时,便Sleep等待,直到存活的线程数小于maxthread,经过测试最大线程数maxthread设置为150效果较好,不宜大于200。多线程的创建是通过调用AfxBeginThread()函数来实现的。for(nowAddr=StartAddr;nowAddr=EndAddr;nowAddr+) for(int i=0;imaxthread) Sleep(20); hThreadTcp=AfxBeginThread(DoScanPort_TCP,&inforabout,0,0,0,N

19、ULL); CloseHandle(hThreadTcp); Sleep(10); . 3.5.3 扫描结果的显示首先判断静态字符串变量showout_tcp是否为空,假如为空说明没有端口是打开的。假如存在打开的端口,如此调用分割字符串函数将打开的端口号提取出来存放到Array数组中,再分别显示出来。if(showout_tcp!=) ArrayNum = Split_CString(showout_tcp,Array,|); temp=0; while(tempArrayNum-1) m_result.InsertItems(intRow,strId,strIp,strPort,Protoc

20、olTCP,strOpen); temp+; intRow+;测试报告TCP扫描检测查看本地ip为1IP设置为本地IP:2IP设置为环回地址127.0.0.1:始端口开始端口:0,完毕端口10241IP设置为本地IP10.的扫描结果:2IP设置为127.0.0.1的扫描结果:设置为扫描本地IP和设置为扫描127.0.0.1时扫描结果会有差异:扫描127.0.0.1时扫描不出端口139,具体原因还不清楚。经过ping命令发现XXIP为的主机能ping通扫描结果如下:由扫描结果可知能正常扫描,能正确扫描出能进展TCP连接的端口结 论本设计经过近1周的努力,根本满足了一个端口扫描程序的根本要求。完成

21、后的程序实现了TCP connect()扫描功能,TCP扫描支持多线程,能大大加快扫描速度。能对单个指定的主机进展扫描或扫描指定网段的主机。能对指定的端口段的端口进展逐个扫描,或扫描特定的局部端口号,以防止在不需要了解的端口号上浪费时间。进度条显示,能方便用户随时知道扫描的进度。系统设计期间,学习到很多课堂上没有的知识,还积累了很多实践经验,增强了动手能力和解决实际问题的能力。通过这次的课程设计,对网络编程有了更深入的了解,进一步熟悉了TCP和UDP协议的容,掌握了TCP、UDP扫描端口的根本原理,学会了运用sockt套接字构造UDP数据包并发送,以与如何接收ICMP数据包。对编程思想有了进一

22、步的体会,养成了一些良好的编程习惯。系统虽然完成,但还有很多不足之处,希望自己能不断学习和实践,争取以后做得更好。虽然此软件实现了支持多线程的TCP connect()扫描功能,但也还有很多不足之处,如扫描功能单一:不支持TCP SYN扫描、TCP FIN 扫描以与IP段扫描等功能,对UDP扫描不支持多线程功能,而且在扫描主机前没有发送ICMP报文去判断主机是否在线,还需要进一步完善。限于本人知识水平和经验有限,此程序还有许多有待完善和改正的地方,恳请各位教师和读者批评指正。参考文献1 甘刚、闫丽丽、盛志伟、冼进Linux/UNIX网络编程中国水利水电2008年第1版。2 建华、胥光辉、涛 等译TCP/IP详解 卷1:协议机械工业2009年第1版。3 黄维通java面向对象与可视化程序设计(第2版)清华大学2013年第2版4 莉、董渊、瑞丰java语言程序设计(第3版)清华大学2012年第3版

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1