jNetPcap — анализ пакетов ARP из файла PCAP

#java #network-protocols #pcap #arp #jnetpcap

#java #сетевые протоколы #pcap #arp #jnetpcap

Вопрос:

Я пытаюсь получить информацию о пакетах ARP в файле PCAP, используя библиотеку jNetPcap для Java. Что мне действительно нужно, так это считывание адресов источника и назначения во фрейме Ethernet, а также MAC-адреса отправителя и целевого MAC-адреса в пакете ARP.

До сих пор мне удавалось загружать файл PCAP, перебирать все пакеты в системе захвата пакетов и отображать номера пакетов (Frame Number) для тех пакетов, которые действительно относятся к протоколу ARP.

Как мне получить необходимую дополнительную информацию?

Вот мой код на данный момент:

 package firstjavapcaptest;

import org.jnetpcap.Pcap;
import org.jnetpcap.packet.PcapPacket;
import org.jnetpcap.packet.PcapPacketHandler;
import org.jnetpcap.protocol.lan.Ethernet;
import org.jnetpcap.protocol.network.Arp;
import org.jnetpcap.protocol.tcpip.Tcp;

public class FirstJavaPcapTest {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        // TODO code application logic here

        final StringBuilder errbuf = new StringBuilder(); // for any error messages
        final String file = "Z:\test_pcap.pcap";
        Tcp tcp = new Tcp(); // Preallocate a TCP header
        Arp arp = new Arp(); // Preallocate a ARP header
        System.out.printf("Opening file for reading: %s%n", file);  

        Pcap pcap = Pcap.openOffline(file, errbuf);  
        if (pcap == null) {  
            System.err.printf("Error while opening device for capture: "   errbuf.toString());  
            return;  
        }  

        PcapPacketHandler<String> jphArp = new PcapPacketHandler<String>() { 
            public void nextPacket(PcapPacket packet, String user) {
                Ethernet ethh  = new Ethernet();
                if (packet.hasHeader(arp)) {
                    System.out.println("["   packet.getFrameNumber()   "]");
                }
            }
        };

        try {  
            pcap.loop(-1, jphArp, "");
        } finally {  
            pcap.close();  
        }
    }

}
  

Ответ №1:

Какую версию jnetpcap вы используете? Я предполагаю 1.3. Следующее взято из статьи Википедии о смещениях в протоколе ARP:

...
8 Sender hardware address (SHA) (first 2 bytes)
10 (next 2 bytes)
12 (last 2 bytes)
14 Sender protocol address (SPA) (first 2 bytes)
16 (last 2 bytes)
18 Target hardware address (THA) (first 2 bytes)
20 (next 2 bytes)
22 (last 2 bytes)
24 Target protocol address (TPA) (first 2 bytes)
26 (last 2 bytes)

И ниже приведены функции класса Arp из javadocs jnetpcap:

 byte[]  sha()            Sha.
int     shaLength()      Sha length.
byte[]  spa()            Spa.
int     spaLength()      Spa length.
int     spaOffset()      Spa offset.
byte[]  tha()            Tha.
int     thaLength()      Tha length.
int     thaOffset()      Tha offset.
byte[]  tpa()            Tpa.
int     tpaLength()      Tpa length.
int     tpaOffset()      Tpa offset.`