简单端口扫描程序的实现.docx

上传人:b****8 文档编号:9087033 上传时间:2023-02-03 格式:DOCX 页数:21 大小:94.73KB
下载 相关 举报
简单端口扫描程序的实现.docx_第1页
第1页 / 共21页
简单端口扫描程序的实现.docx_第2页
第2页 / 共21页
简单端口扫描程序的实现.docx_第3页
第3页 / 共21页
简单端口扫描程序的实现.docx_第4页
第4页 / 共21页
简单端口扫描程序的实现.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

简单端口扫描程序的实现.docx

《简单端口扫描程序的实现.docx》由会员分享,可在线阅读,更多相关《简单端口扫描程序的实现.docx(21页珍藏版)》请在冰豆网上搜索。

简单端口扫描程序的实现.docx

简单端口扫描程序的实现

 

计算机网络课程设计

论文题目:

简单端口扫描程序的实现

 

院(部)名称:

计算机科学与工程学院

学生姓名:

专业:

学号:

指导教师姓名:

报告提交时间:

报告答辩时间:

(不填)

 

 

一、设计要求

本系统实现了一个简单的端口扫描器。

1.使用端口扫描对一台主机进行扫描,一台主机上有哪些端口是打开的;

2.对一个网段进行IP扫描,显示出一个网段内有哪些主机是开机的。

二、开发环境与工具

Windows的pc机Jdk包,:

具备网络环境并连入Internet。

三、设计原理

IP地址和端口被称作套接字,它代表一个TCP连接的一个连接端。

为了获得TCP服务,必须在发送机的一个端口上和接收机的一个端口上建立连接。

TCP连接用两个连接端来区别,也就是(连接端1,连接端2)。

连接端互相发送数据包。

端口扫描是在应用程序运行在TCP或者UDP协议之上工作的,这些协议是众多应用程序使用的传输机制,端口扫描是通过扫描主机确定哪一些TCP和UDP端口可以访问的过程.端口扫描常见的几种类型:

TCPConnect()扫描SYN扫描NULL扫描ACK扫描Xmas-TreeDumb扫描。

Ping命令经常用来对TCP/IP网络进行诊断。

通过目标计算机发送一个数据包,让它将这个数据包反送回来,如果返回的数据包和发送的数据包一致,那就是说你的PING命令成功了。

通过这样对返回的数据进行分析,就能判断计算机是否开着,或者这个数据包从发送到返回需要多少时间。

Tracert命令用来跟踪一个消息从一台计算机到另一台计算机所走的路径,

rusers和finger通过这两个命令,你能收集到目标计算机上的有关用户的消息。

扫描器通过选用远程TCP/IP不同的端口的服务,并记录目标给予的回答,通过这种方法,可以搜集到很多关于目标主机的各种有用的信息。

总之,端口扫描”通常指用同一信息对目标计算机的所有所需扫描的端口进行发送,然后根据返回端口状态来分析目标计算机的端口是否打开、是否可用。

“端口扫描”行为的一个重要特征,是在短时期内有很多来自相同的信源地址,传向不同的目的、地端口的包。

对于用端口扫描进行攻击的人来说,攻击者总是可以做到在获得扫描结果的同时,使自己很难被发现或者说很难被逆向寻踪。

为了隐藏攻击,攻击者可以慢慢地进行扫描。

除非目标系统通常闲着(这样对一个没有listen()端口的数据包都会引起管理员的注意),有很大时间间隔的端口扫描是很难被识别的。

隐藏源地址的方法是发送大量的欺骗性的端口扫描数据包(如1000个),其中只有一个是从真正的源地址来的。

这样即使全部数据包都被察觉,被记录下来,也没有人知道哪个是真正的信源地址。

能发现的仅仅是“曾经被扫描过”的地址。

也正因为这样,那些黑客们才乐此不疲地继续大量使用,这种端口扫描技术,来达到他们获取目标计算机信息,并进行恶意攻击的目的。

通常进行端口扫描的工具目前主要采用的是端口扫描软件,也称之为“端口扫描器”。

端口扫描器也是一种程序,它可以对目标主机的端口进行连接,并记录目标端口的应答。

端口扫描器通过选用远程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.对本网段的其他主机个端口的扫描。

五、设计步骤

六、关键问题及其解决方法

完整的代码如下:

importjava.io.*;

import.*;

importjava.util.*;

importjava.lang.*;

importjava.lang.String.*;

importjava.lang.Integer.*;

importjava.awt.*;

publicclassScanPort2

{

publicstaticvoidmain(Stringargs[])

{

System.out.println();

System.out.println("*********自定义多IP多TCP端口扫描程序*******");

System.out.println("*******按Ctrl+c退出扫描*******");

Stringshubeginip="",shuendip="";

Stringsp1="",sp2="",sp3="";

intbeginport,endport;

intmaxThread=0;

 

//异常判断变量

intbport=0,eport=0;

booleanbool=false;

booleanbool1=false;

booleanbool2=false;

booleanbool3=false;

booleanbool4=false;

longxxx=0,xxx2=0;

 

//由用户输入扫描范围

//读取输入开始ip

System.out.println();

System.out.println("请输入起始ip:

");

while(!

bool)

{

try

{

BufferedReaderin1=newBufferedReader(newInputStreamReader(System.in));

shubeginip=in1.readLine();

xxx=Com.ipj(shubeginip);

if(xxx==0)

{

bool=false;

System.out.println("IP格式错误,请输入正确的起始ip:

");

}

else

if(xxx<=Com.ipj("1.0.0.0"))

{

bool=false;

System.out.println("IP范围错误,请输入正确的起始ip:

");

}

else

bool=true;

}

catch(IOExceptione){System.out.println("IP格式错误,请输入正确的起始ip:

");}

catch(NumberFormatExceptione){System.out.println("IP格式错误,请输入正确的起始ip:

");}

catch(StringIndexOutOfBoundsExceptione){System.out.println("IP格式错误,请输入正确的开始ip:

");}

catch(NullPointerExceptione){System.out.print("退出程序!

");}

}

//读取输入结束ip

System.out.println();

System.out.println("请输入结束ip:

");

while(!

bool1)

{

try

{

BufferedReaderin2=newBufferedReader(newInputStreamReader(System.in));

shuendip=in2.readLine();

xxx2=Com.ipj(shuendip);

if(xxx2==0)

{

bool1=false;

System.out.println("IP格式错误,请输入正确的结束ip:

");

}

else

if(Math.abs(xxx2-xxx)>5155130)

{

bool1=false;

System.out.println("扫描IP数不能大于5155130,请输入正确的结束ip:

");

}

else

bool1=true;

}

catch(IOExceptione){System.out.println("IP格式错误,请输入正确的结束ip:

");}

catch(NumberFormatExceptione){System.out.println("IP格式错误,请输入正确的结束ip:

");}

catch(StringIndexOutOfBoundsExceptione){System.out.println("IP格式错误,请输入正确的结束ip:

");}

catch(NullPointerExceptione){System.out.print("退出程序!

");}

}

//读取输入起始端口

System.out.println();

System.out.println("请输入起始端口:

");

while(!

bool2)

{

try

{

BufferedReaderin3=newBufferedReader(newInputStreamReader(System.in));

sp1=in3.readLine();

bport=Integer.parseInt(sp1);

if(bport<0|bport>65535)

{

System.out.println("端口错误,请输入正确的起始端口:

");

bool2=false;

}

else

bool2=true;

}

catch(IOExceptione){System.out.println("端口错误,请输入正确的起始端口:

");}

catch(NumberFormatExceptione){System.out.println("端口错误,请输入正确的起始端口:

");}

}

beginport=Integer.parseInt(sp1);

//读取输入结束端口

System.out.println();

System.out.println("请输入结束端口:

");

while(!

bool3)

{

try

{

BufferedReaderin4=newBufferedReader(newInputStreamReader(System.in));

sp2=in4.readLine();

eport=Integer.parseInt(sp2);

if(eport65535)

{

System.out.println("端口错误,请输入正确的结束端口:

");

bool3=false;

}

else

bool3=true;

}

catch(IOExceptione){System.out.println("端口错误,请输入正确的结束端口:

");}

catch(NumberFormatExceptione){System.out.println("端口错误,请输入正确的起始端口:

");}

}

endport=Integer.parseInt(sp2);

//读取输入最大线程数

System.out.println();

System.out.println("请输入最大线程(1-300):

");

while(!

bool4)

{

try

{

BufferedReaderin5=newBufferedReader(newInputStreamReader(System.in));

sp3=in5.readLine();

maxThread=Integer.parseInt(sp3);

if(maxThread>300|maxThread<1)

{

System.out.println("请输入1-300之间的整数:

");

bool4=false;

}

else

bool4=true;

}

catch(IOExceptione){System.out.print("退出程序!

");}

catch(NumberFormatExceptione){System.out.println("请输入1-300之间的整数");}

catch(NullPointerExceptione){System.out.print("退出程序!

");}

}

maxThread=Integer.parseInt(sp3);

 

//开始扫描

System.out.println("正在处理IP地址……");

longlong_beginip=Com.ipj(shubeginip);//转换ip

longlong_endip=Com.ipj(shuendip);

intallport=endport-beginport+1;//计算扫描端口总数

intallip=(int)Math.abs(long_beginip-long_endip)+1;

intt1=0,t2=0;//计算耗时

longbegint,endt,alltime;

Datemydate=newDate();

begint=mydate.getTime();//获取当前时间

try

{

//计算两个ip值之间的所有ip

long[]ipduan=newlong[(int)Math.abs(long_beginip-long_endip)+1];

for(intk=0;k<=Math.abs(long_beginip-long_endip);k++)

{

if(long_beginip-long_endip<0)

ipduan[k]=long_beginip+k;

else

ipduan[k]=long_endip+k;

}

String[]ips1=newString[ipduan.length];

System.out.println("正在扫描……");

for(inta=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++)

{

intx=quanjubianliang.Threadnum;

if(x>maxThread)

{

try

{

Thread.sleep(100);

}

catch(InterruptedExceptione){}

}

StringthreadName="thread"+xPort;

if(xPort!

=21)

newScanThread(ips1[a],xPort,threadName).start();

}

}

else

allip=allip-1;

}

}

catch(Exceptionexp){System.out.println();}

Datemydate2=newDate();//获取结束时间

try

{

Thread.sleep(1000);

}

catch(InterruptedExceptione){}

System.out.println("扫描完成!

");

endt=mydate2.getTime();

alltime=endt-begint;

System.out.print("扫描了"+allip+"个IP共"+allip*allport+"个端口,用时"+alltime+"毫秒");

}

}

//全局变量,用做限制最大线程

classquanjubianliang

{

publicstaticintThreadnum=0;

}

 

//扫描线程

classScanThreadextendsThread

{

privateStringghost;

privateintscanP;

publicScanThread(Stringh,intmPort,StringthreadName)

{

ghost=h;

scanP=mPort;

}

publicvoidrun()

{

quanjubianliang.Threadnum=quanjubianliang.Threadnum+1;

try

{

SocketAddresssockaddr=newInetSocketAddress(ghost,scanP);

Socketscans=newSocket();

inttimeoutMs=50;

scans.connect(sockaddr,timeoutMs);

scans.close();

System.out.println("主机:

"+ghost+"TCP端口:

"+scanP+"在线");

}

catch(SocketTimeoutExceptione){}

catch(IOExceptione){}

quanjubianliang.Threadnum=quanjubianliang.Threadnum-1;

}

}

 

//ip处理

classCom

{

//将字符串ip转换成长整型

publicstaticlongipj(StringipAddress)

{

long[]ip=newlong[4];

intposition1=ipAddress.indexOf(".");

intposition2=ipAddress.indexOf(".",position1+1);

intposition3=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)

return0;

else

return(ip[0]<<24)+(ip[1]<<16)+(ip[2]<<8)+ip[3];

}

//将长整型ip转换为字符串型

publicstaticStringipk(longlongIP)

{

StringBuffersb=newStringBuffer("");

//直接右移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));

Stringsc=sb.toString();

String[]ss=sc.split("\\.");

if(Integer.parseInt(ss[3])==0)

returnnull;

else

returnsb.toString();

}

}

 

七、设计结果

 

八、软件使用说明

运行程序,跟据程序内容的题示输入起始IP,结束IP,端口号,线程等参数,最后程序返回扫描的结果。

九、参考资料

 

WelcomeTo

Download!

!

!

 

欢迎您的下载,资料仅供参考!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1