PCAP Datei auslesen

Status
Nicht offen für weitere Antworten.
Hallo!

Ich such jetzt schon die ganze Zeit nach einer Java-API, die es ermöglicht PCAP-Dateien auszulesen. Ich habe jNetPCAP und jPCAP gefunden, aber weiß leider nicht, wie ich Dateien auslesen kann, nur wie ich von einem Device sniffern kann.

Aufgabenstellung ist folgende:
Mittels Wireshark wird Netzwerktraffic aufgezeichnet. Dieser Traffic wird wie üblich von Wireshark in eine PCAP-Datei gespeichert. Die Aufgabe des Javaprogramms ist es nun die PCAP-Datei einzulesen, den Traffic zu analysieren und dann in ein bestimmtes XML Format zu konvertieren.

Nur fehlt mir leider momentan der Ansatz wie man PCAP-Dateien mit Java am besten einliest, um dann deren Inhalt weiterverarbeiten zu können.

Bin sehr dankbar für jeden Hinweis!

lg,
Christian.
 
ähm .... du willst etwas derart aufwendiges (Zeit) programmieren und kannst noch nichtmal Java-Grundlagen? Ich würde dir empfehlen, zuallererst programmieren zu lernen und DANN etwas derartiges anzugehen.

Was du suchst befindet sich in der Klasse "File", darauf kann man einen "FileReader" legen, mittels FileReader.readLine() bekommst du einzelne Zeilen, optimalerweise so (etwas anders jetzt):
Code:
File bla = new File("C:/Dokumente und Einstellungen/meinedatei.txt");
BufferedReader in = new BufferedReader(new FileInputStream(bla));
while(in != null) {
   in.readLine();
}
 
christian8287 hat gesagt.:
weiß leider nicht, wie ich Dateien auslesen kann, nur wie ich von einem Device sniffern kann.
bei jpcap mit openFile statt openDevice in JpcapCaptor?

tha_specializt hat gesagt.:
ähm .... du willst etwas derart aufwendiges (Zeit) programmieren und kannst noch nichtmal Java-Grundlagen? Ich würde dir empfehlen, zuallererst programmieren zu lernen und DANN etwas derartiges anzugehen.
was soll denn der unsinn, der code dafür sind 3 zeilen (aufwändig?) und wo steht dass er kein java kann?
und dein code hilft ihm auch null. erstens wird er wohl wissen wie man ne datei ausliest, zweitens sind libpcap dumps binärdateien keien textdateien und drittens is dein code ne endlosschleife :applaus:
 
Anonymous hat gesagt.:
was soll denn der unsinn, der code dafür sind 3 zeilen (aufwändig?) und wo steht dass er kein java kann?
und dein code hilft ihm auch null. erstens wird er wohl wissen wie man ne datei ausliest, zweitens sind libpcap dumps binärdateien keien textdateien und drittens is dein code ne endlosschleife :applaus:
Tja, tha_specializt scheint sein möglichstes zu tun um schnell in der Troll Hierarchie aufzusteigen. Einfach ignorieren :roll:

EDIT:
*geteilt*
Wer sich den restlichen Unsinn des Spezialisten ansehen möchte, kann das hier tun
http://www.java-forum.org/de/viewtopic.php?p=438643
 
Danke für die Antwort.

Sollte ja ganz einfach funktionieren das auslesen. Nur verursacht mein Programm eine mir unbekannte java.lang.InstatiationException.

Mein Testprogramm sieht folgendermaßen aus:

Code:
public static void main(String[] args) {
        try {
            JpcapCaptor jc = JpcapCaptor.openFile("file.pcap");

            Packet p = jc.getPacket();
            
            System.out.println(p);
        }
        catch(IOException ioe) {
            
        }
    }

Jetzt bekomme ich folgende Exception:

Code:
Exception in thread "main" java.lang.InstantiationException: jpcap.packet.DatalinkPacket
        at jpcap.JpcapCaptor.getPacket(Native Method)
        at jpcaptest.Main.main(Main.java:28)
Java Result: 1

Weiß jemand, was das bedeuten kann? Hab mir auch schon Beispielcodes angesehen. Die sind ziemlich gleich aufgebaut, aber keine Rede von ner InstantiationException.

lg,
Christian.
 
Mach es doch selbst hab ich auch gemacht =)

Hab mir einen Hex-Editor geholt + Wireshare dann erst mal geschaut wo was steht.
Hier mal mein ergebnis :
Code:
package pcap_ReaderV2;

import java.io.DataInputStream;
import java.io.EOFException;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Date;
import java.util.Vector;



public class PcapDecode extends Thread{
	
	private static String pcapHeader = "";
	
	
	/***
	 * 
	 * Config Variablen
	 * 
	 */
	private boolean readinPcapHeader = false;
	private boolean invSpeicher = true;
	/***
	 * 
	 * Klassen referezen
	 * 
	 */
	private HexToInt conv = new HexToInt();
	private Vector<FramePcap> decodePcap = new Vector<FramePcap>();
	/***
	 * 
	 * Laufzeiger
	 * 
	 */
	private int frameNr = 1;
	private int zeiger = 0;
	private int wireBytes = 0;
	private int captureBytes = 0;
	private boolean frameHeaderRead = false;
	private String source = "";
	private String destination = "";
	private String sourceMac = "";
	private String destinationMac = "";
	private String time = "";
	private String date = "";
	private String tms = "";
	File pcapFile, logFile;
	boolean checkModus[] = { true, true };
	
	/***
	 *
	 * Methoden 
	 * 
	 */
	
	private PcapDecode(){
		
	}
	
	public PcapDecode(File input, File output, boolean ip, boolean ts){
		pcapFile = input;
		logFile = output;
	}
	public static void main(String[] args) {
		PcapDecode m = new PcapDecode();
		m.run();
	}
	
	public void run(){
		  DataInputStream din = null;
	      FileInputStream fin = null;
	      try {
			fin = new FileInputStream(pcapFile);
	      } catch (FileNotFoundException e) {
			e.printStackTrace();
	      }
	      din = new DataInputStream(fin);
	      String pcap = "";
	      String tmp = "";
	      int z = 0;
		  int buf;
		  	try{
		      while(true){
		    	  buf = din.readUnsignedByte();
		    	  tmp = Integer.toHexString(buf).toUpperCase();
		    	  if(conv.doIt(tmp) < 16){
		    		  pcap += "0" + Integer.toHexString(buf);
		    	  }else{
		    	  pcap += Integer.toHexString(buf);
		    	  }  
		    	  pcap = pcap.toUpperCase();
		    	  
		    	  /**
		    	   * Pcap Header
		    	   */
		    	  if(!readinPcapHeader){
			    	  if(22 < z){
			    		  
			    		  setPcapHeader(pcap);
			    		  pcap = "";
			    		  readinPcapHeader = true;
			    		  zeiger = 22 + 17;
			    	  }
		    	  }else{
			    	  
			    	  /**
			    	   * Frame Header
			    	   */
			    	  if(!frameHeaderRead){
				    	  if((z == zeiger)){
				    		  setFrameHeader(pcap);
				    		  pcap = "";
				    		  frameHeaderRead = true;
				    		  zeiger += wireBytes;
				    		  
				    	  }
			    	  }else{
				    	  /**
				    	   * Frame
				    	   */
			    		  if(z == zeiger){
			    			  getSourceAndDestinationIp(pcap);
			    			  getSourceAndDestinationEt(pcap);
			    			  pcap = "";
			    			  zeiger += 16;
			    			  frameHeaderRead = false;
			    			  decodePcap.addElement(new FramePcap(frameNr, wireBytes, captureBytes, source,destination,sourceMac,destinationMac,date,time));
			    			  frameNr++;
			    		  }
			    	  }
			    	  
			    	  
		    	  }
		    	  z++;
		      }
		  	}catch(EOFException e){
		  		try {
					din.close();
				} catch (IOException e1) {
					e1.printStackTrace();
				}
		  	} catch (IOException e) {
				e.printStackTrace();
			}
		  	
		  	if(logFile != null)
		  		writeLogFile();
		  		
	}
	PcapFilter ff = new PcapFilter();
	@SuppressWarnings("unchecked")
	public Vector getVec(){
			return decodePcap;
	}
	
	public void writeLogFile(){
		LogFileWrite log = new LogFileWrite(this.decodePcap, logFile);
		log.makeLog();
	}
	
	String getInvertHex(String hex){
		
		String invHex = "";
		
		for(int i = hex.length()-1;i>=0;i = i-2){
			invHex += hex.charAt(i-1);
			invHex += hex.charAt(i);
		}

		if(invSpeicher){
			return invHex;
		}else{
			return hex;
		}
	}
	
	void setPcapHeader(String pcap){
		pcapHeader = pcap;
		if(pcapHeader.charAt(pcapHeader.length()-1)==48){
				invSpeicher = true;
		}else{
				invSpeicher = false;
		}
	}
	
	void setFrameHeader(String pcap){
		getTimeStamp(pcap);
		String size = pcap.substring(16, pcap.length());
		wireBytes = (int)conv.doIt(getInvertHex(size.substring(8, size.length())));
		captureBytes = (int)conv.doIt(getInvertHex(size.substring(0, 8)));
	}
	
	void getTimeStamp(String frameHeader){
		
		String hexSec = this.getInvertHex(frameHeader.substring(0,8));
		String hexMilliSec = this.getInvertHex(frameHeader.substring(8,14));
		long sec = conv.doIt(hexSec);
		long milli = conv.doIt(hexMilliSec);
		Date test = new Date(sec*1000);
		tms = test.toString();
		date = tms.substring(0, 10);
		date = date.concat(" "+ tms.substring(tms.length()-4, tms.length()));
		time = tms.substring(11, 19);
		time = time.concat("."+milli);
	}
	
	void getSourceAndDestinationIp(String frame){
		source = "";
		destination = "";
		String hexSource = frame.substring(52, 60);
		String hexDestination = frame.substring(60,68);
		String tmp = "";
		hexSource = hexSource.toUpperCase();
		hexDestination = hexDestination.toUpperCase();
		for(int i = 0;i<=6;i+=2){
			tmp += String.valueOf(hexSource.charAt(i));
			tmp += String.valueOf(hexSource.charAt(i+1));
			source += conv.doIt(tmp);
			source += ".";
			tmp = "";
		}
		source = source.substring(0, source.length()-1);
		for(int i = 0;i<=6;i+=2){
			tmp += String.valueOf(hexDestination.charAt(i));
			tmp += String.valueOf(hexDestination.charAt(i+1));
			destination += conv.doIt(tmp);
			destination += ".";
			tmp = "";
		}
		destination = destination.substring(0, destination.length()-1);
	}
	
	void getSourceAndDestinationEt(String frame){
		sourceMac = "";
		destinationMac = "";
		String hdm = frame.substring(0,12);
		String hsm = frame.substring(12, 24);
		String tmp = "";
		for(int i = 0;i<12;i = i+2){
			tmp = tmp.concat(String.valueOf(hdm.charAt(i)));
			tmp = tmp.concat(String.valueOf(hdm.charAt(i+1)));
			tmp += ":";
		}
		tmp = tmp.substring(0,tmp.length()-1);
		destinationMac = tmp;
		tmp = "";
		for(int i = 0;i<12;i = i+2){
			tmp = tmp.concat(String.valueOf(hsm.charAt(i)));
			tmp = tmp.concat(String.valueOf(hsm.charAt(i+1)));
			tmp += ":";
		}
		tmp = tmp.substring(0,tmp.length()-1);
		sourceMac = tmp;
	}
	
}

Kannst es umbauen alle Methoden darin Post ich jetzt nicht kannst du ja selbst machen.
 
Ist in der Tat etwas "Uncreativ" das Rad neu zu erfinden statt dem Fehler auf die Spur zu gehen ...

- Alex
 
Also mich bringt sowas immer weiter 😉
Wenn ich nicht gleich was nehm was es schon gibt bzw ist auch langweile und es hat mir den gewünschten effect gebracht.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben