




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGEPAGE2第页共13页课程设计报告2014—2015学年第一学期课程名称计算机网络设计题目客户端扫描器前言网络中的每一台计算机如同一座城堡,在这些城堡中,有的对外完全开放,有的却是紧锁城门。入侵者们是如何找到,并打开它们的城门的呢?这些城门究竟通向城堡的何处呢?在网络技术中,把这些城堡的“城门”称之为计算机的“端口”。端口扫描是入侵者搜集信息的几种常用手法之一,也正是这一过程最容易使入侵者暴露自己的身份和意图。一般来说,扫描端口有如下目的:
·判断目标主机上开放了哪些服务;
·判断目标主机的操作系统;
如果入侵者掌握了目标主机开放了哪些服务,运行何种操作系统,他们就能够使用相应的手段实现入侵,本课程设计将会通过用JAVA语言实现一个小的端口扫描软件,详细描述端口扫描的原理,分析端口扫描所涉及的问题,以便更加清楚地了解入侵者如何扫描目标主机的端口,同时掌握如何确保本机的安全性,为将来设计更为安全的系统打下牢固基础。目录TOC\o"1-2"\h\z\u一、网络基础知识 31、端口的基本概念 32、端口的分类 3二、端口扫描的基本原理 41、基本原理 42、基于JAVA语言实现的核心代码 4三、端口扫描器视图 51、工作窗口 52、异常窗口 53、窗口核心代码 5四、多线程快速扫描 61、多线程机制 62、多线程核心代码 7五、用户使用方法 81、页面说明 82、按主机名扫描 83、按IP地址扫描 8六、常用端口 8七、异常检测 9结语 12参考文献12一、网络基础知识1、端口的基本概念“端口”在计算机网络领域中是个非常重要的概念。它是专门为计算机通信而设计的,它不是硬件,不同于计算机中的“插槽”,可以说是个“软插槽”。如果有需要的话,一台计算机中可以有上万个端口。端口是由计算机的通信协议TCP/IP协议定义的。其中规定,用IP地址和端口作为套接字,它代表TCP连接的一个连接端,一般称为Socket。具体来说,就是用IP端口来定位一台主机中的进程。可以做这样的比喻,端口相当于两台计算机进程间的大门,可以随便定义,其目的只是为了让两台计算机能够找到对方的进程。计算机就像一座大楼,这个大楼有好多入口(端口),进到不同的入口中就可以找到不同的公司(进程)。如果要和远程主机A的程序通信,那么只要把数据发向A端口就可以实现通信了。可见,端口与进程是一一对应的,如果某个进程正在等待连接,称之为该进程正在监听,那么就会出现与它相对应的端口。由此可见,通过扫描端口,便可以判断出目标计算机有哪些通信进程正在等待连接。2、端口的分类端口是一个16bit的地址,用端口号进行标识不同作用的端口,参见表2-2和表2-3。端口一般分为两类。■熟知端口号:范围从0到1023,这些端口号一般固定分配给一些服务。比如21端口分配给FTP服务,25端口分配给SMTP服务,80端口分配给HTTP服务,135端口分配给RPC服务等等■动态端口号:动态端口的范围从1024到65535,这些端口号一般不固定分配给某个服务,也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。比如8080端口就是分配给第一个向系统发出申请的程序。在关闭程序进程后,就会释放所占用的端口号。二、端口扫描的基本原理1、基本原理端口扫描的原理其实非常简单,只是简单的利用JAVA提供库函数Socket进行调用,与每一个感兴趣的目标计算机的端口进行连接。如果对方端口处于监听状态,那么连接就能成功。否则,这个端口不能用,既没有提供服务。这个技术的一个最大的优点是,不需要任何权限,系统中的任何用户都有权利使用这个调用。引入多线程机制,利用多线程扫描的好处就是速度快,如果对每个目标端口以线性的方式使用单独的连接调用,那么将会花费相当长的时间。多线程同时打开多个套接字,从而加速扫描。在本设计中用户可以自定义线程的个数。此处用户还可以自定义扫描方式。2、基于JAVA语言实现的核心代码 //在多线程的控制下,利用for循环对端口逐一扫描 for(i=XXXXXX;i<XXXXXX;i+=XXXXXX){ try{ theTCPsocket=newSocket(hostAddress,i); theTCPsocket.close(); //判断端口的类别 switch(i){ case21: …… //对相应开放端口识别。 } //将开放端口内容添加到显示区域,并加锁使各处同步关系。 synchronized(ThreadScan.Result){ ThreadScan.Result.append(""+i); ThreadScan.Result.append(":"+porttype+"\n"); } //对相应开放端口和没有开放即连接失败的端口作记录,放入显示区。 catch(IOExceptione){ //同时也对程序加锁防止出现序。 synchronized(ThreadScan.ResultAll){ //将所有端口内容添加到显示区域 ThreadScan.ResultAll.append(""+i); ThreadScan.ResultAll.append(":Closed"+"\n"); } } }三、端口扫描器视图 1、工作窗口这是用JAVA语言实现的一个简单的端口扫描器软件,主页面视图如下: 2、异常窗口当用户操用不当,例如输入的IP地址超过255,或者端口范围大于65535时,用户点击“开始扫描”按钮都会抛出相应的异常,并提示错误原因。如下图示例:3、窗口核心代码 publicclassThreadScan{ publicstaticJFramemain=newJFrame("网络与信息安全课程设计·端口扫描器·刘纪生"); publicstaticvoidmain(String[]args){ Submit.addActionListener(newSubmitAction()); Stop.addActionListener(newStopAction()); Cancel.addActionListener(newCancleAction()); OK.addActionListener(newOKAction()); //实现保存功能 saveItem.addActionListener(newjava.awt.event.ActionListener(){ }); //实现退出功能 exitItem.addActionListener(newjava.awt.event.ActionListener() //实现帮助功能 helpItem.addActionListener(newjava.awt.event.ActionListener(){ saveButton.addActionListener(newjava.awt.event.ActionListener(){ }); main.setVisible(true); }}四、多线程快速扫描 1、多线程机制 在本系统中采用了多线程机制,用户可以上述工作窗口中输入所要打开的线程数,对相端口范围进行扫描。多线程是指在一个程序中同时打开多处运行单元,各线程同时执行。大大提高了扫描的速度。 例如,假设用户填写的线程数为3,则其扫描过程如下所示例如,假设用户填写的线程数为1,则其扫描过程如下所示当设置1个线程时,就好比只有一个人(一个线程)在做这件事,而但设置多个线程时,就好比是多个人分批一起做这件事。显然是多线程会处理的更快。 2、多线程核心代码 publicclassTCPThreadextendsThread{ publicstaticInetAddresshostAddress; …… publicTCPThread(Stringname,intthreadnum){ super(name); this.threadnum=threadnum; } //运行函数 publicvoidrun(){ //根据ip地址进行扫描 if(type==0){ //不同的端口循环扫描 for(i=XXXXXX;i<XXXXXX;i+=XXXXXX){ theTCPsocket=newSocket(hostAddress,i); theTCPsocket.close(); } } //按照主机名进行端口扫描 if(type==1){ for(i=XXXXXX;i<XXXXXX;i+=XXXXXX){ //…… } } }}//启动线程for(inti=0;i<maxThread;i++){ newTCPThread("T"+i,i).start();}五、用户使用方法1、页面说明首先在菜单中有“文件”“帮助”选项。在“文件”中设置了“保存扫描结果”和“退出”。用户可以点击“保存扫描结果”或者是Ctrl+S,对扫描结果进保存。也可在“帮助”菜单查看相关信息。如图在“端口范围”用户可以输入要扫描的端口的范围,默认是0—1000,最大是65535。在“线程数”中用户可以自定义线程数,默认是100,最大是200。之后是两种扫描方式的选择。扫描所有窗口中会显示所有被扫描过的不有打开和打开的端口,开放端口中会显示所有扫描得到的开放端口。2、按主机名扫描当用户选中按主机名扫描时,需要输入将要扫描的主机名,默认是本机localhost,用户也可以自己填写相关主机。之后点击“开始扫描”。3、按IP地址扫描当用户选中按IP地址扫描时,需要输入将要扫描的主机的IP,默认是。之后点击“开始扫描”。如果用户输入的端口范围太大,这样会导致程序扫描时间很长,这时可以点击“停止扫描”来中止扫描。六、常用端口 系统默认会识别一部分常用端口,对常用端口系统将扫描出来,并随之打印端口功能,对未能识别的开放端口,系统将随之打印“UnknownPort:Open”。代码如下:switch(i){ case21: porttype="(FTP)"; break; case23: porttype="(TELNET)"; break; case25: porttype="(SMTP)"; break; case80: porttype="(HTTP)"; break; case110: porttype="(POP)"; break; case139: porttype="(netBIOS)"; break; case1433: porttype="(SQLServer)"; break; case3389: porttype="(TerminalService)"; break; case443: porttype="(HTTPS)"; break; case1521: porttype="(Oracle)"; break; default: porttype="(UnknownPort:Open)"; break; }七、异常检测当用户输入的数据不合法时,系统将弹出错误窗口,并提示错误原因,相关代码://判断起始ip是否正确,判断条件:大于0且小于等于255 if(ip1<0||ip1>255||ip2<0||ip2>255||ip3<0||ip3>255||ipstart<0||ipstart>255){ ThreadScan.DLGINFO.setText("ip地址为0-255的整数!"); ThreadScan.DLGError.setVisible(true); ThreadScan.Submit.setEnabled(true);//设置开始扫描按钮可用。 return; }//判断主机名称的有效性 try{ TCPThread.hostAddress=InetAddress.getByName(ThreadScan.hostname.getText()); }catch(UnknownHostExceptione){ ThreadScan.DLGINFO.setText("错误的域名或地址不可达!"); ThreadScan.DLGError.setVisible(true); ThreadScan.Submit.setEnabled(true);//设置开始扫描按钮可用。 return; }//判断端口号的有效性 try{ minPort=Integer.parseInt(ThreadScan.minPort.getText()); maxPort=Integer.parseInt(ThreadScan.maxPort.getText()); maxThread=Integer.parseInt(ThreadScan.maxThread.getText()); }catch(NumberFormatExceptione){ ThreadScan.DLGINFO.setText("错误的端口号或线程数!端口号和线程数必须为整数!"); ThreadScan.DLGError.setVisible(true); ThreadScan.Submit.setEnabled(true);//设置开始扫描按钮可用。 return; }//判断最小端口号的有效范围:大于0且小于65535,最大端口应大于最小端口 if(minPort<0||minPort>65535||minPort>maxPort){ ThreadScan.DLGINFO.setText("最小端口必须是0-65535并且小于最大端口的整数!"); ThreadScan.DLGError.setVisible(true); ThreadScan.Submit.setEnabled(true);//设置开始扫描按钮可用。 return; }else{ TCPThread.MIN_port=minPort; }//判断最大端口号的有效范围:大于0且小于65535,最大端口应大于最小端口 if(maxPort<0||maxPort>65535||maxPort<minPort){ ThreadScan.DLGINFO.setText("最大端口必须是0-65535并且大于最小端口的整数!"); ThreadScan.DLGError.setVisible(true); ThreadScan.Submit.setEnabled(true);//设置开始扫描按钮可用。 return;}else{ TCPThread.MAX_port=maxPort; }//判断线程数量的有效范围:大于1且小于200 if(maxThread<1||maxThread>200){ ThreadScan.DLGINFO.setText("线程数为1-200的整数!"); ThreadScan.DLGError.setVisible(true); ThreadScan.Submit.setEnabled(true);//设置开始扫描按钮可用。 return; }结语 在这次课程设计中,我遇到了不少的困难。大多数是对程序的设计相关,当然还是因为知识点不全,技术不成熟造成的。不过,这个过程却使我学习了不少新的知识。包括对信息安全更深层的解理。我自认为这是一次比较成功的课程设计。不过我不知道为什么,我写的程序中还一点小BUG,就是在扫描过程中如果把窗口缩下去,再拉上来可能会导致窗口布局变乱,但这也不是经常发生的,所以不学对系统造成太大影响。由于时间关系,我不想再花时间查找原因了。但是以后有空时我会在复习这个程序时把问题解决掉。 再说明一点,我的课程设计大多时间是在我自己的机器上完成的,因为每次去机房还需要配置JAVA工作环境(本软件只有在JAVA环境下才正常运行),所以有两次我都没有去。另外,非常感谢老师对我们的辛勤指导!愿老师工作顺利,万事如意!参考文献[1]范建华、胥光辉、张涛等译.TCP/IP详解卷1:协议.机械工业出版社.2009年第1版[2]黄维通.VisualC++面向对象与可视化程序设计(第2版).清华大学出版社.2007年第2版[3]郑莉、董渊、张瑞丰.C++语言程序设计(第3版).清华大学出版社.2004年第3版代码#include<string.h>#include<winsock.h>#include<windows.h>#include<iostream.h>#pragmacomment(lib,"ws2_32.lib")intmain(intargc,char*argv[]){intiportFrom,iportTo;inttestsocket;intiopenedport=0;structsockaddr_intarget_addr;WSADATAwsaData;WORDwVersionRequested=MAKEWORD(1,1);if(argc<=3){cout<<"使用格式:"<<argv[0]<<"主机IP地址开始端口号结束端口号\n"<<endl;exit(1);}if(atoi(argv[2])>atoi(argv[3])){cout<<"错误!开始端口号必须小于结束端口号"<<endl;exit(1);}else{if(WSAStartup(wVersionRequested,&wsaData)){cout<<"连接socket库失败,请检查版本号是否为1.1\n"<<endl;exit(1);}iportFrom=atoi(argv[2]);iportTo=atoi(argv[3]);for(inti=iportFrom;i<=iport
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 古诗文阅读拓展:初中教材同步教学
- 教育机构教师聘任及教学管理合同
- 六一公司庆祝活动方案
- 六一商铺活动方案
- 六一布置公司活动方案
- 六一晨练活动方案
- 六一民警送礼物活动方案
- 六一活动排桌子活动方案
- 六一活动母婴店活动方案
- 六一活动策划方案
- 四川省遂宁市射洪市射洪中学校2024-2025学年七年级下学期5月期中语文试题(含答案)
- 如何做质量管理
- 新能源汽车动力电池管理技术考核试题及答案
- 《皮肤重建术》课件
- 《全国医药市场》课件
- 教育家精神对高校辅导员专业化发展的引领:可能性与可行性
- 教师名师笔试题库及答案
- 2025年广东省东莞市大湾区教育研究院中考二模英语试题(含答案)
- 店铺招人合同协议
- 2025年江西赣州国有资产投资集团有限公司招聘笔试参考题库附带答案详解
- 成人患者经鼻胃管喂养临床实践指南解读
评论
0/150
提交评论