Сохранять исходные данные Java InputStream как PCAP для просмотра в Wireshark - PullRequest
0 голосов
/ 19 ноября 2018

Я пытаюсь создать прозрачный прокси в Java с возможностью записи данных, которые были переданы для последующего просмотра в wireshark.

Мне удалось заставить прокси работать корректно с этим фрагментом

private static final int BUFFER_SIZE = 8192;

...

public void run() {
    PcapHandle handle = null;
    PcapDumper dumper;
    try {
        InetAddress addr = InetAddress.getByName("localhost");
        PcapNetworkInterface nif = Pcaps.getDevByAddress(addr);
        int snapLen = 65536;
        PcapNetworkInterface.PromiscuousMode mode = PcapNetworkInterface.PromiscuousMode.PROMISCUOUS;
        int timeout = 10;
        handle = nif.openLive(snapLen, mode, timeout);
        dumper = handle.dumpOpen("cap.pcap");
        byte[] buffer = new byte[BUFFER_SIZE];
        try {
            while (true) {
                int bytesRead = mInputStream.read(buffer);
                if (bytesRead == -1)
                    break; // End of stream is reached --> exit
                mOutputStream.write(buffer, 0, bytesRead);
                dumper.dumpRaw(Arrays.copyOfRange(buffer, 0, bytesRead));                    
                mOutputStream.flush();
            }
        } catch (IOException e) {
            // Read/write failed --> connection is broken
        }
        dumper.close();
    } catch (PcapNativeException e) {
        e.printStackTrace();
    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (NotOpenException e) {
        e.printStackTrace();
    }
}

Как вы можете заметить, я использую Pcap4J для хранения необработанных байтов в файле pcap.Сохранение байтов работает хорошо, но когда я пытаюсь открыть его на Wireshark, он показывает это сообщение:

Ошибка

И каждый пакет отображается как неправильно сформированный.В идеале я хотел бы видеть пакеты TCP и CQL (Cassandra).

Может кто-нибудь сказать мне, что я делаю здесь неправильно?

...