计算机网络课程设计论文题目:简单端口扫描程序的实现院(部)名称:计算机科学与工程学院学生姓名:专业:学号:指导教师姓名:报告提交时间:报告答辩时间:(不填)目录一、设计要求 (3)二、开发环境与工具 (3)三、设计原理 (3)四、系统功能描述及软件模块划分 (3)五、设计步骤 (5)六、关键问题及其解决方法 (5)七、设计结果 (15)八、软件使用说明 (16)九、参考资料 (16)一、设计要求本系统实现了一个简单的端口扫描器。
1. 使用端口扫描对一台主机进行扫描,一台主机上有哪些端口是打开的;2. 对一个网段进行 IP 扫描,显示出一个网段内有哪些主机是开机的。
二、开发环境与工具Windows的pc机Jdk包,:具备网络环境并连入Internet。
三、设计原理IP地址和端口被称作套接字,它代表一个TCP连接的一个连接端。
为了获得TCP服务,必须在发送机的一个端口上和接收机的一个端口上建立连接。
TCP连接用两个连接端来区别,也就是(连接端1,连接端2)。
连接端互相发送数据包。
端口扫描是在应用程序运行在 TCP 或者 UDP 协议之上工作的, 这些协议是众多应用程序使用的传输机制,端口扫描是通过扫描主机确定哪一些 TCP 和UDP 端口可以访问的过程. 端口扫描常见的几种类型: TCP Connect()扫描 SYN 扫描 NULL 扫描 ACK 扫描 Xmas-Tree Dumb 扫描。
Ping命令经常用来对TCP/IP网络进行诊断。
通过目标计算机发送一个数据包,让它将这个数据包反送回来,如果返回的数据包和发送的数据包一致,那就是说你的PING命令成功了。
通过这样对返回的数据进行分析,就能判断计算机是否开着,或者这个数据包从发送到返回需要多少时间。
Tracert命令用来跟踪一个消息从一台计算机到另一台计算机所走的路径, rusers和finger 通过这两个命令,你能收集到目标计算机上的有关用户的消息。
扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法,可以搜集到很多关于目标主机的各种有用的信息。
总之,端口扫描”通常指用同一信息对目标计算机的所有所需扫描的端口进行发送,然后根据返回端口状态来分析目标计算机的端口是否打开、是否可用。
“端口扫描”行为的一个重要特征,是在短时期内有很多来自相同的信源地址,传向不同的目的、地端口的包。
对于用端口扫描进行攻击的人来说,攻击者总是可以做到在获得扫描结果的同时,使自己很难被发现或者说很难被逆向寻踪。
为了隐藏攻击,攻击者可以慢慢地进行扫描。
除非目标系统通常闲着(这样对一个没有listen()端口的数据包都会引起管理员的注意),有很大时间间隔的端口扫描是很难被识别的。
隐藏源地址的方法是发送大量的欺骗性的端口扫描数据包(如1 000个),其中只有一个是从真正的源地址来的。
这样即使全部数据包都被察觉,被记录下来,也没有人知道哪个是真正的信源地址。
能发现的仅仅是“曾经被扫描过”的地址。
也正因为这样,那些黑客们才乐此不疲地继续大量使用,这种端口扫描技术,来达到他们获取目标计算机信息,并进行恶意攻击的目的。
通常进行端口扫描的工具目前主要采用的是端口扫描软件,也称之为“端口扫描器”。
端口扫描器也是一种程序,它可以对目标主机的端口进行连接,并记录目标端口的应答。
端口扫描器通过选用远程TCP/IP协议不同的端口的服务,记录目标计算机端口给予回答的方法,可以收集到很多关于目标计算机的各种有用信息(比如是否有端口在侦听,是否允许匿名登录,是否有可写的FTP目录,是否能用Telnet等)。
虽然端口扫描器可以用于正常网络安全管理,但就目前来说,它主要还是被黑客所利用,是黑客入侵、攻击前期不可缺少的工具。
黑客一般先使用扫描工具扫描待入侵主机,掌握目标主机的端口打开情况,然后采取相应的入侵措施。
无论是正常用途,还是非法用途,端口扫描可以提供4个用途。
1.识别目标主机上有哪些端口是开放的,这是端口扫描的最基本目的。
2.识别目标系统的操作系统类型(Windows、Linux或UNIX等)。
3.识别某个应用程序或某个特定服务的版本号。
4.识别目标系统的系统漏洞,这是端口扫描的一种新功能。
当然以上这些功能不可能是一成不变的,随着技术的不断完善,新的功能会不断地增加。
端口扫描器并不是一个直接攻击网络漏洞的程序,它仅仅能帮助发现目标计算机的某些内在的弱点。
一个好的扫描器还能对它得到的数据进行分析,帮助查找目标计算机的漏洞。
但它不会提供一个系统的详细步骤。
编写扫描器程序必须要很多TCP/IP协议程序,以及C、Perl和SHELL语言的知识,还需要一些Socket编程的背景。
四、系统功能描述及软件模块划分主要功能有:1. 使用端口扫描对一台主机进行扫描,一台主机上有哪些端口是打开的;2. 对一个网段进行 IP 扫描,显示出一个网段内有哪些主机是开机的。
软件所包含的主要模块有:1.对IP的处理。
包括对IP的移位和运算等。
2.对本机个端口的扫描。
3.对本网段的其他主机个端口的扫描。
五、设计步骤六、关键问题及其解决方法完整的代码如下:import java.io.*;import .*;import java.util.*;import ng.*;import ng.String.*;import ng.Integer.*;import java.awt.*;public class ScanPort2{public static void main(String args[]){System.out.println();System.out.println(" *********自定义多IP多TCP端口扫描程序*******");System.out.println(" *******按Ctrl+c退出扫描*******");String shubeginip="",shuendip="";String sp1="",sp2="",sp3="";int beginport,endport;int maxThread=0;// 异常判断变量int bport=0,eport=0;boolean bool = false;boolean bool1 = false;boolean bool2 = false;boolean bool3 = false;boolean bool4 = false;long xxx=0,xxx2=0;//由用户输入扫描范围//读取输入开始ipSystem.out.println();System.out.println("请输入起始ip:");while(!bool){try{BufferedReader in1=new BufferedReader(new InputStreamReader(System.in));shubeginip=in1.readLine();xxx=Com.ipj(shubeginip);if(xxx==0){bool=false;System.out.println("IP格式错误,请输入正确的起始ip:");}elseif(xxx<=Com.ipj("1.0.0.0")){bool=false;System.out.println("IP范围错误,请输入正确的起始ip:");}elsebool=true;}catch(IOException e){System.out.println("IP格式错误,请输入正确的起始ip:");}catch(NumberFormatException e){System.out.println("IP 格式错误,请输入正确的起始ip:");}catch(StringIndexOutOfBoundsExceptione){System.out.println("IP格式错误,请输入正确的开始ip:");}catch(NullPointerException e){System.out.print("退出程序!");}}//读取输入结束ipSystem.out.println();System.out.println("请输入结束ip:");while(!bool1){try{BufferedReader in2=new BufferedReader(new InputStreamReader(System.in));shuendip=in2.readLine();xxx2=Com.ipj(shuendip);if(xxx2==0){bool1=false; System.out.println("IP格式错误,请输入正确的结束ip:");}elseif(Math.abs(xxx2-xxx)>5155130){bool1=false;System.out.println("扫描IP数不能大于5155130,请输入正确的结束ip:");}elsebool1=true;}catch(IOException e){System.out.println("IP格式错误,请输入正确的结束ip:");}catch(NumberFormatException e){System.out.println("IP格式错误,请输入正确的结束ip:");}catch(StringIndexOutOfBoundsExceptione){System.out.println("IP格式错误,请输入正确的结束ip:");}catch(NullPointerException e){System.out.print("退出程序!");}}//读取输入起始端口System.out.println();System.out.println("请输入起始端口:");while(!bool2){try{BufferedReader in3=new BufferedReader(new InputStreamReader(System.in));sp1=in3.readLine();bport=Integer.parseInt(sp1);if(bport<0|bport>65535){System.out.println("端口错误,请输入正确的起始端口:");bool2=false;}elsebool2=true;}catch(IOException e){System.out.println("端口错误,请输入正确的起始端口:");}catch(NumberFormatException e){System.out.println("端口错误,请输入正确的起始端口:");}}beginport=Integer.parseInt(sp1);//读取输入结束端口System.out.println();System.out.println("请输入结束端口:");while(!bool3){try{BufferedReader in4=new BufferedReader(new InputStreamReader(System.in));sp2=in4.readLine();eport=Integer.parseInt(sp2);if(eport<beginport|eport>65535){System.out.println("端口错误,请输入正确的结束端口:");bool3=false;}elsebool3=true;}catch(IOException e){System.out.println("端口错误,请输入正确的结束端口:");}catch(NumberFormatException e){System.out.println("端口错误,请输入正确的起始端口:");}}endport=Integer.parseInt(sp2);//读取输入最大线程数System.out.println();System.out.println("请输入最大线程(1-300):");while(!bool4){try{BufferedReader in5=new BufferedReader(new InputStreamReader(System.in));sp3=in5.readLine();maxThread=Integer.parseInt(sp3);if(maxThread>300|maxThread<1){System.out.println("请输入1-300之间的整数:");bool4=false;}elsebool4=true;}catch(IOException e){System.out.print("退出程序!");} catch(NumberFormatException e){System.out.println("请输入1-300之间的整数");}catch(NullPointerException e){System.out.print("退出程序!");}}maxThread=Integer.parseInt(sp3);//开始扫描System.out.println("正在处理IP地址……");long long_beginip=Com.ipj(shubeginip);//转换iplong long_endip=Com.ipj(shuendip);int allport=endport-beginport+1;//计算扫描端口总数int allip=(int)Math.abs(long_beginip - long_endip) + 1; int t1=0,t2=0; //计算耗时long begint,endt,alltime;Date mydate=new Date();begint=mydate.getTime(); //获取当前时间try{//计算两个ip值之间的所有iplong[] ipduan=new long[(int)Math.abs(long_beginip - long_endip) + 1];for(int k=0;k<=Math.abs(long_beginip - long_endip);k++){if (long_beginip-long_endip < 0)ipduan[k]=long_beginip+k;elseipduan[k]=long_endip+k;}String[] ips1=new String[ipduan.length];System.out.println("正在扫描……");for(int a=0;a<=ipduan.length;a++){ips1[a]=Com.ipk(ipduan[a]);if(ips1[a]!=null){System.out.println("正在扫描:"+ips1[a]);for(intxPort=beginport;xPort<=endport;xPort++ ){int x=quanjubianliang.Threadnum;if(x>maxThread){try{Thread.sleep(100);}catch(InterruptedException e){}}String threadName="thread"+xPort;if(xPort!=21)newScanThread(ips1[a],xPort,threadName).start();}}elseallip=allip-1;}}catch(Exception exp){System.out.println();}Date mydate2=new Date(); //获取结束时间try{Thread.sleep(1000);}catch(InterruptedException e){}System.out.println("扫描完成!");endt=mydate2.getTime();alltime=endt-begint;System.out.print("扫描了"+allip+"个IP共"+allip*allport+"个端口,用时"+alltime+"毫秒");}}//全局变量,用做限制最大线程class quanjubianliang{public static int Threadnum=0;}//扫描线程class ScanThread extends Thread{private String ghost;private int scanP;public ScanThread(String h,int mPort,String threadName) {ghost=h;scanP=mPort;}public void run(){quanjubianliang.Threadnum=quanjubianliang.Threadnum+1;try{SocketAddress sockaddr = new InetSocketAddress(ghost,scanP);Socket scans=new Socket();int timeoutMs=50;scans.connect(sockaddr, timeoutMs);scans.close();System.out.println("主机:"+ghost+" TCP端口:"+scanP+" 在线");}catch(SocketTimeoutException e){}catch(IOException e){}quanjubianliang.Threadnum=quanjubianliang.Threadnum-1;}}//ip处理class Com{//将字符串ip转换成长整型public static long ipj(String ipAddress){long[] ip=new long[4];int position1=ipAddress.indexOf(".");int position2=ipAddress.indexOf(".",position1+1); int position3=ipAddress.indexOf(".",position2+1);ip[0]=Long.parseLong(ipAddress.substring(0,position1));ip[1]=Long.parseLong(ipAddress.substring(position1+1,position2)); ip[2]=Long.parseLong(ipAddress.substring(position2+1,position3)); ip[3]=Long.parseLong(ipAddress.substring(position3+1));if(ip[0]==0|ip[3]==0|ip[0]>255|ip[1]>255|ip[2]>255|ip[3]>255)return 0;elsereturn(ip[0]<<24)+(ip[1]<<16)+(ip[2]<<8)+ip[3];}//将长整型ip转换为字符串型public static String ipk(long longIP){StringBuffer sb=new StringBuffer("");//直接右移24位sb.append(String.valueOf(longIP>>>24));sb.append(".");//将高8位置0,然后右移16位sb.append(String.valueOf((longIP&0x00FFFFFF)>>>16));sb.append(".");sb.append(String.valueOf((longIP&0x0000FFFF)>>>8)); sb.append(".");sb.append(String.valueOf(longIP&0x000000FF));String sc=sb.toString();String[] ss = sc.split("\\.");if(Integer.parseInt(ss[3])==0)return null;elsereturn sb.toString();}} 七、设计结果八、软件使用说明运行程序,跟据程序内容的题示输入起始IP,结束IP,端口号,线程等参数,最后程序返回扫描的结果。