Trying to write Java raw InputStream data as PCAP to view in Wireshark
I'm trying to build a transparent proxy in Java with the ability to record data that passed through to be viewed later in wireshark.
I was able to get the proxy working correctly with this snippet
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();
}
}
As you may notice I'm using Pcap4J to store raw bytes into a pcap file. The saving of the bytes works well but when I try to open it on wireshark it shows this message:
And every packet shows as malformed. Ideally I would be seeing TCP and CQL (Cassandra) packets.
Can anyone tell me what I'm doing wrong here?
What is
mInputStream
? What class is it an instance of?It needs somehow to be divided into packets, so that each
.read
call returns one packet. And if a packet is bigger than 262144 bytes, neither libpcap nor Wireshark support reading or writing it.It's just an InputStream directly from the Socket