JAVA SWING 多线程实现扫描同一个网段的IP,以及选定IP的端口

来源:互联网 发布:知君本无邪txt 编辑:程序博客网 时间:2024/06/14 20:26

用了一个礼拜时间做了一个端口扫描程序。从扫描同一个网段的IP开始,逐步添加功能。现在还具有了扫描选定IP的常见TCP/UDP端口(包括部分常见木马所使用端口),并可以自定义扫描端口。扫描同一网段的IP主要是用SHELL方法,使用PING命令并判断返回值内容,从而确定服务器是否打开。扫描端口的原理是使用socket类判断是否连接成功。JAR文件下载地址:http://download.csdn.net/detail/qq372712203/6940923

下面把主要涉及到的知识记录一下,以防忘记。


1.主界面


程序启动后,会获得自己的IP,并填入“目标IP段”。如果得到的IP地址结尾为1(**.**.**.1,通常是虚拟网卡的网关)则忽略,填入第一个结尾不为1的IP

接下来两个参数是扫描IP的范围,默认2-255。等待时间是 ping -w的参数,数字越小执行越快。最多尝试次数是指等待ping的request次数(cmd中,ping会返回4次,所以最大次数为4),数字越小执行越快。

*点击“目标IP段:”标签,会直接执行对本机IP的扫描,扫描结果只有本机。该功能为测试用。


2.IP扫描界面


用for循环依次执行ping命令,返回值“超时”则判定为没有响应,得到响应后将IP记录下来。

这里判定得到响应是检查返回值是否包含“TTL”字段。

进度条用的是JProcessBar,需要注意的是,要用多线程才能保证每次进度发生变化时界面都能改变

执行完毕后显示右侧的结果列表。单击选定一个IP,再单击右键,会显示出主机名[我的叫 HelloRoy](对其他机器读取主机名时,需要有几秒钟的等待)


选定IP后,双击进入端口扫描界面


3.端口扫描

 

端口扫面界面也是用循环执行Socket连接,若执行成功则判定为端口打开,返回IOException则判定为没有打开。扫描完毕后显示已经打开的端口列表。

这里有一个加快判断的窍门。最初我是用for循环一个一个执行,速度十分慢,执行完TCP+UDP的471个端口就需要几十分钟!后来改用多线程执行,结果135.139.445这种必然会打开的端口的扫描结果竟然也是关闭!检查后发现,这里有一个bug。因为new Socket的执行时间比较长,socket还未执行完线程就执行完了,所以没有返回true值。所以,我在socket =  new Socket(IP, port)语句后直接加入socket.close();语句,接下来就可以将现在扫描的端口值添加到结果列表里面了。因为如果端口没有打开,socket直接抛出IOException,而不会执行close语句和添加结果语句。这样一来,已经打开的端口会在瞬间被检测出来,没有打开的端口经过一定时间的延迟后才会显现。


这里有一个bug,因为使用多线程执行,文字输出的顺序会乱,而且有的端口会被扫描好几遍。正在想办法解决这个问题。

*注:bug解决。在输出方法addText里添加这里有一个加快判断的窍门。synchronized (this) {}语句即可

这里有一个加快判断的窍门。
0 0
原创粉丝点击