Kraken HTTP Sniffer: ExceptionInInitializerError (Nutzt JNI)

Griffith

Neues Mitglied
Hallo,

auf der Suche nach einem TCP/IP-Stack und HTTP-Parser für libpcap bin ich auf Kraken PCAP und Kraken HTTP Decoder gestoßen. Dadurch ist es in Java möglich sämtlichen HTTP-Datenverkehr, der z.B. über www.youtube.com, übertragen wird mitzuschneiden. Damit das funktioniert muss allerdings ein PCAP-Netzwerktreiber im Betriebssystem installiert sein (unter Linux: libpcap; unter Windows: WinPCAP). Jeder der schonmal Wireshark benutzt hat, hat diesen Treiber bereits installiert.

Mein Problem ist, dass die Beispielanwendung Kraken HTTP Sniffer nicht startet. Diese Beispielanwendung besteht aus einer einzelnen .jar Datei und sollte eigentlich auf jedem System mit installiertem PCAP-Treiber sofort läuffähig sein. Trotzdem bricht das Javaprogramm sofort mit einem ExceptionInInitializerError ab.

Um aus Java aus auf libpcap zuzugreifen wird das JNI-Modul "kpcap" geladen. Die .dll bzw .so befindet sich in der .jar und wird normalerweise beim Start in das Arbeitsverzeichnis kopiert und dann geladen. Vermutlich liegt da der Fehler?

Download von KrakenHttpSniffer: kraken-http-sniffer-0.5.1-package.jar
Download von Wireshark (enthält den passenden Treiber): Wireshark Homepage

Command Line: java -jar kraken-http-sniffer-0.5.1-package.jar

Ausgabe mit Fehler:
Code:
[*] Device name is required
Error in GetInterfaceInfo
Exception in thread "main" java.lang.ExceptionInInitializerError
        at org.krakenapps.featurepack.sniffer.SnifferBase.run(SnifferBase.java:33)
        at org.krakenapps.featurepack.sniffer.http.HttpSniffer.main(HttpSniffer.java:20)
Caused by: java.lang.NullPointerException
        at java.util.Arrays$ArrayList.<init>(Unknown Source)
        at java.util.Arrays.asList(Unknown Source)
        at org.krakenapps.pcap.live.PcapDeviceManager.<clinit>(PcapDeviceManager.java:19)
        ... 2 more

Normalerweise sollte aber in der Ausgabe eine Liste aller Netzwerkinterfaces stehen ... z.B.:
Code:
[*] Device name is required
{BCEFC3FC-73EC-41C5-9EBC-25A4F645D748} MS Tunnel Interface Driver
{AFF4C6CC-2C74-485A-8A7F-807712D18A24} TAP-Win32 Adapter V8
{5E955A8C-E8A8-4A02-8EDB-161136A6886A} Microsoft
{FE8D1EF3-3E0B-46ED-B776-217C4F180D15} Marvell Yukon Ethernet Controller.
{A569FFF6-617E-4B48-92D3-D086C63857AD} Microsoft

Ich habe kaum Erfahrung mit Java und via Google und Javadocs bin ich bisher kein Stückchen weiter gekommen. Hab auch schon versucht den Autor des Beispielprogramms eine kurze E-Mail zu schreiben, allerdings gabs da seit 1 Woche leider noch keine Antwort ...

Wenn jemand ein paar Tipps hat, wie ich dieses Beispielprogramm zum Laufen bringen kann, bin ich wirklich dankbar dafür 🙂
 
Es knallt vermutlich an dieser Stelle:
Java:
cachedDeviceMetadataList = Arrays.asList(getDeviceList());
getDeviceList() ist native implementiert; lt. Konsolenausgabe geht hier etwas schief:
Code:
        GetInterfaceInfo(NULL, &lSize);
59	        pInfo = (PIP_INTERFACE_INFO)malloc(lSize);
60	
61	        if(GetInterfaceInfo(pInfo, &lSize) != NO_ERROR) {
62	                fprintf(stderr, "Error in GetInterfaceInfo\n");
63	                return NULL;
64	        }
Mit GetInterfaceInfo sind wir mitten im Windows-API; da hört es mit Source-Code-Analyse auf. Leider ist die Fehlerbehandlung im C-Code nicht so toll, sonst könnte man eventuell mehr sehen.
 
Ah. Danke für die schnelle Antwort.

Gut, dann weiß ich jetzt ja endlich wo ich suchen muss. Das ist schonmal das wichtigste.
Werd wohl nicht drum herum kommen, den C-Code selbst zu fixen. Bzw. zu versuchen 😱 🙁

Und wenn ich mir den C-Code so anschaue, dann vermute ich mal, dass es zumindest unter Linux sofort läuft.

Das merkwürdige ist: Der Fehler tritt nur auf, wenn ich versuche die fertige .jar auszuführen.
In der NetBeans-IDE als Maven-Projekt funktioniert es einwandfrei.

Dependencies: kraken-pcap-1.3.0
Und natürlich die .dll per Hand ins Arbeitsverzeichnis entpackt.

Java:
import org.krakenapps.pcap.live.*;

public class Test {
    public static void main(String[] args) {
        System.out.println("Device Enumeration:");
        for(PcapDeviceMetadata metadata : PcapDeviceManager.getDeviceMetadataList()) {
            System.out.println(metadata.getName() + " " + metadata.getDescription());
        }
    }
}
 
Zuletzt bearbeitet:

Zurück
Oben