나는 Libnet11 기능을 사용하려합니다. IPv6 패킷을 생성하여 Wireshark와 함께 을 캡처했습니다. 와이어 샤크는보고 : 잘못된 패킷, 보여주는 내가 희망Libnet11 구축 IPv6 패킷 수동
가, 누군가가 최소한의 코드 예제 나를 도울 수 (Wireshark와 IPv6를 옆 헤더 값이 잘못 페이로드 크기가 내 의견에 너무 큰 것을 말한다) libnet11 (libnet_write_raw_ipv6())을 사용하여 수동으로 IPv6 패킷 (ICMPv6 확장 헤더 포함)을 작성하는 방법.
나는 최소한의 코드는 다음과 같을 수 있다고 가정합니다
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);
내가 코드 예제를 찾기 위해 시도했지만 성공하지. 미리 감사드립니다. 마틴
을 제공, 원시 소켓으로 수행 할 작업은 다음 헤더 와이어 샤크 쇼를합니까? 0x003A 대신 0x3A00으로 오면 htnos()를 호출하여 바이트 순서를 바꿀 필요가 있습니다. – PherricOxide