Как реализовать алгоритм PCA для извлечения признаков захваченных живых пакетов (с использованием библиотеки jpcap) в Java? - PullRequest
0 голосов
/ 06 января 2020

Как и в нескольких исследовательских работах [1] , [2] , [3] представляется целесообразным использовать Анализ основных компонентов (PCA) ) алгоритм извлечения признаков. Чтобы попытаться выполнить это sh, я создал программу анализатора traffi c в java, использующую библиотеку jpcap (фрагмент ниже), которая может извлекать различные функции из сетевого трафика c.

Но я не нашел способа реально реализовать это, поскольку кажется, что все существующие подходы (фрагменты ниже) работают с предварительно не организованными предварительно организованными наборами данных, такими как файлы ARFF.

Я видел ряд исследовательских работ [4] , [5] , [6] , которые ссылаются на использование алгоритма PCA в комбинации jpcap библиотека, в которой говорится, что я не смог найти объяснения того, как это было достигнуто.

Чтобы было ясно:

Мой вопрос, как я могу реализовать PCA (используя любой подход) для извлечения функций из живых пакетов (получаемых с помощью библиотеки pcap, на которую есть ссылка выше) в Java? как и другие (некоторые примеры приведены выше)

Пример Sniffer (с использованием библиотеки Jpcap)

Sniffer. java

import jpcap.JpcapCaptor;
import jpcap.NetworkInterface;
import jpcap.packet.Packet;
import jpcap.*;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.xml.bind.DatatypeConverter;
import java.util.List;
public class Sniffer {
    public static NetworkInterface[] NETWORK_INTERFACES;
    public static JpcapCaptor CAP;
    jpcap_thread THREAD;
    public static int INDEX = 0;
    public static int flag = 0;
    public static int COUNTER = 0;
    static boolean CaptureState = false;
    public static int No = 0;
    JpcapWriter writer = null;
    List<Packet> packetList = new ArrayList<>();
    public static ArrayList<Object[]> packetInfo = new ArrayList<>();
    public static void CapturePackets() {
        THREAD = new jpcap_thread() {
            public Object construct() {
                try {
                    CAP = JpcapCaptor.openDevice(NETWORK_INTERFACES[INDEX], 65535, false, 20);
                    // writer = JpcapWriter.openDumpFile(CAP, "captureddata");
                    if ("UDP".equals(filter_options.getSelectedItem().toString())) {
                        CAP.setFilter("udp", true);
                    } else if ("TCP".equals(filter_options.getSelectedItem().toString())) {
                        CAP.setFilter("tcp", true);
                    } else if ("ICMP".equals(filter_options.getSelectedItem().toString())) {
                        CAP.setFilter("icmp", true);
                    }
                    while (CaptureState) {
                        CAP.processPacket(1, new PacketContents());
                        packetList.add(CAP.getPacket());
                    }
                    CAP.close();
                } catch (Exception e) {
                    System.out.print(e);
                }
                return 0;
            }
            public void finished() {
                this.interrupt();
            }
        };
        THREAD.start();
    }
    public static void main(String[] args) {
        CaptureState = true;
        CapturePackets();
    }
    public void saveToFile() {
        THREAD = new jpcap_thread() {
            public Object construct() {
                writer = null;
                try {
                    CAP = JpcapCaptor.openDevice(NETWORK_INTERFACES[INDEX], 65535, false, 20);
                    writer = JpcapWriter.openDumpFile(CAP, "captured_data.txt");
                } catch (IOException ex) {
                    Logger.getLogger(Sniffer.class.getName()).log(Level.SEVERE, null, ex);
                }
                for (int i = 0; i < No; i++) {
                    writer.writePacket(packetList.get(i));
                }
                return 0;
            }
            public void finished() {
                this.interrupt();
            }
        };
        THREAD.start();
    }
}

PacketContents. java

import jpcap.PacketReceiver;
import jpcap.packet.Packet;
import javax.swing.table.DefaultTableModel;
import jpcap.packet.TCPPacket;
import jpcap.packet.UDPPacket;
import java.util.ArrayList;
import java.util.List;
import jpcap.packet.ICMPPacket;

public class PacketContents implements PacketReceiver {

    public static TCPPacket tcp;
    public static UDPPacket udp;
    public static ICMPPacket icmp;

    public void recievePacket(Packet packet) {
    }

    @Override
    public void receivePacket(Packet packet) {

        if (packet instanceof TCPPacket) {
            tcp = (TCPPacket) packet;

            Sniffer.packetInfo.add(new Object[] { sniffer.No, tcp.length, tcp.src_ip, tcp.dst_ip, "TCP", tcp.src_port,
                    tcp.dst_port, tcp.ack, tcp.ack_num, tcp.data, tcp.sequence, tcp.offset, tcp.header });

            sniffer.No++;

        } else if (packet instanceof UDPPacket) {

            udp = (UDPPacket) packet;

            Sniffer.packetInfo.add(new Object[] { sniffer.No, udp.length, udp.src_ip, udp.dst_ip, "UDP", udp.src_port,
                    udp.dst_port, udp.data, udp.offset, udp.header });

            sniffer.No++;

        } else if (packet instanceof ICMPPacket) {

            icmp = (ICMPPacket) packet;

            Sniffer.packetInfo.add(new Object[] { sniffer.No, icmp.length, icmp.src_ip, icmp.dst_ip, "ICMP",
                    icmp.checksum, icmp.header, icmp.offset, icmp.orig_timestamp, icmp.recv_timestamp,
                    icmp.trans_timestamp, icmp.data });

            sniffer.No++;

        }
    }
}

Использование библиотеки Weka для выполнения алгоритма PCA для файла ARFF

WekaPCA. java

package project;

import weka.core.Instances;
import weka.core.converters.ArffLoader;
import weka.core.converters.ConverterUtils;
import weka.core.converters.TextDirectoryLoader;
import java.io.File;
import org.math.plot.FrameView;
import org.math.plot.Plot2DPanel;
import org.math.plot.PlotPanel;
import org.math.plot.plots.ScatterPlot;
import weka.attributeSelection.PrincipalComponents;
import weka.attributeSelection.Ranker;

public class PCA {
    public static void main(String[] args) {
        try {
            // Load data
            String InputFilename = "kdd99.arff";

            ArffLoader loader = new ArffLoader();
            loader.setSource(new File(InputFilename));
            Instances data = loader.getDataSet();

            // Perform PCA
            PrincipalComponents pca = new PrincipalComponents();
            pca.setVarianceCovered(1.0);
            pca.setTransformBackToOriginal(false);
            pca.buildEvaluator(data);

            // Show transformed data
            Instances transformedData = pca.transformedData();
            System.out.println(transformedData);
        }
        catch (Exception e) {
            e.printStackTrace();
...