计算机网络课程设计--简单的端口扫描器.docx
课程设计报告20142015学年第一学期课程名称计算机网络设计题目简单的端口扫描器目录-.设计目的3二 .设计要求3三 .端口扫描器的研究33.1 TCP协议介绍33.2 UDP协议介绍33.3 SOCKET介绍43.4 常见端口介绍53.5 端口扫描器的功能简介53.6 常用端口扫描技术6四 .设计实现71 .设计环境72 .程序流程图83 .主要算法104 .主要数据结构及主要函数说明11五 .运行结果121 .扫描本地主机端口122 .扫描外部主机端口13六 .参考资料13一.设计目的1 .理解客户机-服务器与端口扫描的工作原理,实现对目标主机端口扫描的功能,即发现目标主机开启的端口信息。2 .加深对TCP/IP的理解,熟悉SoCket编程。二.设计要求LWindoWS环境下,程序在单机上运行;3 .使用端口扫描对一台主机进行扫描,并显示出结果;对一个网段进行IP扫描,显示出结果;4 .提供友好的用户界面。三.端口扫描器的研究4.1 TCP协议介绍提到端口扫描技术就不可不提及TCP协议了,作为互联网的核心协议,TCP协议的重要性是人人皆知,端口扫描主要是建立在TCP协议基础上的一门技术。TCP协议是一种面向连接的,可靠的传输协议。一次正常的TCP传输需要通过在客户和服务器之间建立特定的虚电路连接来完成,这个过程通常被称为“三次握手二TCP通过数据分段中的序列号保证所有的传输数据可以在远端按照正常的次序重组,而通过确认保证数据传输的完整性。三次握手过程:1 .客户端发送一个TCP包(SYN请求)给服务端,其中标记SYN(同步序号)要打开。SYN请求指明了客户端希望连接的服务器端口号和客户端的ISN02 .服务器端发回应答,包含自己的SYN信息ISN和对客户端的SYN应答,应答时返回下一个希望得到的字节序号。3 .客户端从对S服务器端来的SYN进行应答,数据发行开始。4.2 UDP协议介绍UDP,用户数据报协议。UDP为应用程序提供了一种方法来发送经过封装的IP数据报,而且不必建立连接就可以发送这些IP数据报。UDP传输的数据段是由8个字节的头和净荷域构成的。两个端口分别被用来标示出源机器和目标机器内部的端点。当一个UDP分组到来的时候,它的净荷部分被递交给与目标端口相关联的那个进程。当目标端口必须将一个应答送会给源端口的时候,源端口是必须的。发送应答的进程只要将进来的数据段中的源端口域复制到输出的数据段中的目标端域,就可以指定在发送机器上有哪个进程来接受应答。UDP的长度包含了8字节的头和数据部分。UDP校验和是可选的,如果不计算的话,则在该域中存放0.如果真正计算结果试的话,则该域中存放的全是I,除非数据的质量并不重要,否则就不应该将校验和的功能关闭。另外值得明确提出来的是UDP没有做到的一些事情。UDP并不考虑流控制,在收到一个坏的数据段之后它也不重传。所有这些工作都留给用户的进程。UDP所做的事情是提供一个接口,并且在接口中增加解复用的特性。它利用端口的概念将数据段解复用到多个进程中,这就是他所做的全部工作。4.3 SOCKET介绍所谓SOCket通常也称作套接字,用于描述IP地址和端口,是一个通信链的句柄。应用程序通常通过套接字向网络发出请求或者应答网络请求。SOCkCt接口是TCP/IP网络的API,SoCkCt接口定义了许多函数或例程,程序员可以用它们来开发TCP/IP网络上的应用程序。要学Internet上的TCP/IP网络编程,必须理解SOCket接口。SoCket接口设计者最先是将接口放在UniX操作系统里面的。如果了解IJniX系统的输入和输出的话,就很容易了解SOCket了。网络的SOCkCt数据传输是一种特殊的1/0,SOCket也是一种文件描述符。SOCket也具有一个类似于打开文件的函数调用SOCkCt(),该函数返回一个整型的SOCket描述符,随后的连接建立、数据传输等操作都是通过该SoCket实现的。常用的SoCket类型有两种:流式SoCket(SOCK_STREAM)和数据报式SOCket(SOCK_DGRAM)。流式是一种面向连接的SOCkCt,针对于面向连接的TCP服务应用;数据报式SoCket是一种无连接的SOCket,对应于无连接的UDP服务应用。最重要的是,socket是面向客户/服务器模型而设计的,针对客户和服务器程序提供不同的SOCket系统调用。客户随机申请一个SoCket(相当于一个想打电话的人可以在任何一台入网电话上拨号呼叫),系统为之分配一个SoCket号;服务器拥有全局公认的s。Cket,任何客户都可以向它发出连接请求和信息请求(相当于一个被呼叫的电话拥有一个呼叫方知道的电话号码)。socket利用客户/服务器模式巧妙地解决了进程之间建立通信连接的问题。服务器SoCket半相关为全局所公认非常重要。不妨考虑一下,两个完全随机的用户进程之间如何建立通信?假如通信双方没有任何一方的SOCket固定,就好比打电话的双方彼此不知道对方的电话号码,要通话是不可能的。4.4 常见端口介绍端口:21服务:FTP说明:FTP服务器所开放的端口,用于上传、下载。最常见的攻击者用于寻找打开anonymous的FTP服务器的方法。这些服务器带有可读写的目录。木马DolyTrojan>Fore>InViSibleFTP、WCbEx、WineraSh和BladeRUnnCr所开放的端口。端口:23服务:Telnet说明:远程登录,入侵者在搜索远程登录UNIX的服务。大多数情况下扫描这一端口是为了找到机器运行的*作系统。还有使用其他技术,入侵者也会找到密码。木马TinyTelnetSerVer就开放这个端口端口:25服务:SMTP说明:SMTP服务器所开放的端口,用于发送邮件。入侵者寻找SMTP服务器是为了传递他们的SPAM。入侵者的帐户被关闭,他们需要连接到高带宽的E-MAIL服务器上,将简单的信息传递到不同的地址。木马AntigCn、EmailPasswordSender>HaebuCoceda>ShtrilitzStCaIth、WinPC、WinSPy都开放这个端口端口:80服务:HTTP说明:用于网页浏览。木马EXCCUtor开放此端口。4.5 端口扫描器的功能简介服务器上所开放的端口就是潜在的通信通道,也就是一个入侵通道。对目标计算机进行端口扫描,能得到许多有用的信息,进行端口扫描的方法很多,可以是手工进行扫描、也可以用端口扫描软件进行。扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法可以搜集到很多关于目标主机的各种有用的信息,例如远程系统是否支持匿名登陆、是否存在可写的FTP目录、是否开放TELNET服务和HnPD服务等。4.6 常用端口扫描技术1、TCPConneCt()扫描:这是最基本的TCP扫描,操作系统提供的COnneCt()系统调用可以用来与每一个感兴趣的目标计算机的端口进行连接。如果端口处于侦听状态,那么COnneCt()就能成功。否则,这个端口是不能用的,即没有提供服务。这个技术的一个最大的优点是,你不需要任何权限。系统中的任何用户都有权利使用这个调用。另一个好处就是速度,如果对每个目标端口以线性的方式,使用单独的COrmeCt()调用,那么将会花费相当长的时间,使用者可以通过同时打开多个套接字来加速扫描。使用非阻塞I/O允许你设置一个低的时间用尽周期,同时观察多个套接字。但这种方法的缺点是很容易被察觉,并且被防火墙将扫描信息包过滤掉。目标计算机的logs文件会显示一连串的连接和连接出错消息,并且能很快使它关闭。2、TCPSYN扫描:这种技术通常认为是“半开放”扫描,这是因为扫描程序不必要打开一个完全的TCP连接。扫描程序发送的是一个SYN数据包,好象准备打开一个实际的连接并等待反应一样(参考TCP的三次握手建立一个TCP连接的过程)。一个SYNlACK的返回信息表示端口处于侦听状态:返回RST表示端口没有处于侦听态。如果收到一个SYNlACK,则扫描程序必须再发送一个RST信号,来关闭这个连接过程。这种扫描技术的优点在于一般不会在目标计算机上留下记录,但这种方法的缺点是必须要有root权限才能建立自己的SYN数据包。3、TCPFIN扫描:SYN扫描虽然是“半开放”方式扫描,但在某些时候也不能完全隐藏扫描者的动作,防火墙和包过滤器会对管理员指定的端口进行监视,有的程序能检测到这些扫描。相反,FIN数据包在扫描过程中却不会遇到过多问题,这种扫描方法的思想是关闭的端口会用适当的RST来回复FIN数据包。另一方面,打开的端口会忽略对FIN数据包的回复。这种方法和系统的实现有一定的关系,有的系统不管端口是否打开都会回复RST,在这种情况下此种扫描就不适用了。另外这种扫描方法可以非常容易的区分服务器是运行UniX系统还是NT系统。4、IP段扫描:这种扫描方式并不是新技术,它并不是直接发送TCP探测数据包,而是将数据包分成两个较小的IP段。这样就将一个TCP头分成好几个数据包,从而过滤器就很难探测到。但必须小心:一些程序在处理这些小数据包时会有些麻烦。5、TCP反向ident扫描:ident协议允许(rfcl413)看到通过TCP连接的任何进程的拥有者的用户名,即使这个连接不是由这个进程开始的。例如扫描者可以连接到http端口,然后用identd来发现服务器是否正在以root权限运行。这种方法只能在和目标端口建立了一个完整的TCP连接后才能看到。6、FTP返回攻击:FTP协议的一个有趣的特点是它支持代理(ProXy)FTP连接,即入侵者可以从自己的计算机self.Com和目标主机target.COm的FTPSerVeLPI(协议解释器)连接,建立一个控制通信连接。然后请求这个SerVeLPI激活一个有效的SerVeLDTP(数据传输进程)来给Internet上任何地方发送文件。对于一个User-DTP,尽管RFC明确地定义请求一个服务器发送文件到另一个服务器是可以的,但现在这个方法并不是非常有效。这个协议的缺点是“能用来发送不能跟踪的邮件和新闻,给许多服务器造成打击,用尽磁盘,企图越过防火墙”。四.设计实现1 .设计环境MicrosoftWindows是广泛应用的多任务、单用户和图形化用户界面的计算机操作系统,在WindOWS平台上进行软件开发已成为程序设计的主流。VisualC+作为一个功能非常强大的可视化应用程序开发工具,是计算机界公认的最优秀的应用程序开发工具之一。利用VisualC+开发面向对象WindoWS应用程序有两种主要方法:一种是使用WindoWS提供的WindoWSAPI(ApplicationProgrammingInterface,应用程序接口)函数,另一种是利用MiCrOSOft提供的MFC(MiCrOSOftFOUndatiOnClass,微软基础类库)类库。其中,WindowsAPI是WindOWS系统和应用程序间的标准接口,为应用程序提供WindoWS支持的函数定义、参数定义和息格式等。而MFC类库包括用来开发C+应用程序和WindoWS应用程序的一组类,这些类用来表示窗口、对话框、设备上下文、公共GDl对象如画笔、调色板、控制框和其他标准的Windows部件,封装了大部分的WindOWSAPl函数。MFC还封装了重要的WindoWS扩展,如COM、ActiveX、ODBC和InternetAPIs,为这些难以编程实现的功能提供了简便实现方法。使用MFa可以大大简化WindoWS编程工作,同时,MFC支持对底层APl的直接调用。使用MFC编写WindOWS应用程序也称为标准WindOwS程序设计。因此,我们利用MFC中的各种类结合起来构成了一个端口扫描器的应用程序框架,然后在此基础上来开发WindoWS应用程序用于扫描端口达到了解端口状态的目的。总体上,MFC框架定义了应用程序的轮廓,并提供了用户接口的标准实现方法,我们所要做的就是通过预定义的接口把具体应用程序特有的东西填入这个轮廓。ViSUalC+提供了相应的工具来完成这个工作:AppWizard可以用来生成初步的框架文件(代码和资源等),资源编辑器用于直观地设计用户界面,ClassWizard用来协助程序员添加代码到框架文件中,最后进行编译,通过类库实现应用程序特定的逻辑。2 .程序流程图开始扫描3 .主要算法(1)测试主机某个端口是否打开的函数TeStCOnneCtion():BOOLCMyDlg:ITestConnection(CStringIP,UINTnPort)CSocket*pSocket;pSocket=newCSocket;ASSERT(pSocket);if(!pSocket->CreateO)deletepSocket;PSocket=NULL;returnfalse;while(!pSocket->Connect(IP,nPort)deletepSocket;PSocket=NULL;returnfalse;)pSocket->Close();deletepSocket;returntrue;)(2)响应单选按钮“扫描单个端口”和“扫描多个端口”的单击消息:voidCMyDlg:IOnRadiolSingleOm_bSinglePort=true;IiicSinglePort.EnableWindowO;m_cPortFrom.Enab1eWindow(false);mcPortTo.EnabIeWindow(false);mcBtnStop.EnableWindow(False);)voidCMyDlg:OnRadio2Range()mbSinglePort=false;m_cSinglePort.Enab1eWindow(false);mcPortFrom.EnableWindowO;mcPortTo.EnableWindowO;mcBtnStop.EnabIeWindow(faIse);(3)显示列表框标题栏的成员函数:增加列表框标题栏的某一列BOOLCMyDlg:AcldColumn(LPCTSTRstritem,intnltem,intnSubltem,intnMask,intnFmt)LV_COLUMNIvc;lvc.mask=nMask;lvc.fmt=nFmt;lvc.PszText=(LPTSTR)strltem;lvc.cx=m_cResult.GetStringWidth(lvc.pszText)+25;if(nMask&LVCF.SUBITEM)if(nSubItem!=-l)lvc.iSubItem=nSubItem;elselvc.iSubItem=nItem;)returnmcResult.InsertColumn(nltem,&lvc);)在列表框中加一条BOOLCMyDlg:AddItem(intnltem,intnSubltem,LPCTSTRstritem,intnImageIndex)LV_ITEMIvItem;IvItem.mask=LVIFJTEXT;IvItem.iltem=nltem;IvItem.iSub11em=nSubItem;IvItem.pszText=(LPTSTR)stritem;if(nlmagelndex!=-l)IvItem.mask=LVIF_INlAGE;IvItem.iImage=LVIF_IMAGE;)if(nSubItem=O)returnmcResult.InsertItem(&lvltem);returnmcResult.SetItem(&lvltern);)加一列标题栏字符voidCMyDlg:AddHeader(LPTSTRhdr)if(m_pColumns)mpColumns->AddTail(hdr);)显示列表框标题栏voidCMyDlg:ShowHeaders()intnlndex=;POSITIONpos=mpColumns->GetHeadPosition();while(pos)CStringhdr=(CString)mpColumns->GetNext(pos);AddColumn(hdr,nlndcx+);)(4)“扫描”,“停止”,“保存”按钮,见附录程序。4.主要数据结构及主要函数说明(1)测试主机某个端口是否打开TestConnection函数;(2)"扫描结果"标题栏成员函数AddHeader,AddColumn,ShowHeaders;在列表框中添加字符串的函数一一Additem;(3)扫描单个或多个端口的单选按钮OnRadioSingleO和OnRadioRangeO;(4)“扫描”,“停止”,“保存”按钮OnButtonlStartO,0nButton2Stop(),OnButtonBSaveO;五.运行结果1 .扫描本地主机端口2 .扫描外部主机端口六.参考资料1 .VisualC+6.O网络编程技术雷斌人民邮电出版社2000年2 .MFC编程技巧与范例详解曾凡锋,苗雨清华大学出版社2008年3 .计算机网络-自顶向下方法JamesF.KuroseKeithW.Ross机械工业出版社2008年