2012-11-02 9 views
1

나는 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); 

내가 코드 예제를 찾기 위해 시도했지만 성공하지. 미리 감사드립니다. 마틴

+0

을 제공, 원시 소켓으로 수행 할 작업은 다음 헤더 와이어 샤크 쇼를합니까? 0x003A 대신 0x3A00으로 오면 htnos()를 호출하여 바이트 순서를 바꿀 필요가 있습니다. – 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 당신에게 좋은 설명