信息安全课程设计报告-基于tcp协议的端口扫描程序设计.doc_第1页
信息安全课程设计报告-基于tcp协议的端口扫描程序设计.doc_第2页
信息安全课程设计报告-基于tcp协议的端口扫描程序设计.doc_第3页
信息安全课程设计报告-基于tcp协议的端口扫描程序设计.doc_第4页
信息安全课程设计报告-基于tcp协议的端口扫描程序设计.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

成都工业学院 课程设计报告 课程名称: 计算机网络信息安全 姓 名: XXX 班 级: 13XXXXX 学 号: 25 指导教师: 宋 XX 时 间: 2016.11.21-2016.11.25 成都工业学院 计算机工程学院 基于基于 tcptcp 协议的端口扫描程序设计协议的端口扫描程序设计 摘摘 要要 计算机信息网络的发展加速了信息化时代的进程,但是随着社会网络化程度的增 加,对计算机网络的依赖也越来越大,网络安全问题也日益明显。端口扫描技术是发 现安全问题的重要手段之一。 本程序是在 Windows 系统中使用 C 语言用 MFC 完成的一个端口扫描程序。此程序 主要完成了 TCP connect()扫描的功能。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.5TCP CONNECT() 扫描 .8 3.5.1 基本原理.8 3.5.2 扫描多个主机多端口多线程的实现.8 3.5.3 扫描结果的显示.9 4测试报告测试报告.10 4.1TCP 扫描检测.10 4.1.1 扫描本机.10 4.1.2 扫描网络中其他主机.11 结结 论论.13 参考文献参考文献.13 1 1 1引言引言 1.1 课题的背景课题的背景及意义及意义 网络中每台计算机犹如一座城堡,这些城堡中,有些是对外完全开放的,有些却 是大门紧闭的。入侵者们是如何找到,并打开它们的城门呢?这些城门究竟通向何处? 在网络中,把这些城堡的“城门”称之为计算机的“端口” 。端口扫描是入侵者搜 索信息的几种常用方法之一,也正是这一种方法最容易暴露入侵者的身份和意图。一 般说来,扫描端口有以下目的: 判断目标主机上开放了哪些服务 判断目标主机的操作系统 如果入侵者掌握了目标主机开放了哪些服务,运行何种操作系统,他们就能使用 相应的手段实现入侵。而如果管理员先掌握了这些端口服务的安全漏洞,就能采取有 效的安全措施,防范相应的入侵。 1.2 端口扫描现状端口扫描现状 计算机信息网络的发展加速了信息化时代的进程,但是随着社会网络化程度的增 加,对计算机网络的依赖也越来越大,网络安全问题也日益明显。端口扫描技术是发 现安全问题的重要手段之一。一个端口就是一个潜在的通信通道,也就是一个入侵通 道。对目标计算机进行端口扫描,能得到许多有用的信息。扫描器通过选用远程 TCP/IP 不同的端口的服务,并记录目标给予的回答,通过这种方法,可以搜集到很多 关于目标主机的各种有用的信息,从而发现目标机的某些内在的弱点。 2 2系统设计系统设计 2.1 系统主要目标系统主要目标 本程序主要实现了: 简易的 TCP connect()扫描,支持多线程; UDP 扫描功能; 能对单个指定的主机进行扫描或扫描指定网段内的主机; 能扫描特定的部分端口号或对指定的端口段内的端口进行逐个扫描; 2.2 开发环境及工具开发环境及工具 测试平台:Windows 7 使用软件:Visual C+ 6.0 开发语言:C 语言 2 2.3 功能模块与系统结构功能模块与系统结构 作为端口扫描程序,首先需要完成的功能就是对于系统操作系统的服务端口进行 扫描,返回扫描结果。对于端口的扫描,包括对于本机系统服务端口,局域网内目标 机系统,以及远程 IP 的系统服务端口进行扫描。 有些时候,用户并不需要去扫描整个系统的所有端口,因为这样的话不仅会浪费 大量的时间,而且可能导致难以找到自己需要了解的端口的扫描结果。所以,对于选 择性地对端口进行扫描也非常重要。这当然也是扫描程序需要实现的功能之一。 用户在等待扫描的时候,往往希望知道它的工作进度。这样用户可以更好地控制 自己的操作。站在用户的角度思考,设置进度是程序需要完成的,这样就能知道程序 扫描的进度。 系统必须提供的服务是功能需求的基本,本着站在用户角度思考的原则,做出如 上叙述需求,从简列举如下: 扫描功能; 地址选择功能; 端口选择功能; 进度显示功能; 端口扫描程序功能模块如下图所示: 端口扫描系统 操作显示 设 置 地 址 设 置 端 口 设 置 协 议 开 始 扫 描 进 度 显 示 结 果 显 示 3 程序运行流程图: 开始 开始扫描 设置扫描参数(IP、端口、协议) 读入用户设置的 IP、端口号、协议 nowAddr=StartAddr i=0 初始化进度条 进行 TCP 扫 描 nowAddr=EndAddr i+ ih_addr_listi); 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; 5 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 地址地址 通过判断选择的哪个 Radio Button 的值,来选择从对应的 IP Address 控件中读 入用户输入的值,若是单个的 IP 则将开始地址 StartAddr 和结束地址 EndAddr 都赋值 为 IP Address 控件的值;若是 IP 范围,则第一个 IP 地址赋值给 StartAddr,最后一 个 IP 地址赋值给 EndAddr。 void CPortScanDlg:setAddr(DWORD m_conf_IP.m_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获取待扫描的端口号获取待扫描的端口号 首先读入用户设置的允许的最大线程数。再通过判断选择的哪个 Radio Button 的 6 值,来选择从对应的 Edit Box 控件中读入用户输入的值。若是指定的端口号,则循环 读入 Edit Box 中的端口号 (一个端口号占用一行,一次读入一行),每行的字符不超 过 9 字符,再在读入的每行字符的末尾添加字符串结束标记 0 ,再通过 atoi()函 数把字符型转换为整型,存放在定义的数组结构中,并保存端口号的总个数。若是端 口范围,则第一个端口号的值和最后一个端口号的值分别读入存放在定义的结构体中。 void CPortScanDlg:setPort(tag_PORTS *pScanParam,int switch(m_conf_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; default: break; 7 3.4.13.4.1 指定端口号的初始化指定端口号的初始化 首先试着读取 DefaultPorts.txt 文件中保存的端口号,若读入成功,则显示该文 本文档中保存的值;若该文件不存在或读入异常,则显示默认设置的值。 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(s); f.Close(); catch(.) CString s = 13rn37rn123rn135rn139rn489rn1002; GetDlgItem(IDC_EDIT_DesignPort)-SetWindowText(s); 3.4.23.4.2 指定端口号的保存指定端口号的保存 在运行端口扫描时会将指定端口保存进文本文档 DefaultPorts.txt 中,若此文件 不存在,则创建此文件。 void conf_Port:SaveDefaultPorts() CStdioFile f(DefaultPorts.txt, CFile:modeCreate|CFile:modeWrite|CFile:typeText); char buff10; for(int i=0; im_DesignPort.GetLineCount(); i+) int len = m_DesignPort.GetLine(i, buff, 9); if (len != 0) 8 bufflen = 0; f.WriteString(buff); f.WriteString(rn); f.Close(); 3.5TCP connect() 扫描扫描 这是最基本的 TCP 扫描。操作系统提供的 connect()系统调用,用来与每一个感兴 趣的目标计算机的端口进行连接。如果端口处于侦听状态,那么 connect()就能成功。 否则,这个端口是不能用的,即没有提供服务。这个技术的一个最大的优点是,你不 需要任何权限。系统中的任何用户都有权利使用这个调用。另一个好处就是速度。如 果对每个目标端口以线性的方式,使用单独的 connect()调用,那么将会花费相当长的 时间,你可以通过同时打开多个套接字,从而加速扫描。使用非阻塞 I/O 允许你设置 一个低的时间用尽周期,同时观察多个套接字。但这种方法的缺点是很容易被发觉, 并且被过滤掉。目标计算机的 logs 文件会显示一连串的连接和连接是出错的服务消息, 并且能很快的使它关闭。 3.5.13.5.1 基本原理基本原理 调用 connect()函数,根据返回值来判断端口是否打开的,connect()函数返回 0 说明建立连接成功,说明该端口是打开的,就将该端口保存进静态字符串变量中,然 后关闭连接,则线程数减一。RunThreadNum 是用来控制最大线程数量的。 UINT CPortScanDlg:DoScanPort_TCP(LPVOID lp) ret=connect(sock,(struct sockaddr*) if(ret=0) str.Format(%d,ntohs(sin.sin_port); showout_tcp+=str+|; closesocket(sock); RunThreadNum-; 9 3.5.23.5.2 扫描多个主机多端口多线程的实现扫描多个主机多端口多线程的实现 扫描多个主机是使用 for 循环来实现逐个扫描的,多端口也是使用 for 循环来实 现逐个扫描的。最大线程数量是通过变量 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, CloseHandle(hThreadTcp); Sleep(10); . 3.5.33.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,ProtocolTCP,strOpen); temp+; intRow+; 10 4 4测试报告测试报告 4.1TCP 扫描检测扫描检测 4.1.14.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)的扫描结果: 11 (2)IP 设置为 127.0.0.1 的扫描结果: 设置为扫描本地 IP 和设置为扫描 127.0.0.1 时扫描结果会有差别:扫描 127.0.0.1 时扫描不出端口 139,具体原因还不清楚。 4.1.24.1.2 扫描网络中其他主机扫描网络中其他主机 经过 ping 命令发现百度 IP 为 119.75.218.70 的主机能 ping 通 1.设置 IP 12 2.端口设置为 0-1024 扫描结果如下: 由扫描结果可知能正常扫描,能正确扫描出能进行 TCP 连接的端口 13 结结 论论 本设计经过近 1 周的努力,基本满足了一个端口扫描程序的基本要求。完成后的 程序实现了 TCP connect()扫描功能,TCP 扫描支持多线程,能大大加快扫描

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论