我正在尝试使用 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);
我试图找到代码示例,但没有成功。 提前谢谢。
马丁
答案 0 :(得分:0)
如果你正在使用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");
}
答案 1 :(得分:0)
您可以使用原始套接字创建它。我也必须做类似的事情,但无法找到任何作为参考。
要使用原始套接字执行此操作,link为您提供了一个很好的解释