基于JAVA的本地监听与远程端口扫描工具实现

greenlight

发布日期: 2019-01-08 08:45:23 浏览量: 1823
评分:
star star star star star star star star star_border star_border
*转载请注明来自write-bug.com

1 引言

1.1 课题背景

互联网与生俱有的开放性、交互性和分散性特征使人类所憧憬的信息共享、开放、灵活和快速等需求得到满足。网络环境为信息共享、信息交流、信息服务创造了理想空间,网络技术的迅速发展和广泛应用,为人类社会的进步提供了巨大推动力。然而,正是由于互联网的特性,产生了许多安全问题。

本地监听与远程端口扫描统互相配合,能够有效提高网络的安全性。通过对计算机的扫描,管理员可以了解主机的安全配置和运行的进程,及时发现安全漏洞,客观评估本地主机的风险性。管理员根据扫描和监听的结果,对存在的漏洞进行重新修复。在黑客进行攻击前防范。如果防火墙和网络监控是被动的防御手段,那么本地监听和远程端口扫描则是主动防御手段,可以有效阻止黑客的攻击,做到防患于未然。

1.2 课题研究意义

网络中的每一台计算机如同一座城堡,在这些城堡中,有的对外完全开放,有的却是紧锁城门。入侵者们是如何找到,打开城门的呢?这些城门究竟通往何处呢?

在网络技术中,把这些城堡的“城门“称之为计算机的端口,端口扫描是入侵者搜集信息的常用手法之一。扫描端口的目的如下:判断目标主机上开放了那些端口。判断目标主机的这些端口进行什么服务。掌握了这些信息后,入侵者能够使用相应的手段实现入侵。本程序即可以对本机正在运行的进程进行监听,并对自身的主机扫描,对结果进行分析,找出漏洞,从而为之后的重新配置做好准备。

利用平时所学的知识,将这个程序的各个功能实现。通过实践也可以进一步把所学的东西掌握牢固,找出其中不足的地方,在今后的学习生活中一步步的完善。

2 系统功能模块设计与实现

2.1 体系结构与功能介绍

2.1.1 体系结构

设计C/S模式的本地监听和远程端口扫描。C/S模式本地监听远程扫描系统共有6个Java 源文件和1个form文件组成,form文件是主类的窗口文件,由IDE netbeans自动生成。主类MainJFrame.java主要完成本地进程的实时枚举,相关开放端口的枚举功能;ThreadScan.java 主要完成多线程的远程主机扫描。其他的几个类文件主要是辅助类,以及方法实现类,用来完成响应的业务操作。

2.1.2 功能大体介绍

该程序有以下功能模块:

本地监听:主要实现实时查看操作系统当前运行进程,并根据进程查看本机响应端口和远程计算机连接情况。用户可以实时枚举当前系统所有运行的进程,根据进程id和端口开放的关系,查找开放的TCP及UDP端口。由于java工作的虚拟机之上的,所以java并不能直接获得操作系统进程的句柄。这些操作只能通过操作系统API或者提供的接口程序运行,本次设计考虑到java本地接口和Runtime类运行操作系统自己提供的shell/命令行(windows)两种方式。

远程扫描:远程端口Java socket类与远程主机给定的端口范围,采用多线程逐个连接。如果能够连接上表示对方相应的端口开放,如果不能视为没有开放。暂时不考虑对方主机存在防火墙。用户可以设定每次扫描的线程数,线程数越大,对当前扫描主机,及网络的压力就越大,扫描的速度也相对比较快。(程序规定扫描线程数为1-200的整数,默认线程数为100)。

2.2 程序主界面

MainJFrame类主要实现该程序的界面排版,将实现程序界面的所有的类封装在com.text包中。该包中将程序主界面分为三个部分,分别用不同的组件去实现,它包括菜单栏,滚动窗格,以及消息提示框的文本区控件,程序主界面如图2所示。

每一部分所使用的类以及对象如下表所示。

名 称 对 象
菜单条 menu JMenuBar
菜单 文件,操作 JMenu
菜单项 本机信息,net,exit,当前进程信息,扫描计算机 JMenuItem
滚动窗格 Pane13,tipPane JScrollBar
文本区 psInfo JTextArea
表格 table JTable

首先在主窗体内创建轻量组件,如menu=new javax.swing.JMenuBar()定义了整个菜单条对象,如文件 = new javax.swing.JMenu(),操作 = newjavax.swing.JMenu()则是创建的菜单对象,菜单对象之下的菜单项对象如 当前系统信息 = newjavax.swing.JMenuItem();网络状态 = newjavax.swing.JMenuItem();当前进程信息 = new javax.swing.JMenuItem();扫描计算机 = new javax.swing.JMenuItem()则是可以发生ActionEvent事件,通过鼠标点击实现该程序的两个主要功能:本地监听与远程端口扫描。

2.3 当前系统信息界面

在Java应用程序运行时,特别是需要在跨平台工作环境下运行时,需要确定操作系统类型、用户JDK版本和用户工作目录等随工作平台变化的信息,来保证程序正确运行。一般情况下,可以利用JDK提供的系统属性类(Properties)中的方法,快速地获取工作环境信息。另外,程序开发人员还可以定义与应用程序相关的系统属性文件,在用户程序执行过程中动态地加载程序员定义的属性文件来控制程序运行。

主要功能显示操作系统的各种信息,以上的操作系统信息,系统版本,Java,jre安装路径,当前用户名都是通过使用System.getProperty()方法得到的,然后输出到创建的文本区中。比如获得系统名,可以通过调用方法System.getProperty(“os.name”);系统版本通过调用方法System.getProperty(“os.version”)获得。

  1. String []headers={"操作系统","系统版本","java虚拟机版本","jre安装路径","当前用户名"};
  2. Properties prop = new Properties(System.getProperties());
  3. //在标准输出中输出系统属性的内容
  4. //prop.list(System.out);
  5. StringBuffer sys=new StringBuffer();
  6. contents[0][0]=System.getProperty("os.name");
  7. contents[0][1]=System.getProperty("os.version");
  8. contents[0][2]=System.getProperty("java.vm.version");
  9. contents[0][3]=System.getProperty("java.home");
  10. contents[0][4]=System.getProperty("user.name");
  11. contents[0][5]=System.getProperty("os.name");
  12. dm.setDataVector(contents,headers);
  13. table.setModel(dm);

2.4 网络状态程序界面

该功能主要显示当前网络的各种配置信息,如主机名,物理地址,ip地址,子网掩码等数据。通过调用系统本身的可执行程序ipocnfig.exe,nbtstat.exe来实现网络状态的功能。而实现对系统程序的调用则离不开Java本身丰富的类。Prcess是java.Lang包中的一个类,可以使用该包中的Runtime类调用其静态方法exec得到Process的一个实例,exec方法可以运行一个可执行文件,即启动一个进程(如ipconfig与nbtstat命令),exec方法返回一个Process对象。一个Process对象可以使用个getInputStream()方法获得该进程的输入流。利用Process中的流,获得该网络的信息。

  1. // Process pp = Runtime.getRuntime().exec("nbtstat -a " + ipAddress);
  2. Process pp = Runtime.getRuntime().exec("ipconfig /all ");
  3. InputStreamReader ir = new InputStreamReader(pp.getInputStream());
  4. LineNumberReader input = new LineNumberReader(ir);
  5. //str对象通过readLine()方法读取文本行,一直读取文本行的内容直到并显示内容直到下一文本行为空
  6. for (String str = input.readLine(); str != null; str = nextLines)
  7. {
  8. if(str!=null)
  9. netInfo.append(str+"\n");

2.5 本地监听

它也可以显示当前进程的运行情况,如下图所示:

由于java工作的虚拟机之上的,所以java并不能直接获得操作系统进程的句柄。这些操作只能通过操作系统API或者提供的接口程序运行。当要执行本机上的可执行文件时,如tasklist.exe时,这里使用java.lang包中的Runtime类。对象process调用exec(“tasklist /v”)方法打开本机上上的可执行文件,然后将结果输入到文本区中。而这里read()方法只读取其中的进程名称与进程号内容。

  1. String []headers={"进程名称","进程号"};
  2. ……………
  3. String s1 = "tasklist";
  4. Process process = Runtime.getRuntime().exec("tasklist /v");//通过Tasklist命令是一个用来显示运行在本地或远程计算机上的所有进程的命令行工具
  5. BufferedReader bufferedreader = new BufferedReader(new InputStreamReader(process.getInputStream()));//BufferReader方法可以把一个流(对象)接到另一个流上,从中连续读取内容。也就是读完一个进程的进程名后接着读取它的进程号

2.6 远程端口扫描

主要扫描远端主机给定端口范围的开放情况,可指定ip及端口扫描范围,扫描线程数,线程范围现规定范围为0-200,因为线程数过大会给当前主机造成过大压力,可能造成主机死机。

2.6.1 Socket类编程机制

随着计算机技术的发展,现在的操作系统多同时运行多个进程(或线程) 。Socket机制成功的解决了两台主机不同进程之间的通信问题。下图是一个典型的面向连接的 Socket 通信机制示意图。它采用客户服务器模式,由服务器方先建立自己的半相关(建立Socket并将Socket联编到某个端口上),并进入监听状态,同时监听是否有与自己端口相对应的连接请求。连接是客户方发送的这里户方在建立自己的半相关后,向服务器发起连接(调用方法accept());这样就建立起来一个完整的连接。

该程序则是机制中的客户端,只要知道目的主机的地址,就可以进行端口扫描。(不考虑防火墙)。下面介绍两个主机之间通信是如何建立的。

服务器端

  • 主进程

    • 创建一个Socket,将其绑定到服务器本地址和一个已知协议端口上。让该端口保持非连接状态
    • 将该端口设置为被动式
    • 主进程守候在这个指定的端口上,等待收接客户机的连接请求
    • 当有来自客户端的连接请求时,向客户机发送应答并创建一个新的从进程来处理响应。返回 3)
    • 退出
  • 从进程

    • 由于接收到连接请求而被创建,即用于连接的Socket
    • 根据用户的连接请求 ,决定利用该连接与客户机进行交互
    • 交互结束 ,关闭连接并退出

客户机端

  • 创建一个用于远程通信的Socket。代码如下所示:
  1. Socket theTCPsocket;
  • 发起一个到服务器进程的主动连接
  1. theTCPsocket=new Socket(hostAddress,i); // hostAddress输入目标主机的IP或域名。
  • 利用该连接与服务器进程进行通信

通信结束,关闭连接并退出。本应用程序就是这个通信机制中的客户端。

  1. theTCPsocket.close();

机制如下图所示:

Socket和ServerSocket类库位于java.net包中。ServerSocket用于服务器端,Socket是建立网络连接时使用的,本应用程序就是一个客户端。

2.6.2 功能详解

连接成功时,应用程序两端都会产生一个Socket实例,操作这个实例,完成所需的会话。对于一个网络连接来说,套接字是平等的,并没有差别,不因为在服务器端或在客户端而产生不同级别。不管是Socket还是ServerSocket它们的工作都是通过 SocketImpl类及其子类完成的。

本地主机端口扫描功能是查看本机的哪些端口属于打开状态,哪些是关闭状态。在界面的ip或域名处输入:localhost,端口范围的正确输入是0-65535的整数,而且输入的最小端口号小于输入的最大端口号。线程数则输入1-200的整数。该程序可以正常运行:

本地端口扫描界面如下图所示:

指定主机(可达),输入正确的端口范围,正确的线程数,远程端口扫描界面如图8所示:

该程序主要由TCPThread.java实现。

  • 包含TCPThread的public类,主要功能为启动端口扫描线程。根究用户输入的端口范围,线程数等信息进行扫描,并判断端口类型

  • 类CancelAction:实现“退出”按钮的事件侦听

  • 类SubmitAction:实现“开始扫描”按钮的事件侦听。包括判断各个文本框中数据的有效性,并启动相应的线程数开始扫描

  • 类OKAction:错误提示框中“确定”按钮的事件侦听。如下图所示:

网络编程的基本模型就是客户机到服务器模型。简单的说就是两个进程之间相互通讯,然后其中一个必须提供一个固定的位置(IP或域名),而另一个则只需要知道这个固定的位置,并去建立两者之间的联系,然后完成数据的通讯就可以了。这里提供固定位置的通常称为服务器(被扫描的主机),而建立联系的就是客户端(主机)。客户机必须知道有关服务器的IP地址。对于着一点Java也提供了一个相关的类InetAddress 该对象的实例必须通过它的静态方法来提供。它的静态方法主要提供了得到本机IP 和通过名字或IP直接得到InetAddress的方法。

以上两种方式扫描方式所包含的变量为:最小端口号int MIN_port;最大端口号 intMAX_port;线程数 int threadnum;InetAdress所含主机地址通过静态方法getByName()获取。

Internet上的计算机,端口号标示正在计算机上运行的进程(程序)。端口号与IP地址的组合得到一个网络套接字。端口号被规定为一个在0-65535范围内的整数。其中,0-1023被预先定义的服务通信占用(如telnet占用端口号23,http占用80端口)。

  1. //使用实现接口 Runnable 的对象创建一个线程时,启动该线程将导致在独立执行的线程中调用对象的 run 方法
  2. public void run() {
  3. int i;//整型变量 i;
  4. Socket theTCPsocket;// 此类实现客户端套接字,套接字是两台机器之间的通信端点
  5. //将字符串参数作为有符号的十进制整数进行分析。文本内容用 parseInt()就可以将最大线程数准换为对于的int型数据
  6. for (i = MIN_port+threadnum; i < MAX_port; i += Integer.parseInt(ThreadScan.maxThread.getText())) {
  7. ThreadScan.status.setText("扫描状态:正在扫描 "+i+" 端");
  8. try {
  9. theTCPsocket=new Socket(hostAddress,i);//参数host是服务器的ip地址,port端口号;
  10. theTCPsocket.close();
  11. ThreadScan.Result.append(" "+i);
  12. switch(i) {
  13. case 21:
  14. ThreadScan.Result.append("(FTP)");?//当端口号为21则FTP服务在运行;
  15. break;
  16. case 23:
  17. ThreadScan.Result.append("(TELNET)");//当端口为23则telnet服务在运行;
  18. break;
  19. case 25:
  20. ThreadScan.Result.append("(SMTP)");//当端口为25则SMTP服务在运行
  21. break;
  22. case 80:
  23. ThreadScan.Result.append("(HTTP)");//当端口为80则HTTP服务在运行;
  24. break;
  25. case 110:
  26. ThreadScan.Result.append("(POP)");//端口为110时,POP服务在运行;
  27. break;
  28. case 139:
  29. ThreadScan.Result.append("(netBIOS)");//当端口为139时,netBIOS服务在运行;
  30. break;
  31. ......

参考文献

[1] 孙一林,彭波.Java网络编程实例[M].北京:清华大学出版社

[2] 殷兆麟.Java网络编程[M].北京:国防工业出版社

[3] 吴逸贤,吴目诚.Java2程序设计[M].南京:科学出版社

[4] 刘弈等.基于Socket的Java 语言网络通信机制和程序设计[J].计算机应用工程

上传的附件 cloud_download 基于JAVA的本地监听与远程端口扫描工具实现.zip ( 279.27kb, 33次下载 )
error_outline 下载需要11点积分

发送私信

幸福的绿光在哪里

23
文章数
20
评论数
最近文章
eject