首页 文章

jNetPcap - 分析来自PCAP文件的ARP数据包

提问于
浏览
2

我正在尝试使用Java的jNetPcap库获取有关PCAP文件中的ARP数据包的信息 . 我真正想要的是读取以太网帧内的源地址和目标地址,以及ARP数据包中的发送方MAC和目标MAC .

到目前为止,我已经能够加载PCAP文件,遍历数据包捕获中的所有数据包,并显示那些确实属于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 回答

  • 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)

    以下是jnetpcap javadocs中的 Arp 类函数:

    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.`
    

相关问题