《计算机网络课程设计报告-- 简单的端口扫描器.docx》由会员分享,可在线阅读,更多相关《计算机网络课程设计报告-- 简单的端口扫描器.docx(20页珍藏版)》请在优知文库上搜索。
1、课程设计报告20142015学年第一学期课程名称计算机网络设计题目简单的端口扫描器1引言31.1 课题的背景及意义31.2 端口扫描现状32 系统设计32.1 系统主要目标32.2 开发环境及工具32.3 功能模块与系统结构43 系统功能程序设计53.1 获取本机IP53.2 分割字符串函数的实现53.3 获取待扫描的IP地址63.4 4获取待扫描的端口号61.1.1 指定端口号的初始化81.1.2 指定端口号的保存83.5 TCPconnect()扫描93.5.1 基本原理93.5.2 扫描多个主机多端口多线程的实现103.5.3 扫描结果的显示103.6 UDP扫描113.6.1 基本原理
2、113.6.2 计算效验和123.6.3 发送UDP数据包123.6.4 接收ICMP数据包134测试报告144.1 TCP扫描检测144.1.1 扫描本机144.1.2 扫描网络中其他主机144.1.3 扫描IP段154.2 UDP扫描检测164.2.1 扫描本机164.1.2扫描网络中其他主机174.3TCP、UDP一起扫描18结论18参考文献191引言1.1 课题的背景及意义网络中每台计算机犹如一座城堡,这些城堡中,有些是对外完全开放的,有些却是大门紧闭的。入侵者们是如何找到,并打开它们的城门呢?这些城门究竟通向何处?在网络中,把这些城堡的“城门”称之为计算机的“端口端口扫描是入侵者搜索
3、信息的几种常用方法之一,也正是这一种方法最容易暴露入侵者的身份和意图。一般说来,扫描端口有以下目的:判断目标主机上开放了哪些服务判断目标主机的操作系统如果入侵者掌握了目标主机开放了哪些服务,运行何种操作系统,他们就能使用相应的手段实现入侵。而如果管理员先掌握了这些端口服务的安全漏洞,就能采取有效的安全措施,防范相应的入侵。1.2 端口扫描现状计算机信息网络的发展加速了信息化时代的进程,但是随着社会网络化程度的增加,对计算机网络的依赖也越来越大,网络安全问题也日益明显。端口扫描技术是发现安全问题的重要手段之一。一个端口就是一个潜在的通信通道,也就是一个入侵通道。对目标计算机进行端口扫描,能得到许
4、多有用的信息。扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法,可以搜集到很多关于目标主机的各种有用的信息,从而发现目标机的某些内在的弱点。2系统设计2.1 系统主要目标本程序主要实现了:简易的TCPCOrmeCt()扫描,支持多线程;UDP扫描功能;能对单个指定的主机进行扫描或扫描指定网段内的主机;能扫描特定的部分端口号或对指定的端口段内的端口进行逐个扫描;2.2 开发环境及工具测试平台:WindoWSXPProfessional使用软件:VisualC+6.0开发语言:C语言2.3 功能模块与系统结构作为端口扫描程序,首先需要完成的功能就是对于系统操作系统
5、的服务端口进行扫描,返回扫描结果。对于端口的扫描,包括对于本机系统服务端口,局域网内目标机系统,以及远程IP的系统服务端口进行扫描。有些时候,用户并不需要去扫描整个系统的所有端口,因为这样的话不仅会浪费大量的时间,而且可能导致难以找到自己需要了解的端口的扫描结果。所以,对于选择性地对端口进行扫描也非常重要。这当然也是扫描程序需要实现的功能之一。用户在等待扫描的时候,往往希望知道它的工作进度。这样用户可以更好地控制自己的操作。站在用户的角度思考,设置进度是程序需要完成的,这样就能知道程序扫描的进度。系统必须提供的服务是功能需求的基本,本着站在用户角度思考的原则,做出如上叙述需求,从简列举如下:扫
6、描功能;地址选择功能;端口选择功能;进度显示功能;端口扫描程序功能模块如下图所示:3系统功能程序设计本程序主要实现了简易的TCPConnCCt()扫描和UDP扫描功能,对TCP扫描支持多线程扫描,UDP扫描仅支持单线程。3.1 获取本机IP首先使用winsock中的gethostname()函数获取本地主机的标准主机名,再使用函数gethostbyname()主机名字和地址信息的hostent结构指针,最后通过inet_ntoa()函数将地址转化为字符形式返回给主调函数。if(gethostname(szHostName,128)=0)(pHost=gethostbyname(szIlostN
7、ame);for(i=0;pHost!=NULL&pHost-h_addr_listi!=NULL;i+)*对每一个IP地址进行处理*/pszAddr=inet_ntoa(*(structin_addr*)pHost-h_addr_listi);break;3.2 分割字符串函数的实现由于扫描结果是使用静态字符串保存的,所以最后显示的时候,需要用到分割字符串函数,来将字符串中扫描出的端口号分离出来显示。本函数主要是通过Find()函数来查找用作分隔符的字符串在待查找的字符串中的位置,然后通过Add()函数将分隔符之间的字符保存进数组中,来达到分割字符的目的。while(-1!=pos)if(-
8、1=pre_pos)pos=source.Find(division,pos);elsepos=source.Find(division,(pos+l);if(-1=pre_pos)iFirst=0;if(-1=pos)nCount=source.GetLengthO;elsenCount=pos;elseiFirst=pre_pos+len;if(-1!=pos)nCount=pos-pre_pos-Ien;elsenCount=source.GetLength()-pre_pos_len;dest.Add(source.Mid(iFirst,nCount);pre_pos=pos;)3.3
9、 获取待扫描的IP地址通过判断选择的哪个RadioButton的值,来选择从对应的IPAddress控件中读入用户输入的值,若是单个的IP则将开始地址StartAddr和结束地址EndAddr都赋值为IPAddress控件的值;若是IP范围,则第一个IP地址赋值给StartAddr,最后一个IP地址赋值给EndAddr0voidCPortScanDlg:setAddr(DWORD&StartAddr,DWORD&EndAddr)(switch(m_conf_IP.m_IP)(case0:m_conf_IP.m_IP_Self.GetAddress(StartAddr);m_conf_IP.m_
10、IP_Self.GetAddress(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;3.4获取待扫描的端口号首先读入用户设置的允许的最大线程数。再通过判断选择的哪个RadioBUttOrI的值,来选择
11、从对应的EditBOX控件中读入用户输入的值。若是指定的端口号,则循环读入EditBoX中的端口号(一个端口号占用一行,一次读入一行),每行的字符不超过9字符,再在读入的每行字符的末尾添加字符串结束标记0,再通过atoi()函数把字符型转换为整型,存放在定义的数组结构中,并保存端口号的总个数。若是端口范围,则第一个端口号的值和最后一个端口号的值分别读入存放在定义的结构体中。voidCPortScanDlg:setPort(tag_PORTS*pScanParam,int&ThreadNum)(ThreadNum=m_conf_Port.m_ThreadNum;switch(m_conf_Por
12、t.m_Port)(case0:(shortnCount=0;charbuff10;for(inti=0;inArrOfPortsnCount+=atoi(buff);pScanParam-nCount=nCount;pScanParam-bSepecifiedPort=0;break;case1:pScanParam-bSepecifiedPort=l;pScanParam-iStartPort=m_conf_Port.m_StartPort;pScanParam-iEndPort=m_conf_Port.m_EndPort;break;default:break;3.4.1指定端口号的初始
13、化首先试着读取DefaultPorts.txt文件中保存的端口号,若读入成功,则显示该文本文档中保存的值;若该文件不存在或读入异常,则显示默认设置的值。voidconf_Port:IReadDefaultPortsO(try(CStdioFilef(zzDefaultPorts.txtzz,CFile:ImodeReadCFile:typeText);CStrings,ss;while(f.ReadString(ss)(S+=SS;S+二,rn,)GetDlgItemdDC_EDIT_DeSignPort)-SetWindowText(s);f.Close();catch(.)(CString
14、s=zz13rn37rnl23rnl35rnl39rn489rnl002zz;GetDlgItem(IDC_EDIT_DesignPort)-SetWindowText(s);)3.4.2指定端口号的保存在运行端口扫描时会将指定端口保存进文本文档DefaultPorts.Ixt中,若此文件不存在,则创建此文件。voidconf_Port:SaveDefaultPortsOCStdioFilef(zzDefaultPorts.txt”,CFile:ImodeCreateCFile:ImodeWritelCFile:ItypeText);charbuff10;for(inti-0;im_DesignPort.GetLineCountO;i+)intIen=m_DesignPort.GetLine(i,buff,9);if(len!=O)(bufflen=,O,;f.WriteString(buff);f.WriteString(z,rn,z);)f.Close();3.5TCPconnect()扫描这是最基本的TCP扫描。操作系统提供的ConneCt()系统调用,用来