Lesen Sie die Paketerfassung, die von tcpdump mit Java erhalten wurde

Ich möchte das Ergebnis der Paketerfassung mit tcpdump lesen, aber ich möchte es mit einem Programm lesen, anstatt es mit Wireshark zu überprüfen. Ich konnte es mit einer Java-Bibliothek namens pkts laden. Notieren Sie sich also, was ich getan habe.

Der Befehl, der die Erfassung durchgeführt hat

Ich möchte eine Liste der Kommunikationszieldomänen aus dem ersten SYN-Paket und der DNS-Antwort des TCP-Handshakes abrufen, daher stelle ich den Filter wie folgt ein

#Extrahieren Sie Pakete, die eine der folgenden Bedingungen erfüllen
# -Das SYN-Flag ist gesetzt und das ACK-Flag ist nicht gesetzt
# -Der Quellport ist 53(DNS)
sudo tcpdump -s 0 -i en0 -nn -w tcpdump.pcap \('(tcp[tcpflags] & tcp-syn)' != 0 and '(tcp[tcpflags] & tcp-ack) ==0'\) or src port 53

Wie man in Java liest

Ich habe eine Java-Bibliothek namens pkts verwendet. Einige der einfachen Implementierungsbeispiele sind wie folgt.

final Pcap pcap = Pcap.openStream("tcpdump.pcap");
pcap.loop(new PacketHandler() {
  @Override
  public boolean nextPacket(Packet packet) throws IOException {
    if (packet.hasProtocol(Protocol.UDP)) {
      System.out.println(packet.getPacket(Protocol.UDP).getPayload());
    }
  }  
}

Im Fall von IPv4 oder UDP können die Informationen des Header-Teils durch Erfassen des Pakets erfasst werden.

if (packet.hasProtocol(Protocol.IPv4)) {
  IPv4Packet ipv4Packet = (IPv4Packet) packet.getPacket(Protocol.IPv4);
  String srcIP = ipv4Packet.getSourceIP();
  String dstIP = ipv4Packet.getDestinationIP();
}

Wenn Sie den Inhalt von Payload lesen möchten, können Sie ihn mit der folgenden Methode als Byte-Array abrufen.

UDPPacket udpPacket = (UDPPacket) packet.getPacket(Protocol.UDP);
Buffer buffer = udpPacket.getPayload();
byte[] bytes = buffer.getArray();

Der Teil, der als DNS-Paket analysiert werden soll, muss von Ihnen unter Bezugnahme auf das DNS-Paketformat geschrieben werden. Im Fall von DNS ist dies etwas problematisch, da der Domänenteil und die Anzahl der Antworten variabel sind. Here ist eine sehr lose implementierte Version, die darauf abzielt, Zeichen einzulesen, ohne sich um das Format kümmern zu müssen.

Referenzierter Link

Recommended Posts

Lesen Sie die Paketerfassung, die von tcpdump mit Java erhalten wurde
[Java] Dateien in src / main / resources lesen
[Java] Beurteilung durch Eingabe von Zeichen in das Terminal
Lesen Sie JSON in Java
[Java] Ganzzahlige Informationen von Zeichen in der Textdatei, die mit der Methode read () erfasst wurden
Lesen Sie Binärdateien in Java 1
Lesen Sie die Standardeingabe in Java
Lesen Sie Binärdateien in Java 2
Korrigieren Sie den Zeichencode in Java und lesen Sie von der URL
Greifen Sie mit Java auf die Netzwerkschnittstelle zu
Errate den Zeichencode in Java
Lesen Sie die Java-Eigenschaftendatei in C #
Geben Sie den Java-Speicherort in eclipse.ini an
Lesen Sie CSV in Java (Super CSV Annotation)
Entpacken Sie die Zip-Datei in Java
Analysieren der COTOHA-API-Syntaxanalyse in Java
Rufen Sie die Super-Methode in Java auf
Webanwendungsstruktur nach Java und Verarbeitungsablauf in der Präsentationsschicht
[Java] Die Geschichte, dass das erwartete Array nicht von der String.split-Methode erhalten wurde.
Holen Sie sich das Ergebnis von POST in Java
Doppelte Karte sortiert nach Schlüssel in Java
Java-Referenz zum Verständnis in der Abbildung
Versuchen Sie es mit der Stream-API in Java
Rufen Sie die Windows-Benachrichtigungs-API in Java auf
Ich habe das neue Yuan-Problem in Java ausprobiert
[Java] Verwenden Sie kryptografische Technologie mit Standardbibliotheken
Notizen im Kopf organisieren (Java-Arrangement)
Versuchen Sie, den CORBA-Dienst unter Java 11+ aufzurufen
Was ist die Hauptmethode in Java?
Lesen Sie Felica mit RC-S380 (PaSoRi) in Java
Lesen Sie die xlsx-Datei in Java mit Selenium
So erhalten Sie das Datum mit Java
Die Geschichte von Java SE11 Silber erhalten
Die Geschichte des Schreibens von Java in Emacs
Konsoleneingabe in Java (Verständnis des Mechanismus)
Nach mehreren Feldern in der Klasse sortieren
[Java] Verschiedene Methoden, um den in List gespeicherten Wert durch iterative Verarbeitung zu ermitteln
[Java] Schreiben Sie die von mir in der Vergangenheit aus java.io.File erstellten Funktionen mit NIO.2 neu.
Analysieren Sie die Datums- und Zeitzeichenfolge, die von der asctime-Funktion der C-Sprache in Java formatiert wurde
Temporäres Support-Memo, wenn der Name des Methodenparameters der Java-Klasse nicht durch Reflektion im Eclipse-Plug-In-Projekt abgerufen werden kann
In Bezug auf transiente Modifikatoren und Serialisierung in Java
Verhindern von Fehlern im Logger-Namen durch Kopieren
Die Geschichte des einfachen String-Vergleichs in Java
[Java] Behandlung von Java Beans in der Methodenkette
Über die Verwirrung beim Starten von Java-Servern
Die Geschichte eines gewöhnlichen Othello in Java
Lesen Sie eine Zeichenfolge in einer PDF-Datei mit Java
Über die Idee anonymer Klassen in Java
ChatWork4j für die Verwendung der ChatWork-API in Java
Eine Geschichte über das JDK in der Java 11-Ära
Organisiertes Memo im Kopf (Java - Control Syntax)
Der in Java 10 eingeführte Schnittpunkttyp ist erstaunlich (?)
Die Geschichte des Lernens von Java in der ersten Programmierung
Messen Sie die Größe eines Ordners mit Java
Spüren Sie den Lauf der Zeit auch in Java
Notizen im Kopf organisieren (Java - Instance Edition)
Erfassen und speichern Sie die Selen-Installation in Java
Hinzufügen, Lesen und Löschen von Excel-Kommentaren mit Java
Organisiertes Memo im Kopf (Java - Datentyp)
Zeigen Sie "Hello World" im Browser mit Java an
Zeigen Sie "Hello World" im Browser mit Java an