您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > 简单端口器的设计与实现
简单端口扫描器的设计与实现曹水根目录设计原理总体设计3任务与目标12详细设计45系统测试与改进任务与目标一、任务目标(1)、掌握端口扫描技术的基本原理。(2)、设计并实现一个简单的端口扫描器。(3)、进一步熟悉C语言或其他程序设计语言。二、设计原理扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法可以搜集到很多关于目标主机的各种有用的信息,例如远程系统是否支持匿名登录、是否存在可写的FTP目录、是否开发TELNET服务和HTTPD服务等。二、设计原理2.1、TCPconnect扫描这是最基本的TCP扫描方式,其原理是直接使用系统提供的连接函数完成完整的三次握手。连接函数在几乎具有支持网络编程的编程语言里都能找到,在WindowsSocket2中是connect函数,在CSocket类中是该类的Connect方法。优缺点:这项扫描技术的优点是:不需要关注三次握手的细节,并且该函数对于使用用户的权限没有太多的限制。它的缺点是安全性差,很容易被对方发觉,或者被对方的防火墙过滤掉。目标主机的日志文件也会记录下这一连串的连接和连接出错的服务消息,并被反向查出来。二、设计原理1、TCPconnect端口扫描服务端与客户端建立连接成功的过程:①Client端发送SYN;②Server端返回SYN/ACK,表明端口开放;③Client端返回ACK,表明连接已建立;④Client端主动断开连接。2、TCPconnect端口扫描服务端与客户端未建立连接成功(目标端口关闭)过程:①Client端发送SYN;②Server端返回RST/ACK,表明端口未开放。二、设计原理2.2、TCPSYN扫描TCPSYN扫描又称“半开扫描”。回顾TCP连接的三次握手,申请方首先发送的是一个SYN数据包,服务方在接到这个SYN数据包后,如果该端口处于侦听状态,则会回复一个SYN|ACK的数据包。如果该端口没有处于侦听状态,则会回复一个RST的数据包。而此时如果对方处于侦听状态,申请方还需要再向对方回复一个ACK数据包以示建立连接。此时对方就认为连接建立,并记入日志。这种扫描技术的优点在于一般不会在目标计算机上留下记录,有时即使在用netstat命令也显示不出来;但这种方法的一个缺点是必须要有管理员权限才能建立自己的SYN数据包。二、设计原理端口开放:1、Client发送SYN;2、Server端发送SYN/ACK3、Client发送RST断开(只需要前两步就可以判断端口开放);端口关闭:1、Client发送SYN;2、Server端回复RST(表示端口关闭);二、设计原理2.3、TCPFIN扫描TCPFIN扫描也和TCPSYN扫描原理差不多,当申请方主机向目标主机一个端口发送的TCP标志位FIN置位的数据包,如果目标主机该端口是“关”状态,则返回一个TCPRST数据包;否则不回复。根据这一原理可以判断对方端口是处于“开”还是“关”状态。这种方法的缺点是,该原理不是协议规定,因而与具体的协议系统实现有一定的关系,因为有些系统在实现的时候,不管端口是处于“开”还是“关”状态,都会回复RST数据包,从而导致此方法失效。不过,二、设计原理2.4TCP反向Ident扫描Ident(IdentificationProtocol,标识协议)提供了一种方法,可以对建立TCP连接的用户身份进行标识,该协议使用113端口,一旦建立连接,该服务就会读取指定TCP连接的查询数据,将拥有指定TCP连接的用户信息反馈给对方。Ident协议(RFC1413)允许通过TCP连接查询对方的任何进程的用户名,即使这个连接不是由该进程开始的。根据这一原理,扫描程序可以通过TCP连接到对方的端口(默认的80),然后通过Ident协议判断对方是否正以管理员权限运行。这种方法的缺点是只能在和目标端口建立了一个完整的TCP连接后才能看到。2.4、ip分段扫描它并不是直接发送TCP探测数据包,是将数据包分成两个较小的IP段。这样就将一个TCP头分成好几个数据包,从而过滤器就很难探测到。三、总体设计3.1系统主要目标本程序主要实现了:简易的TCPconnect()扫描,支持多线程;UDP扫描功能;能对单个指定的主机进行扫描或扫描指定网段内的主机;能扫描特定的部分端口号或对指定的端口段内的端口进行逐个扫描;3.2开发环境及工具测试平台:win7使用软件:eclipse开发语言:java语言三、总体设计3.3功能模块与系统结构(1)、单个指定的主机进行扫描或扫描指定网段内的主机;(2)、扫描特定的部分端口号或对指定的端口段内的端口进行逐个扫描;(3)、对指定ip段进行扫描;端口扫描系统操作显示设置地址设置端口开始扫描显示结果三、总体设计开始设置扫描的参数(IP、端口)判读端口号和IP是否合法是设置要扫描端口的初始值和结束值newSocket(address,nport);isConnected()显示打开的端口号是显示关闭的端口号否结束否开始设置扫描的参数(IP)判读IP是否合法是设置要扫描IP的初始值和结束值newSocket(address,nport);e.toString().endsWith(java.net.ConnectException:Connectiontimedout:connect)显示IP地址的主机不存在是显示IP地址的主机存在否结束否指定端口段的扫描指定ip段的扫描四、详细设计4.1、获取待扫描的端口通过eclipse的runconfigurate设置要扫描端口段,将端口段由String类型转化为int类型数据,判断端口号是否合法。端口号只能是1~65535范围内的值而且第一个输入的端口小于第二个输入的端口号。4.2、获取待扫描的IP地址通过eclipse的runconfigurate设置ip地址,然后读取第一个参数,然后判断IP地址是否合法。通过InetAddress.getByName(ip)方法判断IP地址是否是合法的IP地址。四、详细设计4.3、指定端口段的扫描4.3.1基本原理调用connect()函数,根据返回值来判断端口是否打开的,isConnected()函数返回1说明建立连接成功,说明该端口是打开的,否则说明是端口是关闭的,同时会对常用的网络服务端口给出提示。Sockets=newSocket(address,nport);//建立连接if(s.isConnected()){result.add(端口号:+nport+typeport+open);}s.close();//将打开的端口添加到ArrayListresult里面}catch(IOExceptione){System.out.println(e.toString());result.add(端口号:+nport+typeport+close);}}四、详细设计4.3.2扫描结果的显示使用ArrayList存储扫描端口后的状态,然后用ArrayList的ListIterator一条一条端口状态读出来,显示到屏幕上。ListIteratorli=result.listIterator();//获得ArrayList的ListIteratorwhile(li.hasNext()){//如果li里面有元素System.out.println(li.next().toString());//打印出指向的元素,同时将指向下一个元素}四、详细设计4.4、指定ip段的扫描操作系统提供的connect()系统调用,用来与每一个感兴趣的指定计算机的IP段进行连接。如果指定IP段的计算机存在,那么connect()就能成功。否则,这个IP是不能用的,即IP不存在。4.4.1基本原理首先得到指定IP段的开始值和结束值,然后判断IP地址是否合法,然后使用socket()函数创建套接字,如果抛出异常且异常是java.net.ConnectException:Connectiontimedout:connect开始的值,则不存在这个IP地址的主机,否则存在这个IP地址的主机。五、系统测试与改进5.1、指定端口段的测试1、设置指定的端口段。指定扫描主机10.28.21的79到82的端口。2、扫描结果如下:五、系统测试与改进5.2、指定IP段的测试1、设置指定IP段。指定扫描10.28.23.178到10.28.23.182段的ip。2、扫描结果如下:Thanks!
本文标题:简单端口器的设计与实现
链接地址:https://www.777doc.com/doc-2096032 .html