zoukankan      html  css  js  c++  java
  • 端口扫描器之java实现

    端口扫描器之java实现

     
    复制代码
    import java.net.*;
    import java.io.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;

    public class TcpThread extends Thread{

    //定义变量
    public static InetAddress hostAddress;//主机IP地址
    public static int MIN_port; //The minimal number of port
    public static int MAX_port; //The maximal number of port
    private int NUM_thread; //线程总数
    public static int type; //查询方式,0为IP方式1为主机名查询方式

    public static int ip1;//IP前三位
    public static int ip2;//IP4~6位
    public static int ip3;//IP7~9位
    public static int ipstart;//起始IP地址最后四位
    public static int ipend;//结束IP地址最后四位
    public static String ipAll;//完整的IP地址

    String nameHost = "";//扫描的主机名称或IP地址
    String typeport = "0";//端口类别

    /**
    * 构造函数
    */
    public TcpThread( String name, int numthread ){
    super(name);
    this.NUM_thread = numthread;
    }

    /**
    * run()运行函数
    */
    public void run( ) {

    int h = 0;//IP address
    int i = 0;//port number

    Socket theTcpSocket;

    //根据IP地址进行扫描
    if( 0 == type ){
    //IP地址循环扫描
    for( h = ipstart; h <= ipend; h++){
    ipAll = "" + ip1 + "." + ip2 + "." + ip3 + "." + h;
    nameHost = ipAll;

    try{
    hostAddress = InetAddress.getByName( ipAll );
    }catch( UnknownHostException e){}

    //不同端口循环扫描
    for( i = MIN_port; i < MAX_port + Integer.parseInt( ThreadScan.maxThread.getText() );
    i += Integer.parseInt(ThreadScan.maxThread.getText() ) ){
    try{
    theTcpSocket = new Socket(hostAddress, i);
    theTcpSocket.close();

    ThreadScan.Result.append( nameHost +":"+i);

    switch( i ){//其实这儿可以不用switch,直接用个hash表记录就可以
    case 21:
    typeport = "(FTP)";
    break;
    case 23:
    typeport = "(TELNET)";
    break;
    case 25:
    typeport = "SMTP";
    break;
    case 80:
    typeport = "HTTP";
    break;
    case 110:
    typeport = "POP";
    break;
    case 139:
    typeport = "netBIOS";
    break;
    case 1433:
    typeport = "SQL Server";
    break;
    case 3389:
    typeport = "Terminal Service";
    break;
    case 443:
    typeport = "HTTPS";
    break;
    case 1521:
    typeport = "Oracle";
    break;
    }

    //端口没有特定类型
    if( typeport.equals("0")){
    ThreadScan.Result.append(" ");
    }else{
    ThreadScan.Result.append(":" + typeport + " ");
    }
    }catch( IOException e){}
    }
    }
    if( i == MAX_port + Integer.parseInt(ThreadScan.maxThread.getText())){
    ThreadScan.Result.append(" " + "扫描完成...");
    //请"确定"按钮设置为可用
    if( !ThreadScan.Submit.setEnable( true ) );
    }
    }

    //按主机名进行端口扫描
    if( 1 == type ){
    for( i = MIN_port + NUM_thread; i < MAX_port + Integer.parseInt(ThreadScan.maxThread.getText());
    i += Integer.parseInt( ThreadScan.maxThread.getText( ) ) ) {
    try{
    theTcpSocket = new Socket( hostAddress, i );
    theTcpSocket.close();
    ThreadScan.Result.append(" " + i);
    switch( i ){//其实这儿可以不用switch,直接用个hash表记录就可以
    case 21:
    typeport = "(FTP)";
    break;
    case 23:
    typeport = "(TELNET)";
    break;
    case 25:
    typeport = "SMTP";
    break;
    case 80:
    typeport = "HTTP";
    break;
    case 110:
    typeport = "POP";
    break;
    case 139:
    typeport = "netBIOS";
    break;
    case 1433:
    typeport = "SQL Server";
    break;
    case 3389:
    typeport = "Terminal Service";
    break;
    case 443:
    typeport = "HTTPS";
    break;
    case 1521:
    typeport = "Oracle";
    break;
    }
    if( typeport.equals("0") ){
    ThreadScan.Result.append(" ");
    }else{
    ThreadScan.Result.append(":" + typeport + " ");
    }
    }catch( IOException e){

    }
    }
    if( i == MAX_port + Integer.parseInt(ThreadScan.maxThread.getText())){
    ThreadScan.Result.append(" " + "扫描完成...");
    if( !ThreadScan.Submit.isEnable()){
    ThreadScan.Submit.setEnabled( true );
    }
    }
    }//End of if
    }
    }
    复制代码
    复制代码
    import java.net.*;
    import java.io.*;
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    /**
    * 实现扫描的主体程序,TreadScan
    * @author Administrator
    *
    */

    public class ThreadScan {

    public static JFrame main = new JFrame("Scaner(V1.0)By Nevermore"); //注册框架类
    public static JTextArea Result = new JTextArea("", 4, 40); //显示扫描结果
    public static JScrollPane resultPane = new
    JScrollPane( Result, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
    JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);


    public static JTextField nameHost = new JTextField("localhost", 8 );//输入主机名文本框
    public static JTextField fromip1 = new JTextField("0", 3); //输入IP地址前三位的文本框
    public static JTextField fromip2 = new JTextField("0", 3); //输入IP地址4~6位的文本框
    public static JTextField fromip3 = new JTextField("0", 3); //输入IP地址7~9位的文本框
    public static JTextField fromip4 = new JTextField("0", 3); //输入IP地址后三位的文本框

    public static JTextField toip = new JTextField("0", 3); //输入目标IP地址后四位

    public static JTextField minPort = new JTextField("0", 4); //最小端口输入框
    public static JTextField maxPort = new JTextField("1000", 4); //最大端口输入框

    public static JTextField maxThread = new JTextField("100", 3); //最大线程数
    public static JDialog DLGError = new JDialog(main, "错误!"); //错误提示框
    public static JLabel DLGINFO = new JLabel("");
    public static JLabel type = new JLabel("请选择:");
    //扫描类型
    public static JRadioButton radioIP = new JRadioButton("IP地址:");
    public static JRadioButton radioHost = new JRadioButton("主机名:", true);
    //单选按钮组
    public static ButtonGroup group= new ButtonGroup();
    public static JLabel p1 = new JLabel("端口范围:");
    public static JLabel p2 = new JLabel("~");
    public static JLabel p3 = new JLabel("~");
    public static JLabel Pdot1 = new JLabel(".");
    public static JLabel Pdot2 = new JLabel(".");
    public static JLabel Pdot3 = new JLabel(".");
    public static JLabel TNUM = new JLabel("线程数:");
    public static JLabel RST = new JLabel("扫描结果:");
    public static JLabel con = new JLabel("");
    //定义按钮
    public static JButton Ok = new JButton("确定");
    public static JButton Submit = new JButton("开始扫描");
    public static JButton Cancel = new JButton("退出");
    public static JButton saveButton = new JButton("保存扫描结果");
    //菜单栏设计:这一块好好学习学习
    public static JMenuBar myBar = new JMenuBar();
    public static JMenu myMenu = new JMenu("文件(F)");
    public static JMenuItem saveItem = new JMenuItem("保存扫描结果(S)");
    public static JMenuItem exitItem = new JMenuItem("退出(Q)");
    public static JMenu myMenu2 = new JMenu("帮助");
    public static JMenuItem helpItem = new JMenuItem("阅读");

    /**
    * 主方法
    */
    public static void main( String[] argcs ){
    main.setSize(500, 400);
    main.setLocation(400, 400);
    main.setResizable(false);
    main.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    DLGError.setSize(300, 100);
    DLGError.setLocation(400, 400);
    //添加"菜单栏"
    myMenu.add(saveItem);
    myMenu.add(exitItem);

    myMenu2.add(helpItem);

    myBar.add(myMenu);//将菜单条目添加到菜单
    myBar.add(myMenu2);

    main.setJMenuBar(myBar);//将菜单添加到框架
    //设置热键
    myMenu.setMnemonic('F');
    saveItem.setMnemonic('S');
    //为"另存为"组建设置快捷键CTRL + S
    saveItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK));
    //采用表格包模式布局
    Container mPanel = main.getContentPane();
    GridBagConstraints c = new GridBagConstraints();
    c.insets = new Insets(10, 0, 0, 10);

    c.gridx = 0;// 设置表格坐标
    c.gridy = 0;
    c.gridwidth = 10;
    c.fill = GridBagConstraints.BOTH;
    c.anchor = GridBagConstraints.CENTER;
    mPanel.add(type, c);

    group.add(radioIP);
    group.add(radioHost);

    c.gridx = 0;
    c.gridy = 1;
    c.gridwidth = 1;
    c.fill = GridBagConstraints.BOTH;
    c.anchor = GridBagConstraints.CENTER;
    mPanel.add(radioIP, c);

    c.gridx = 1;
    c.gridy = 1;
    c.gridwidth = 1;
    c.fill = GridBagConstraints.CENTER;
    mPanel.add(fromip1, c);

    c.gridx = 2;
    c.gridy = 1;
    c.gridwidth = 1;
    c.fill = GridBagConstraints.BOTH;
    mPanel.add(Pdot1, c);

    c.gridx = 3;
    c.gridy = 1;
    c.gridwidth = 1;
    c.fill = GridBagConstraints.BOTH;
    c.anchor = GridBagConstraints.CENTER;
    mPanel.add(fromip2, c);

    c.gridx = 4;
    c.gridy = 1;
    c.gridwidth = 1;
    c.fill = GridBagConstraints.BOTH;
    c.anchor = GridBagConstraints.CENTER;
    mPanel.add(Pdot2, c);

    c.gridx = 5;
    c.gridy = 1;
    c.gridwidth = 1;
    c.fill = GridBagConstraints.BOTH;
    c.anchor = GridBagConstraints.CENTER;
    mPanel.add(fromip3, c);

    c.gridy = 1;
    c.gridx = 6;
    c.gridwidth = 1;
    c.fill = GridBagConstraints.BOTH;
    c.anchor = GridBagConstraints.CENTER;
    mPanel.add(Pdot3, c);


    c.gridx = 7;
    c.gridy = 1;
    c.gridwidth = 1;
    c.fill = GridBagConstraints.BOTH;
    c.anchor = GridBagConstraints.CENTER;
    mPanel.add(fromip4, c);

    c.gridx = 8;
    c.gridy = 1;
    c.gridwidth = 1;
    c.fill = GridBagConstraints.BOTH;
    c.anchor = GridBagConstraints.CENTER;
    mPanel.add(p2, c);

    c.gridx = 9;
    c.gridy = 1;
    c.gridwidth = 1;
    c.fill = GridBagConstraints.BOTH;
    c.anchor = GridBagConstraints.CENTER;
    mPanel.add(toip, c);

    c.gridx = 0;
    c.gridy = 2;
    c.gridwidth = 1;
    c.fill = GridBagConstraints.BOTH;
    c.anchor = GridBagConstraints.CENTER;
    mPanel.add(radioHost, c);

    c.gridx = 1;
    c.gridy = 2;
    c.gridwidth = 3;
    c.fill = GridBagConstraints.BOTH;
    c.anchor = GridBagConstraints.CENTER;
    mPanel.add(nameHost, c);

    c.gridx = 0;
    c.gridy = 3;
    c.gridwidth = 1;
    c.fill = GridBagConstraints.BOTH;
    c.anchor = GridBagConstraints.CENTER;
    mPanel.add(p1, c);

    c.gridx = 1;
    c.gridy = 3;
    c.gridwidth = 1;
    c.fill = GridBagConstraints.BOTH;
    c.anchor = GridBagConstraints.CENTER;
    mPanel.add(minPort, c);

    c.gridx = 2;
    c.gridy = 3;
    c.gridwidth = 1;
    c.fill = GridBagConstraints.BOTH;
    c.anchor = GridBagConstraints.CENTER;
    mPanel.add(p3, c);

    c.gridx = 3;
    c.gridy = 3;
    c.gridwidth = 1;
    c.fill = GridBagConstraints.BOTH;
    c.anchor = GridBagConstraints.CENTER;
    mPanel.add(maxPort, c);

    c.gridx = 0;
    c.gridy = 4;
    c.gridwidth = 1;
    c.fill = GridBagConstraints.BOTH;
    c.anchor = GridBagConstraints.CENTER;
    mPanel.add(TNUM, c);

    c.gridx = 1;
    c.gridy = 4;
    c.gridwidth = 3;
    c.fill = GridBagConstraints.BOTH;
    c.anchor = GridBagConstraints.CENTER;
    mPanel.add(maxThread, c);

    c.gridx = 0;
    c.gridy = 5;
    c.gridwidth = 3;
    c.fill = GridBagConstraints.BOTH;
    c.anchor = GridBagConstraints.CENTER;
    mPanel.add(Submit, c);


    c.gridx = 3;
    c.gridy = 5;
    c.gridwidth = 3;
    c.fill = GridBagConstraints.BOTH;
    c.anchor = GridBagConstraints.CENTER;
    mPanel.add(saveButton, c);

    c.gridx = 6;
    c.gridy = 5;
    c.gridwidth =4;
    c.fill = GridBagConstraints.BOTH;
    c.anchor = GridBagConstraints.CENTER;
    mPanel.add(Cancel, c);

    c.gridx = 0;
    c.gridy = 6;
    c.gridwidth = 10;
    c.fill = GridBagConstraints.BOTH;
    c.anchor = GridBagConstraints.CENTER;
    mPanel.add(RST, c);

    //设置文本域可以换行
    Result.setLineWrap(true);
    //设置文本域不可编辑
    Result.setEditable(false);


    c.gridx = 0;
    c.gridy = 7;
    c.gridwidth = 10;
    c.gridheight = 4;
    c.fill = GridBagConstraints.VERTICAL;
    c.anchor = GridBagConstraints.CENTER;
    mPanel.add(resultPane, c);

    Container dPanel = DLGError.getContentPane();
    dPanel.setLayout(new FlowLayout(FlowLayout.CENTER));
    dPanel.add(DLGINFO);
    dPanel.add(Ok);


    Submit.addActionListener(new SubmitAction());
    Cancel.addActionListener(new CancelAction());
    Ok.addActionListener(new OkAction());

    //实现保存功能
    saveItem.addActionListener(new java.awt.event.ActionListener(){
    public void actionPerformed(java.awt.event.ActionEvent e){
    JFileChooser fc = new JFileChooser();
    int returnVal = fc.showSaveDialog(null);
    //单击保存按钮
    if( 0 == returnVal ){
    File saveFile = fc.getSelectedFile();
    try{
    FileWriter writeOut = new FileWriter( saveFile );
    writeOut.write(ThreadScan.Result.getText());
    writeOut.close();

    }catch( IOException ex ){ System.out.println("保存失败");}
    }
    }
    });
    //实现退出功能
    ActionListener li = new java.awt.event.ActionListener(){
    public void actionPerformed(java.awt.event.ActionEvent e){
    System.exit(0);
    }
    };
    exitItem.addActionListener(li);
    //实现帮助功能

    ActionListener lil = new java.awt.event.ActionListener(){
    public void actionPerformed(java.awt.event.ActionEvent e){
    new AboutDialog();//
    }
    };
    helpItem.addActionListener(lil);

    ActionListener lill = new java.awt.event.ActionListener(){
    public void actionPerformed(java.awt.event.ActionEvent e){
    JFileChooser fc = new JFileChooser();
    int returnVal = fc.showSaveDialog(null);
    //单击保存按钮
    if( 0 == returnVal ){
    File saveFile = fc.getSelectedFile();
    try{
    FileWriter writeOut = new FileWriter(saveFile);
    writeOut.write(ThreadScan.Result.getText());
    writeOut.close();
    }catch(IOException ex ){ System.out.println("保存失败");}
    }else{
    return;//单击取消
    }

    }
    };
    saveButton.addActionListener(lill);
    main.setVisible(true);
    }
    }
    /**
    *
    * @author Nevermore
    * 实现取消功能
    */
    class CancelAction implements ActionListener{
    public void actionPerformed( ActionEvent e){
    System.exit(0);
    }
    }
    /**
    *
    * @author Nevermore
    * 实现确定按钮
    */
    class SubmitAction implements ActionListener{
    public void actionPerformed( ActionEvent a){
    int minPort;
    int maxPort;
    int maxThread;

    int ip1 = 0;
    int ip2 = 0;
    int ip3 = 0;
    int ipstart = 0;
    int ipend = 0;

    String ipaddress = "";
    String nameHost = "";
    ThreadScan.Result.setText("");
    if( ThreadScan.Submit.isEnabled()){
    ThreadScan.Submit.setEnabled(false);
    }
    /**
    * 判断扫描类型
    * 根据IP地址扫描 type = 0
    *根据主机名称扫描type = 1
    */
    if( ThreadScan.radioIP.isSelected()){
    TcpThread.type = 0;
    //判断IP地址的前三位是否是int型
    try{
    ip1 = Integer.parseInt(ThreadScan.fromip1.getText());
    }catch( NumberFormatException e ){
    ThreadScan.DLGINFO.setText("错误的IP地址");
    ThreadScan.DLGError.setVisible(true);
    return;
    }
    try{
    ip2 = Integer.parseInt(ThreadScan.fromip2.getText());
    }catch( NumberFormatException e ){
    ThreadScan.DLGINFO.setText("错误的IP地址");
    ThreadScan.DLGError.setVisible(true);
    return;
    }
    try{
    ip3 = Integer.parseInt(ThreadScan.fromip3.getText());
    }catch( NumberFormatException e ){
    ThreadScan.DLGINFO.setText("错误的IP地址");
    ThreadScan.DLGError.setVisible(true);
    return;
    }
    try{
    ipstart = Integer.parseInt(ThreadScan.fromip4.getText());
    }catch( NumberFormatException e ){
    ThreadScan.DLGINFO.setText("错误的IP地址");
    ThreadScan.DLGError.setVisible(true);
    return;
    }
    try{
    ipend = Integer.parseInt(ThreadScan.toip.getText());
    }catch( NumberFormatException e ){
    ThreadScan.DLGINFO.setText("错误的IP地址");
    ThreadScan.DLGError.setVisible(true);
    return;
    }

    //判断是否是合理的IP地址
    if(ip1 < 0 || ip1 > 255 || ip2 < 0 || ip2 > 255 ||
    ip3 < 0 || ip3 > 255 || ipstart < 0 || ipstart > 255 ){
    ThreadScan.DLGINFO.setText("IP地址为0~255的整数");
    ThreadScan.DLGError.setVisible(true);
    return ;
    }else{
    TcpThread.ip1 = ip1;
    TcpThread.ip2 = ip2;
    TcpThread.ip3 = ip3;
    TcpThread.ipstart = ipstart;
    }
    //判断目标IP地是否合理
    if( ipend < 0 || ipend > 255 ){
    ThreadScan.DLGINFO.setText("目标IP地址的范围是0~255");
    ThreadScan.DLGError.setVisible(true);
    return;
    }else{
    TcpThread.ipend = ipend;
    }

    ipaddress = "" + ip1 + ip2 + ip3 + ipstart;

    /**
    * 判断IP地址的有效性
    */
    try{
    TcpThread.hostAddress = InetAddress.getByName(ipaddress);
    }catch( UnknownHostException e){
    ThreadScan.DLGINFO.setText("错误的IP或IP地址不可到达!");
    ThreadScan.DLGError.setVisible(true);
    return;
    }

    if( ThreadScan.radioHost.isSelected()){
    TcpThread.type = 1;
    /**
    * 判断主机名的有效性
    */
    try{
    TcpThread.hostAddress = InetAddress.getByName(ThreadScan.nameHost.getText());
    }catch( UnknownHostException e){
    ThreadScan.DLGINFO.setText("错误的域名或地址不可到达!");
    ThreadScan.DLGError.setVisible(true);
    return;
    }
    }
    /**
    * 判断端口号的有效性
    */
    try{
    minPort = Integer.parseInt(ThreadScan.minPort.getText());
    maxPort = Integer.parseInt(ThreadScan.maxPort.getText());
    maxThread = Integer.parseInt(ThreadScan.maxThread.getText());
    }catch( NumberFormatException e ){
    ThreadScan.DLGINFO.setText("错误的端口号或端口号和线程数必须为整数");
    ThreadScan.DLGError.setVisible(true);
    return;
    }
    /**
    * 判断最小端口号的有效范围
    * 判断条件大于0小于65535最大端口号大于最小端口号
    */
    if( minPort < 0 || minPort > 65535 || minPort > maxPort ){
    ThreadScan.DLGINFO.setText("端口号范围:0~65535,并且最大端口号应大于最小端口号!");
    ThreadScan.DLGError.setVisible(true);
    return;
    }else{
    TcpThread.MIN_port = minPort;
    }
    /**
    * 判断最大端口号的有效范围
    */
    if( maxPort < 0 || maxPort > 65535 || maxPort < minPort ){
    ThreadScan.DLGINFO.setText("端口号范围:0~65535,并且最大端口号应大于最小端口号!");
    ThreadScan.DLGError.setVisible(true);
    return;
    }else{
    TcpThread.MAX_port = maxPort;
    }
    /**
    * 判断线程数的有效范围
    * 判断条件 大于1且小于200
    */
    if( maxThread < 1 || maxThread > 200 ){
    ThreadScan.DLGINFO.setText("线程数的有效范围是1~200");
    ThreadScan.DLGError.setVisible(true);
    return;
    }
    ThreadScan.Result.append("线程数" + ThreadScan.maxThread.getText() + " ");

    /**
    * 启动线程
    */
    for( int i = 0; i < maxThread; i++ ){
    new TcpThread("T" + i, i).start();
    }
    }
    }
    }
    /**
    *
    * @author Administrator
    * 错误对话框
    */
    class OkAction implements ActionListener{
    public void actionPerformed( ActionEvent e){
    ThreadScan.DLGError.dispose();
    }
    }
    复制代码
    复制代码
    import javax.swing.*;
    import java.awt.*;

    public class AboutDialog extends JDialog{
    JPanel JMainPane = new JPanel();
    JTabbedPane jTabbedPane = new JTabbedPane();

    private JPanel JPanel1 = new JPanel();
    private JPanel JPanel2 = new JPanel();

    private JTextArea jt1 = new JTextArea(6, 6);
    private JTextArea jt2 = new JTextArea(6, 6);

    /**
    * 构造函数
    */
    public AboutDialog(){
    setTitle("Scaner");
    setSize(300,200);
    setResizable(false);
    setDefaultCloseOperation( WindowConstants.DISPOSE_ON_CLOSE);

    Container c = this.getContentPane();

    jt1.setSize(260,200);
    jt2.setSize(260,200);
    jt1.setEditable(false);
    jt2.setEditable(false);
    jt1.setLineWrap(true);
    jt2.setLineWrap(true);

    jt1.setText("");
    jt1.setFont(new Font("楷体_GB2312", java.awt.Font.BOLD, 13));
    jt2.setText("");
    jt2.setFont(new Font("楷体_GB2312", java.awt.Font.BOLD, 13));

    jt1.setForeground(Color.black);
    jt2.setForeground(Color.black);

    JPanel1.add(jt1);
    JPanel2.add(jt2);

    jTabbedPane.setSize(300,200);
    jTabbedPane.addTab("扫描原理", null, JPanel1, null);
    jTabbedPane.addTab("使用说明", null, JPanel2, null);
    JMainPane.add(jTabbedPane);
    c.add(JMainPane);
    pack();
    this.setVisible(true);
    }
    }
    复制代码
  • 相关阅读:
    关于在MAC上进行 LARAVEL 环境 Homestead 安装过程记录
    js 贷款计算器
    js 实现阶乘
    js 两点间距离函数
    composer Your requirements could not be resolved to an installable set of packages
    vue 项目优化记录 持续更新...
    vue 项目打包
    vue 真机调试页面出现空白
    vue 真机调试
    谈谈-Android状态栏的编辑
  • 原文地址:https://www.cnblogs.com/jokerjason/p/5685942.html
Copyright © 2011-2022 走看看