Java入侵检测(三)

这里写图片描述
这就是最终效果。用了WindowBuilder构建gui。

开始捕获就去抓包,抓完包就存到数据库,并且回调到主线程中显示(有种Android既视感,只不过Android比JavaGui复杂无数倍)

用到的JList、JSipnner、JComBox控件

public class MainWindow implements CaptureListener {
    // 数目
    JLabel LabelTotal, LabelIP, LabelTCP, LabelUDP;
    private JFrame frame;
    JpcapCaptor jpcap;
    // list
    JList list;
    // 抓包总数目
    JSpinner sp_total_size;
    // 包下拉
    JComboBox box_packet_type;

    // 抓取后的监听
    CaptureListener listener;
    // 抓包线程
    Thread capThread;
    // 接收回调类
    TestPacketReceiver receiver;
    // 网卡信息类
    NetworkInterface nc;
    NetworkInterface[] devices;
    // 网卡的adapter
    ComboBoxModel box_packet_type_mode;
    // list adapter
    DefaultListModel<Object> dlm;

    // 全部
    int spinner_num = -1;
    int totalCount;
    List<IPCapPacket> allList = new ArrayList<IPCapPacket>();
    List<IPCapPacket> ipList = new ArrayList<IPCapPacket>();
    List<TCPCapPacket> tcpList = new ArrayList<TCPCapPacket>();
    List<UDPCapPacket> udpList = new ArrayList<UDPCapPacket>();

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    MainWindow window = new MainWindow();
                    window.frame.setVisible(true);
                    /*
                     * TimerTask task = new TimerTask(){
                     * 
                     * @Override public void run() { // TODO Auto-generated
                     * method stub
                     * 
                     * } }; Timer timer = new Timer(); timer.schedule(task,
                     * 1000);
                     */

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public MainWindow() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {

        frame = new JFrame();
        frame.setBounds(100, 100, 716, 641);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        JButton bt_start = new JButton("\u5F00\u59CB\u6355\u83B7");

        bt_start.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {

                if (null == nc) {
                    nc = devices[0];
                    box_packet_type_mode.setSelectedItem(nc);
                }

                try {
                    jpcap = JpcapCaptor.openDevice(nc, 2000, true, 20);
                    startCapThread(jpcap);
                } catch (Exception ef) {
                    ef.printStackTrace();
                    System.out.println("启动失败:  " + ef);
                }
            }
        });

        bt_start.setBounds(14, 145, 113, 27);
        frame.getContentPane().add(bt_start);

        JButton bt_stop = new JButton("\u505C\u6B62\u6355\u83B7");
        bt_stop.addMouseListener(new MouseAdapter() {

            @Override
            public void mouseClicked(MouseEvent e) {
                jpcap.close();
                // 移除监听
                receiver.removeListener();
            }
        });
        bt_stop.setBounds(159, 145, 113, 27);
        frame.getContentPane().add(bt_stop);

        JLabel label = new JLabel("\u76EE\u6807\u603B\u6570\uFF1A");
        label.setBounds(18, 89, 104, 18);
        frame.getContentPane().add(label);

        sp_total_size = new JSpinner();

        sp_total_size.setBounds(98, 85, 64, 24);
        frame.getContentPane().add(sp_total_size);


        JLabel label_1 = new JLabel("\u5F53\u524D\u65E0\u9650\u6355\u83B7");
        label_1.setBounds(171, 87, 134, 18);
        frame.getContentPane().add(label_1);

        JProgressBar progressBar = new JProgressBar();
        progressBar.setBounds(16, 567, 935, 14);
        frame.getContentPane().add(progressBar);

        // 包选择
        String[] s = { "All","IP", "TCP", "UDP" };
        box_packet_type = new JComboBox(s);
        box_packet_type.setBounds(159, 195, 113, 24);
        frame.getContentPane().add(box_packet_type);
        box_packet_type.addActionListener(new comboxListener());

        JLabel label_2 = new JLabel(
                "\u9009\u62E9\u6570\u636E\u5305\u7C7B\u578B\uFF1A");
        label_2.setBounds(14, 198, 202, 18);
        frame.getContentPane().add(label_2);

        // 网卡下拉菜单
        devices = JpcapCaptor.getDeviceList();
        box_packet_type_mode = new NetCardDataModel(devices);
        JComboBox box_netcard = new JComboBox(box_packet_type_mode);
        box_netcard.setBounds(98, 21, 174, 24);
        frame.getContentPane().add(box_netcard);

        JLabel label_3 = new JLabel("\u76EE\u6807\u7F51\u5361\uFF1A");
        label_3.setBounds(18, 24, 88, 18);
        frame.getContentPane().add(label_3);
        list = new JList();

        list.setBounds(18, 247, 677, 294);
        frame.getContentPane().add(list);
        JScrollPane scrollPane = new JScrollPane(list);
        scrollPane.setBounds(18, 247, 677, 294);
        frame.getContentPane().add(scrollPane);
        dlm = new DefaultListModel<Object>();

        LabelTotal = new JLabel("\u603B\u6570\uFF1A");
        LabelTotal.setFont(new Font("宋体", Font.PLAIN, 20));
        LabelTotal.setBounds(397, 24, 93, 18);
        frame.getContentPane().add(LabelTotal);

        LabelIP = new JLabel("IP\u6570\uFF1A");
        LabelIP.setFont(new Font("宋体", Font.PLAIN, 20));
        LabelIP.setBounds(397, 87, 93, 18);
        frame.getContentPane().add(LabelIP);

        LabelTCP = new JLabel("TCP\u6570\uFF1A");
        LabelTCP.setFont(new Font("宋体", Font.PLAIN, 20));
        LabelTCP.setBounds(397, 150, 93, 18);
        frame.getContentPane().add(LabelTCP);

        LabelUDP = new JLabel("UDP\u6570\uFF1A");
        LabelUDP.setFont(new Font("宋体", Font.PLAIN, 20));
        LabelUDP.setBounds(397, 213, 93, 18);
        frame.getContentPane().add(LabelUDP);

    }

    // 将每个Captor放到独立线程中运行
    public void startCapThread(final JpcapCaptor jpcap) {

        java.lang.Runnable rnner = new Runnable() {
            public void run() {
                // 使用接包处理器循环抓包
                receiver = new TestPacketReceiver();
                receiver.setCaptureListener(MainWindow.this);
                jpcap.loopPacket(spinner_num, receiver);
            }
        };
        capThread = new Thread(rnner);
        capThread.start();
        // 启动抓包线程
    }

    @Override
    public void capture(Object obj, String tpye, int totalCount, int curCount) {
        // TODO Auto-generated method stub
        allList.add((IPCapPacket)obj);
        LabelTotal.setText("全部:" + totalCount);

        if ("IP".equals(tpye)) {
            dlm.addElement((IPCapPacket) obj);
            ipList.add((IPCapPacket) obj);
            if (ipList.size() % 30 == 0) {
                list.setModel(dlm);
            }
            LabelIP.setText("IP:" + curCount);
        } else if ("TCP".equals(tpye)) {
            dlm.addElement((TCPCapPacket) obj);
            tcpList.add((TCPCapPacket) obj);
            if (tcpList.size() % 30 == 0) {

                list.setModel(dlm);
            }
            LabelTCP.setText("TCP:" + curCount);
        } else if ("UDP".equals(tpye)) {
            dlm.addElement((UDPCapPacket) obj);
            udpList.add((UDPCapPacket) obj);
            if (udpList.size() % 30 == 0) {
                list.setModel(dlm);
            }
            LabelUDP.setText("UDP:" + curCount);
        }
    }

    private class comboxListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            long o = e.getWhen();
            switch (box_packet_type.getSelectedItem().toString()) {
            case "All":
                dlm.clear();
                for (int i = 0; i < ipList.size(); i++) {
                    dlm.addElement((IPCapPacket)ipList.get(i));
                }
                break;
            case "IP":
                dlm.clear();
                for (int i = 0; i < ipList.size(); i++) {
                    dlm.addElement((IPCapPacket)ipList.get(i));
                }

                break;
            case "TCP":
                dlm.clear();
                for (int i = 0; i < tcpList.size(); i++) {
                    dlm.addElement((TCPCapPacket)tcpList.get(i));
                }
                break;
            case "UDP":
                dlm.clear();
                for (int i = 0; i <udpList.size(); i++) {
                    dlm.addElement((UDPCapPacket)udpList.get(i));
                }
                break;
            default:
                break;
            }

        }
    }

}

抓包监听

/**
 * 抓包监听器,实现PacketReceiver中的方法:打印出数据包说明
 * 
 */
class TestPacketReceiver implements PacketReceiver {

    CaptureListener captureListener;
    int totalCount = 0;
    static MongoDbHelper2 helper;
    int a, b, c;

    public TestPacketReceiver() {
        // TODO Auto-generated constructor stub
        helper = MongoDbHelper2.getInstance();
        helper.getConnection();
    }

    /**
     * 实现的接包方法:
     */
    public void receivePacket(Packet packet) {

        if (packet instanceof jpcap.packet.IPPacket) {
            IPPacket p = (IPPacket) packet;
            IPCapPacket pCapPacket = new IPCapPacket();
            // /192.168.1.102
            pCapPacket.setDestinationAddress(p.dst_ip + "");
            // /172.24.6.57
            pCapPacket.setSourceAddress(p.src_ip + "");
            // 4
            pCapPacket.setVersionAndlength(p.version + "");
            // 0
            pCapPacket.setTypeOfService(p.rsv_tos + "");
            // 212
            pCapPacket.setTotalLength(p.length + "");
            // 28372
            pCapPacket.setIdetifier(p.ident + "");
            // false0
            pCapPacket.setFlagsAndOffser(p.d_flag + "" + p.offset);
            // 59
            pCapPacket.setTimeToLive(p.hop_limit + "");
            // 17
            pCapPacket.setProtocol(p.protocol + "");
            // pCapPacket.setChecksum();
            a++;
            totalCount++;
            helper.insert(MongoDbHelper.IPCollection, pCapPacket);
            if (captureListener != null) {
                captureListener.capture(pCapPacket, "IP", totalCount, a);
            }

            // System.out.println("insert:"+m);
        }

        // Tcp包,在java Socket中只能得到负载数据
        if (packet instanceof jpcap.packet.TCPPacket) {
            TCPPacket p = (TCPPacket) packet;
            TCPCapPacket pCapPacket = new TCPCapPacket();
            pCapPacket.setDestinationAddress(p.dst_ip + "");
            pCapPacket.setDestinationPort(p.dst_port + "");

            pCapPacket.setDestinationAddress(p.src_ip + "");
            pCapPacket.setSourcePort(p.src_port + "");
            pCapPacket.setSerialNumber(p.sec + "");
            pCapPacket.setConfrimNumber(p.ack_num + "");
            pCapPacket.setWindowSize(p.window + "");
            // pCapPacket.setTcpCheckSum();
            pCapPacket.setUrgentPointer(p.urgent_pointer + "");
            b++;
            totalCount++;
            helper.insert(MongoDbHelper.TCPCollection, pCapPacket);
            if (captureListener != null) {
                captureListener.capture(pCapPacket, "TCP", totalCount, b);
            }
        }

        if (packet instanceof jpcap.packet.UDPPacket) {
            UDPPacket p = (UDPPacket) packet;
            UDPCapPacket udpCapPacket = new UDPCapPacket();
            udpCapPacket.setDestinationAddress(p.dst_ip + "");
            udpCapPacket.setDestinationPort(p.dst_port + "");
            udpCapPacket.setDestinationAddress(p.src_ip + "");
            udpCapPacket.setSourcePort(p.src_port + "");
            // udpCapPacket.setCheckSum();
            udpCapPacket.setUdpLength(p.len);

            c++;
            totalCount++;
            helper.insert(MongoDbHelper.UDPCollection, udpCapPacket);

            if (captureListener != null) {
                captureListener.capture(udpCapPacket, "UDP", totalCount, c);
            }
        }

    }


    public void setCaptureListener(CaptureListener captureListener) {
        this.captureListener = captureListener;
    }

    public void removeListener() {
        // TODO Auto-generated method stub
        captureListener = null;
    }

    interface CaptureListener {
        void capture(Object obj, String tpye, int totalNum, int curNum);
    }
}

以及三个封装包类和数据库连接类,这里就不贴代码了

猜你喜欢

转载自blog.csdn.net/irony0egoist/article/details/72779001
今日推荐