Jnetpcap, подготовка пакета UDP / TCP / IP / ICMP - PullRequest
6 голосов
/ 15 ноября 2011

В последнее время я использую Jnetpcap для отправки / получения необработанных пакетов по сети.

Jnetpcap обеспечивает отправку пакетов Pcap.sendPacket(). Этот метод получает необработанный буфер или байты для отправки.

С другой стороны, есть org.jnetpcap.protocol.* классы, которые обертывают заголовки протокола, и мы можем использовать их для декодирования захваченных пакетов.

Когда я использую приведенный ниже код для создания Ip4 пакета, это вызывает исключение NullPointerException:

import org.jnetpcap.protocol.network.Ip4;

public class Test {

    public static void main(String[] args) {

        Ip4 ip4 = new Ip4();

        ip4.ttl(10);

    }
}

Ошибка:

Exception in thread "main" java.lang.NullPointerException
    at org.jnetpcap.nio.JBuffer.check(Unknown Source)
    at org.jnetpcap.nio.JBuffer.setUByte(Unknown Source)
    at org.jnetpcap.protocol.network.Ip4.ttl(Unknown Source)
    at jaeger.Test.main(Test.java:17)

Как я могу собрать этот пакет и затем отправить его по Pcap.sendPacket()?

Примечание: меня действительно не интересует подготовка пакетов побайтно ... C / C ++ libpcap и Jpcap имеют работающую функциональность, но я хочу использовать Jnetpcap!

Ответы [ 2 ]

8 голосов
/ 28 февраля 2012

1) Код вызывает исключение, поскольку классы-оболочки работают только с использованием ранее выделенных буферов, поскольку основная цель библиотеки - анализ буферов захваченных пакетов.Поэтому перед их использованием необходимо выделить буфер.

2) Пакеты должны быть собраны с предоставлением всех необходимых байтов.Но код можно записать так, чтобы действительно было необходимо всего несколько байтов (см. Выше).

3) sendPacket ожидает целый пакет, полный кадр Ethernet.Таким образом, заголовки Ethernet, IP, TCP и полезная нагрузка должны быть записаны в буфер.

4) Основная идея, позволяющая использовать классы-оболочки, состоит в том, чтобы выделить буфер и затемоставив библиотеку, отсканируйте ее, чтобы обнаружить заголовки, но необходимо предоставить минимум информации (байты).

JMemoryPacket packet = new JMemoryPacket(packetSize);
packet.order(ByteOrder.BIG_ENDIAN); 

Фрейм Ethernet требуется тип протокола (0x0800) в позиции 12:

packet.setUShort(12, 0x0800);
packet.scan(JProtocol.ETHERNET_ID); 

После scan можно получить экземпляр Ethernet и использовать сеттеры :

Ethernet ethernet = packet.getHeader( new Ethernet() );  
ethernet.destination(...);
...

заголовок IP4 требуется версия (0x04) и размер (0x05) в позиции 14:

packet.setUByte(14, 0x40 | 0x05);
packet.scan(JProtocol.ETHERNET_ID);  

Ip4 ip4 = packet.getHeader( new Ip4() );
ip4.type(0x06); //TCP
ip4.length( packetSize - ethernet.size() );
ip4.ttl(...);  
...

заголовок TCP необходим размер (0x50):

packet.setUByte(46, 0x50);
packet.scan(JProtocol.ETHERNET_ID);  

Tcp tcp = packet.getHeader( new Tcp() );  
tcp.seq(...); 
...

Итак, полезная нагрузка:

Payload payload = packet.getHeader( new Payload() );
payload.set...(...);
...

И, наконец:

pcap.sendPacket( ByteBuffer.wrap( packet.getByteArray(0, packet.size() )  );

5) За один раз можно записать все необходимые байты, чтобы избежать стольких вызовов метода сканирования.

1 голос
/ 19 ноября 2011

Вы сталкиваетесь с проблемой как писать подхедеры на jNetPcap ? Да, JNetPcap принимает байты для отправки, но содержимое может быть заполнено подзаголовками с помощью, которую я оказал. Если затем вы хотите отправить некоторые данные внутри пакета, многие типы Java имеют функцию toBytes() или аналогичную.

редактирование:
API этого определенного класса Icmp здесь . Аналогичным образом можно сделать другие классы по данной ссылке. Просто откройте Google и укажите «Ссылка на класс Icmp jnetpcap» или что-то еще для других типов заголовков.

edit2:
Более простой способ создания ICMP-пакета - это класс ICMPPacket , который имеет простой конструктор для ICMP-пакета, в котором заголовки создаются в одном вызове конструктора. Согласно справочному классу это делает следующее:

Расширяет пакет IP, добавляя заголовок ICMP и полезную нагрузку данных ICMP.

...