Libnet11 создает пакет IPv6 вручную

Я пытаюсь использовать функцию Libnet11:

int libnet_write_raw_ipv6 (libnet_t *l, u_int8_t *packet, u_int32_t size)

для ввода пакета IPv6 на сетевом уровне. Я создал пакет IPv6 и перехватил его с помощью Wireshark. Wireshark сообщил: неверный формат пакета (wireshark сообщает, что следующее значение заголовка в IPv6 неверно, а размер полезной нагрузки, на мой взгляд, слишком велик)

Надеюсь, кто-нибудь поможет мне с минимальным примером кода, показывающим, как вручную создать пакет IPv6 (с заголовком расширения ICMPv6) с помощью libnet11 (libnet_write_raw_ipv6()).

Я предполагаю, что минимальный код может выглядеть так:

packet_len = 40 + 16; // 40B ~ IPv6 packet, 16B ~ ICMPv6 header
u_char *buf = NULL;

struct ip6_hdr *ip6 = NULL;
struct icmp6_hdr *icmp6 = NULL;

l = libnet_init();
if ( (buf = malloc(packet_len)) == NULL ) {
    // error
}

// create IPv6 header
ip6 = (struct ip6_hdr *) buf;
ip6->ip6_flow   = 0;
ip6->ip6_vfc    = 6 << 4;
ip6->ip6_plen   = 16;              // ICMPv6 packet size
ip6->ip6_nxt    = IPPROTO_ICMPV6;  // 0x3a
ip6->ip6_hlim   = 64;
memcpy(&(ip6->ip6_src), &src_addr, sizeof(struct in6_addr));
memcpy(&(ip6->ip6_dst), &dst_addr, sizeof(struct in6_addr));

// create ICMPv6 header
icmp6 = (struct icmp6_hdr *) (buf + 40); // 40B ~ IPv6 packet size
icmp6->icmp6_type = ICMP6_ECHO_REQUEST;
icmp6->icmp6_code = 0;
icmp6->icmp6_cksum= 0;
icmp6->icmp6_data32[0] = 0;

libnet_do_checksum(l, (u_int8_t *)buf, IPPROTO_ICMPV6, packet_len);

written = libnet_write_raw_ipv6(l, buf, packet_len);
if ( written != packet_len )
    perror("Failed to send packet");

libnet_destroy(l);
free(buf);

Я пытался найти примеры кода, но безуспешно. Заранее спасибо.

Мартин


person user1793850    schedule 02.11.2012    source источник
comment
Что показывает wireshark для следующего заголовка? Возможно, вам придется вызвать htnos(), чтобы изменить порядок байтов, если он подходит как 0x3A00 вместо 0x003A.   -  person PherricOxide    schedule 14.11.2012


Ответы (2)


Если вы используете C++, я бы порекомендовал вам libtins, пакет, создающий библиотеку анализатора. Этот короткий фрагмент делает именно то, что вы хотите:

#include <tins/tins.h>

using namespace Tins;

void test(const IPv6Address &dst, const IPv6Address &src) {
    PacketSender sender;
    IPv6 ipv6 = IPv6(dst, src) / ICMPv6();
    ipv6.hop_limit(64);
    sender.send(ipv6);
}

int main() {
    // now use it
    test("f0ef:1234::1", "f000::1");
}
person mfontanini    schedule 07.02.2013

Однако вы можете создать его с необработанными сокетами. Я также должен был сделать что-то подобное, но не мог найти ничего в качестве ссылки.

Чтобы сделать это с необработанными сокетами, эта ссылка дает вам хорошее объяснение

person Akshay    schedule 17.03.2014