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