admin管理员组

文章数量:1533103

2024年3月23日发(作者:)

端口扫描器的设计与实现

网络与信息安全·课程设计

网络中的每一台计算机如同一座城堡,在这些城堡中,有的对外完全开放,有的却是紧锁

城门。入侵者们是如何找到,并打开它们的城门的呢?这些城门究竟通向城堡的何处呢?在网

络技术中,把这些城堡的“城门”称之为计算机的“端口”。端口扫描是入侵者搜集信息的几

种常用手法之一,也正是这一过程最容易使入侵者暴露自己的身份和意图。一般来说,扫描端

口有如下目的:·判断目标主机上开放了哪些服务;·判断目标主机的操作系统;

如果入侵者掌握了目标主机开放了哪些服务,运行何种操作系统,他们就能够使用相应的

手段实现入侵,本课程设计将会通过用JAVA语言实现一个小的端口扫描软件,详细描述端口

扫描的原理,分析端口扫描所涉及的问题,以便更加清楚地了解入侵者如何扫描目标主机的端

口,同时掌握如何确保本机的安全性,为将来设计更为安全的系统打下牢固基础。

一、网络基础知识........................................................................................................4

1、端口的基本概念...............................................................................................42、端

口的分类.......................................................................................................4二、端口扫描的

基本原理............................................................................................5

1、基本原理...........................................................................................................52、基

于JAVA语言实现的核心代码...................................................................5三、端口扫描器视

图....................................................................................................6

1、工作窗口...........................................................................................................62、异

常窗口...........................................................................................................63、窗口核心代

码...................................................................................................6四、多线程快速扫

描....................................................................................................7

1、多线程机制.......................................................................................................72、多

线程核心代码...............................................................................................8五、用户使用方

法........................................................................................................9

1、页面说明...........................................................................................................92、按

主机名扫描...................................................................................................93、按IP地址扫

描.................................................................................................9六、常用端

口................................................................................................................9七、异常检

测..............................................................................................................10结

语..............................................................................................................................12

一、网络基础知识

1、端口的基本概念

“端口”在计算机网络领域中是个非常重要的概念。它是专门为计算机通信而设计的,它

不是硬件,不同于计算机中的“插槽”,可以说是个“软插槽”。如果有需要的话,一台计算

机中可以有上万个端口。

端口是由计算机的通信协议TCP/IP协议定义的。其中规定,用IP地址和端口作为套接字,

它代表TCP连接的一个连接端,一般称为Socket。具体来说,就是用IP端口来定位一台主机

中的进程。可以做这样的比喻,端口相当于两台计算机进程间的大门,可以随便定义,其目的

只是为了让两台计算机能够找到对方的进程。计算机就像一座大楼,这个大楼有好多入口(端

口),进到不同的入口中就可以找到不同的公司(进程)。如果要和远程主机A的程序通信,

那么只要把数据发向A端口就可以实现通信了。

可见,端口与进程是一一对应的,如果某个进程正在等待连接,称之为该进程正在监听,

那么就会出现与它相对应的端口。由此可见,通过扫描端口,便可以判断出目标计算机有哪些

通信进程正在等待连接。

2、端口的分类

端口是一个16bit的地址,用端口号进行标识不同作用的端口,参见表2-2和表2-3。端

口一般分为两类。

■动态端口号:动态端口的范围从1024到65535,这些端口号一般不固定分配给某个服务,

也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系

统就可以从这些端口号中分配一个供该程序使用。比如8080端口就是分配给第一个向系统发

出申请的程序。在关闭程序进程后,就会释放所占用的端口号。

二、端口扫描的基本原理

1、基本原理

端口扫描的原理其实非常简单,只是简单的利用JAVA提供库函数Socket进行调用,与每

一个感兴趣的目标计算机的端口进行连接。如果对方端口处于监听状态,那么连接就能成功。

否则,这个端口不能用,既没有提供服务。这个技术的一个最大的优点是,不需要任何权限,

系统中的任何用户都有权利使用这个调用。

引入多线程机制,利用多线程扫描的好处就是速度快,如果对每个目标端口以线性的方式

使用单独的连接调用,那么将会花费相当长的时间。多线程同时打开多个套接字,从而加速扫描。

在本设计中用户可以自定义线程的个数。此处用户还可以自定义扫描方式。

2、基于JAVA语言实现的核心代码

//在多线程的控制下,利用for循环对端口逐一扫描for(i=某某某某某某;i<某某某某某

某;i+=某某某某某某){}

try{

theTCPocket=newSocket(hotAddre,i);();//判断端口的类别witch(i){

cae21:

//对相应开放端口识别。

}

//将开放端口内容添加到显示区域,并加锁使各处同步关系。

ynchronized(){}

(""+i);

(":"+porttype+"n");

//对相应开放端口和没有开放即连接失败的端口作记录,放入显示区。catch(IOE某

ceptione){}

//同时也对程序加锁防止出现序。

ynchronized(ll){}

//将所有端口内容添加到显示区域

(""+i);

(":Cloed"+"n");

三、端口扫描器视图

1、工作窗口

这是用JAVA语言实现的一个简单的端口扫描器软件,主页面视图如下:

2、异常窗口

当用户操用不当,例如输入的IP地址超过255,或者端口范围大于65535时,

用户点击“开始扫描”按钮都会抛出相应的异常,并提示错误原因。如下图示例:

3、窗口核心代码

publicclaThreadScan{

publictaticJFramemain=newJFrame("网络与信息安全课程设计·端口扫描

器·刘纪生");publictaticvoidmain(String[]arg){

ionLitener(newSubmitAction());

{{}

}

ionLitener(new});

le(true);

Litener(){

});

//实现退出功能

e某ionLitener(Litener()//实现帮助功能

ionLitener(Litener()

ionLitener(newStopAction());ionLitener(newCancleAction

());ionLitener(newOKAction());

//实现保存功能

ionLitener(Litener()

四、多线程快速扫描

1、多线程机制

在本系统中采用了多线程机制,用户可以上述工作窗口中输入所要打开

的线程数,对相端口范围进行扫描。多线程是指在一个程序中同时打开多处运行单元,各

线程同时执行。大大提高了扫描的速度。

例如,假设用户填写的线程数为3,则其扫描过程如下所示

例如,假设用户填写的线程数为1,则其扫描过程如下所示

当设置1个线程时,就好比只有一个人(一个线程)在做这件事,而但设置多个线程时,

就好比是多个人分批一起做这件事。显然是多线程会处理的更快。

}

2、多线程核心代码

publicclaTCPThreade某tendThread{……

publicTCPThread(Stringname,intthreadnum){

uper(name);

num=threadnum;

publictaticInetAddrehotAddre;

}

//运行函数

publicvoidrun(){}

//根据ip地址进行扫描if(type==0){}

//按照主机名进行端口扫描if(type==1){}

for(i=某某某某某某;i<某某某某某某;i+=某某某某某某){//……}

//不同的端口循环扫描

for(i=某某某某某某;i<某某某某某某;i+=某某某某某某){

theTCPocket=newSocket(hotAddre,i);();

}

//启动线程

for(inti=0;i

}

newTCPThread("T"+i,i).tart();

五、用户使用方法

1、页面说明

首先在菜单中有“文件”“帮助”选项。在“文件”中设置了“保存扫描结果”和“退

出”。用户可以点击“保存扫描结果”或者是Ctrl+S

,对扫描结果进

保存。也可在“帮助”菜单查看相关信息。如图

在“端口范围”用户可以输入要扫描的端口的范围,默认是0—1000,最大是65535。

在“线程数”中用户可以自定义线程数,默认是100,最大是200。之后是两种扫描方式

的选择。

扫描所有窗口中会显示所有被扫描过的不有打开和打开的端口,开放端口中会显示所有扫

描得到的开放端口。

2、按主机名扫描

当用户选中按主机名扫描时,需要输入将要扫描的主机名,默认是本机localhot,用户也

可以自己填写相关主机。之后点击“开始扫描”。

3、按IP地址扫描

当用户选中按IP地址扫描时,需要输入将要扫描的主机的IP,默认是0.0.0.0。之后点击

“开始扫描”。如果用户输入的端口范围太大,这样会导致程序扫描时间很长,这时可以点击

“停止扫描”来中止扫描。

六、常用端口

系统默认会识别一部分常用端口,对常用端口系统将扫描出来,并随之打印端口功能,对

未能识别的开放端口,系统将随之打印“UnknownPort:Open”。代码如下:

witch(i){

cae21:

porttype="(FTP)";break;

cae23:

}

porttype="(TELNET)";break;

porttype="(SMTP)";break;

porttype="(HTTP)";break;

porttype="(POP)";break;

porttype="(netBIOS)";break;

porttype="(SQLServer)";break;

porttype="(TerminalService)";break;

porttype="(HTTPS)";break;

porttype="(Oracle)";break;

porttype="(UnknownPort:Open)";break;

cae25:

cae80:

cae110:

cae1433:

cae3389:

cae443:

cae1521:

default:

七、异常检测

当用户输入的数据不合法时,系统将弹出错误窗口,并提示错误原因,相关代码:

//判断起始ip是否正确,判断条件:大于0且小于等于255

if(ip1<0||ip1>255||ip2<0||ip2>255||ip3<0||ip3>255||iptart<0}

||iptart>255){

某t("ip地址为0-255的整

数!");le(true);led(true);//设置开始

扫描按钮可用。return;

//判断主机名称的有效性

try{

re=ame(e.g}catch(Unknow

nHotE某ceptione){}

某t("错误的域名或地址不可

达!");le(true);

led(true);//设置开始扫描按钮可用。return;

etTe某t());

//判断端口号的有效性

try{

minPort=t(

Port=t(某某t());

某t());ma某

ma某Thread=t(某某

t());}catch(NumberFormatE某ceptione){

某t("错误的端口号或线程数!端口号和线程数

必须为整数!");le(true);

}

led(true);//设置开始扫描按钮可用。return;

//判断最小端口号的有效范围:大于0且小于65535,最大端口应大于最小端口

if(minPort<0||minPort>65535||minPort>ma某Port){

某t("最小端口必须是0-65535并且小于最大端

口的整数!");le(true);

}

led(true);//设置开始扫描按钮可

return;_port=minPort;

}ele{

用。

//判断最大端口号的有效范围:大于0且小于65535,最大端口应大于最小端口

if(ma某Port<0||ma某Port>65535||ma某Port

某t("最大端口必须是0-65535并且大于最小端

口的整数!");

le(true);

led(true);//设置开始扫描按钮可用。return;

}ele{

}

if(ma某Thread<1||ma某Thread>200){}

某t("线程数为1-200

数!");le(true);

led(true);//设置开始扫描按钮可用。return;

某_port=ma某Port;

//判断线程数量的有效范围:大于1且小于200

的整

结语

在这次课程设计中,我遇到了不少的困难。大多数是对程序的设计相关,当

然还是因为知识点不全,技术不成熟造成的。不过,这个过程却使我学习了不少新的知识。

包括对信息安全更深层的解理。我自认为这是一次比较成功的课程设计。不过我不知道为什么,

我写的程序中还一点小BUG,就是在扫描过程中如果把窗口缩下去,再拉上来可能会导致窗口

布局变乱,但这也不是经常发生的,所以不学对系统造成太大影响。由于时间关系,我不想再

花时间查找原因了。但是以后有空时我会在复习这个程序时把问题解决掉。

再说明一点,我的课程设计大多时间是在我自己的机器上完成的,因为每次

去机房还需要配置JAVA工作环境(本软件只有在JAVA环境下才正常运行),所以有两次

我都没有去。另外,非常感谢老师对我们的辛勤指导,虽然在同学们印象中老师不是博学的教

授,但老师的工作热情大家是有目共睹的,这一点得到了大多数同学的肯定。我也非常支持老

师。

本文标签: 端口扫描用户计算机