端口扫描程序的设计与实现.doc_第1页
端口扫描程序的设计与实现.doc_第2页
端口扫描程序的设计与实现.doc_第3页
端口扫描程序的设计与实现.doc_第4页
端口扫描程序的设计与实现.doc_第5页
免费预览已结束,剩余14页可下载查看

下载本文档

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

文档简介

端口扫描程序的设计与实现端口扫描程序的设计与实现 摘摘 要要 计算机信息网络的发展加速了信息化时代的进程 但是随着社会网络化程度的增 加 对计算机网络的依赖也越来越大 网络安全问题也日益明显 端口扫描技术是发 现安全问题的重要手段之一 本程序是在 Windows 系统中使用 C 语言用 MFC 完成的一个端口扫描程序 此程序 主要完成了 TCP connect 扫描和 UDP 扫描功能 TCP 扫描支持多线程 能对单个指定 的主机进行扫描或对指定网段内的主机进行逐个扫描 能扫描特定的部分端口号或对 指定的端口段内的端口进行逐个扫描 此端口扫描程序能快速地进行 TCP 扫描 准确 地检测出对 TCP 协议开放的端口 而对于 UDP 扫描只支持单线程 速度较慢 扫描结 果以列表的形式直观地展现出来 关键词 关键词 端口扫描 TCP 扫描 UDP 扫描 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 3 6UDP 扫描 10 3 6 1 基本原理 10 3 6 2 计算效验和 11 3 6 3 发送 UDP 数据包 11 3 6 4 接收 ICMP 数据包 12 4测试报告测试报告 12 4 1TCP 扫描检测 12 4 1 1 扫描本机 12 4 1 2 扫描网络中其他主机 13 4 1 3 扫描 IP 段 13 4 2UDP 扫描检测 14 4 2 1 扫描本机 14 4 1 2 扫描网络中其他主机 15 4 3TCP UDP 一起扫描 16 结结 论论 17 参考文献参考文献 17 第 0 页 共 17 页 1 1引言引言 1 1 课题的背景课题的背景及意义及意义 网络中每台计算机犹如一座城堡 这些城堡中 有些是对外完全开放的 有些却 是大门紧闭的 入侵者们是如何找到 并打开它们的城门呢 这些城门究竟通向何处 在网络中 把这些城堡的 城门 称之为计算机的 端口 端口扫描是入侵者搜 索信息的几种常用方法之一 也正是这一种方法最容易暴露入侵者的身份和意图 一 般说来 扫描端口有以下目的 判断目标主机上开放了哪些服务 判断目标主机的操作系统 如果入侵者掌握了目标主机开放了哪些服务 运行何种操作系统 他们就能使用 相应的手段实现入侵 而如果管理员先掌握了这些端口服务的安全漏洞 就能采取有 效的安全措施 防范相应的入侵 1 2 端口扫描现状端口扫描现状 计算机信息网络的发展加速了信息化时代的进程 但是随着社会网络化程度的增 加 对计算机网络的依赖也越来越大 网络安全问题也日益明显 端口扫描技术是发 现安全问题的重要手段之一 一个端口就是一个潜在的通信通道 也就是一个入侵通 道 对目标计算机进行端口扫描 能得到许多有用的信息 扫描器通过选用远程 TCP IP 不同的端口的服务 并记录目标给予的回答 通过这种方法 可以搜集到很多 关于目标主机的各种有用的信息 从而发现目标机的某些内在的弱点 2 2系统设计系统设计 2 1 系统主要目标系统主要目标 本程序主要实现了 简易的 TCP connect 扫描 支持多线程 UDP 扫描功能 能对单个指定的主机进行扫描或扫描指定网段内的主机 能扫描特定的部分端口号或对指定的端口段内的端口进行逐个扫描 2 2 开发环境及工具开发环境及工具 测试平台 Windows XP Professional 使用软件 Visual C 6 0 开发语言 C 语言 第 1 页 共 17 页 2 3 功能模块与系统结构功能模块与系统结构 作为端口扫描程序 首先需要完成的功能就是对于系统操作系统的服务端口进行 扫描 返回扫描结果 对于端口的扫描 包括对于本机系统服务端口 局域网内目标 机系统 以及远程 IP 的系统服务端口进行扫描 有些时候 用户并不需要去扫描整个系统的所有端口 因为这样的话不仅会浪费 大量的时间 而且可能导致难以找到自己需要了解的端口的扫描结果 所以 对于选 择性地对端口进行扫描也非常重要 这当然也是扫描程序需要实现的功能之一 用户在等待扫描的时候 往往希望知道它的工作进度 这样用户可以更好地控制 自己的操作 站在用户的角度思考 设置进度是程序需要完成的 这样就能知道程序 扫描的进度 系统必须提供的服务是功能需求的基本 本着站在用户角度思考的原则 做出如 上叙述需求 从简列举如下 扫描功能 地址选择功能 端口选择功能 进度显示功能 端口扫描程序功能模块如下图所示 端口扫描系统 操作显示 设 置 地 址 设 置 端 口 设 置 协 议 开 始 扫 描 进 度 显 示 结 果 显 示 第 2 页 共 17 页 程序运行流程图 开始 开始扫描 设置扫描参数 IP 端口 协议 读入用户设置的 IP 端口号 协议 nowAddr StartAddr i 0 初始化进度条 进行 TCP 扫 描 nowAddr EndAddr i i totalPort 进行 UDP 扫描 显示打开端口 AfxBeginThread DoS canPort TCP i 对每一个 IP 地址进行处理 pszAddr inet ntoa struct in 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 第 4 页 共 17 页 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 的 第 5 页 共 17 页 值 来选择从对应的 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 buff 10 for int i 0 inArrOfPorts nCount 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 第 6 页 共 17 页 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 r n GetDlgItem IDC EDIT DesignPort SetWindowText s f Close catch CString s 13 r n37 r n123 r n135 r n139 r n489 r n1002 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 buff 10 for int i 0 i m DesignPort GetLineCount i int len m DesignPort GetLine i buff 9 if len 0 第 7 页 共 17 页 buff len 0 f WriteString buff f WriteString r n 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 第 8 页 共 17 页 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 temp 1 cksum buffer size sizeof USHORT if size cksum UCHAR buffer cksum cksum 16 cksum cksum cksum 16 return USHORT cksum 3 6 33 6 3 发送发送 UDPUDP 数据包数据包 先调用 WSASocket 函数创建 sock 套接字 再调用setsockopt 函数设置套接字选 项 再将 UDP IP 头部填充好 最后调用 sendto 函数将构造的数据包发送到目的IP 地址 的扫描的端口 USHORT CPortScanDlg Send UDPinfo UINT S ADR UINT D ADR USHORT DF SPT USHORT SCAN DPT if sock WSASocket AF INET SOCK RAW IPPROTO IP NULL 0 WSA FLAG OVERLAPPED INVALID SOCKET if Check Ret setsockopt sock IPPROTO IP IP HDRINCL char closesocket sock return 0 第 11 页 共 17 页 3 6 43 6 4 接收接收 ICMPICMP 数据包数据包 首先定义一个套接字集合 并将其清空 再把读数据的套节字加入到套接字集合 中 再通过 select 函数检查套节字是否可读 1 如果没有则返回 1 给主调函数 表示没有收到返回的 ICMP PORT UNREACH 错误 数据报 则说明该端口是打开的 2 如果有可读的套接字 就再通过 FD ISSET 函数检查需要读取的套接字是否在 可读的套接字集合中 1 如果可读的套接字中没有需要读取的套接字 则返回 1 给主调函数 表示没有 收到返回的 ICMP PORT UNREACH 错误数据报 则说明该端口是打开的 2 如果可读的套接字中有需要读取的套接字 则调用 recvfrom 函数从套接口上 接收数据 如果没有数据 则说明该套接口不是用来传送数据的 则可以判断为返回 的 ICMP PORT UNREACH 错误数据报 则说明该端口是关闭的 USHORT CPortScanDlg Get ICMPinfo UINT ICMP SOCK LPSOCKADDR IN SOURCE ADDRESS FD ZERO FD SET ICMP SOCK if RECV MSG select ICMP SOCK if RECV MSG 0 return 0 return 1 第 12 页 共 17 页 4 4测试报告测试报告 4 1TCP 扫描检测扫描检测 4 1 14 1 1 扫描本机扫描本机 1 IP 设置 1 IP 设置为本地 IP 10 15 66 158 2 IP 设置为 127 0 0 1 2 端口设置为 0 1024 最大线程数设置为 100 协议选择 TCP 3 扫描结果 1 IP 设置为本地 IP 10 15 66 158 的扫描结果 2 IP 设置为 127 0 0 1 的扫描结果 设置为扫描本地 IP 和设置为扫描 127 0 0 1 时扫描结果会有差别 扫描 127 0 0 1 时扫描不出端口 139 具体原因还不清楚 4 1 24 1 2 扫描网络中其他主机扫描网络中其他主机 1 设置 IP 经过 ping 命令发现 IP 为 10 15 66 44 的主机能 ping 通 2 端口设置为 0 1024 最大线程数设置为 100 协议选择 TCP 扫描结果如下 由扫描结果可知能正常扫描 能正确扫描出能进行 TCP 连接的端口 第 13 页 共 17 页 4 1 34 1 3 扫描扫描 IPIP 段段 1 设置 IP 2 端口设置为扫描指定端口 最大线程数设置为 100 协议选择 TCP 3 扫描结果 由扫描结果可知能正常扫描 但由于没有先判断主机是否在线 所以对不在线的 主机也发送了连接请求 导致扫描速度较慢 第 14 页 共 17 页 4 2UDP 扫描检测扫描检测 4 2 14 2 1 扫描本机扫描本机 1 IP 设置 1 IP 设置为本地 IP 10 15 66 158 2 IP 设置为 127 0 0 1 2 由于是单线程 扫描速度较慢 端口设置为扫描指定端口 协议选择 UDP 3 扫描结果 IP 设置为本地 IP 10 15 66 138 的扫描结果和 IP 设置为 127 0 0 1 的扫描结 果相同 用 UDP 协议扫描本机的端口 由于收不到发送的 ICMP PORT UNREACH 错误数据报 导致结果误判为所有端口都是打开的 4 1 24 1 2 扫描网络中其他主机扫描网络中其他主机 1 设置 IP 经过 ping 命令发现 IP 为 10 15 66 44 的主机能 ping 通 第 15 页 共 17 页 2 由于单线程 扫描速度较慢 端口设置为扫描指定端口 同扫描本机的设置 协议选择 UDP 3 扫描结果如下 由扫描结果可知能正常扫描 4 3TCP UDP 一起扫描一起扫描 IP 设置为 10 15 66 44 端口设置为指定端口 协议选择 TCP 和 UDP 扫描结果如 下 由扫描结果可知能正常扫描 但由于 TCP 扫描使用多线程速度较快 而 UDP 扫描 则是

温馨提示

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

评论

0/150

提交评论