2012-11-02 49 views
1

我想使用Libnet11功能:Libnet11建立IPv6數據包手動

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

對網絡層注入IPv6數據包。 我用Wireshark創建了IPv6數據包並將其捕獲到 。 Wireshark的報道: 畸形報文(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); 

我試圖找到代碼示例,但沒有成功。 預先感謝您。

馬丁

+0

什麼Wireshark的顯示下一個標題?您可能需要調用htnos()來翻轉字節順序,如果它以0x3A00而不是0x003A出現。 – PherricOxide

回答

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"); 
} 
0

雖然你可以用原始套接字創建它。我也必須做類似的事情,但找不到任何參考。

要使用原始套接字做到這一點,這link給你一個很好的解釋