はじめに

前回の記事ではpacketソケットを使用してパケットを作成した。今回はlibnetというライブラリを使用してパケットICMP Echo requestパケットを作成、送信する。

書式

libnet_t* libnet_init   (
                int     injection_type,
                char *      device,
                char *      err_buf  
          )     
  • injection_type:
    パケットインジェクションタイプ (LIBNET_LINK, LIBNET_LINK_ADV, LIBNET_RAW4, LIBNET_RAW4_ADV, LIBNET_RAW6, LIBNET_RAW6_ADV)
  • device:
    使用するインターフェース
  • err_buf:
    エラーメッセージの格納場所

あとは、libnet_build_icmpv4_echo関数でicmp、libnet_build_ipv4関数でipヘッダを構築し、libnet_writeで送信する。尚、主な関数の使い方はここに載っている。

コードを書いてみる

#include <stdio.h>
#include <stdlib.h>
#include <libnet.h>

int main(int argc, char** argv[]) {
    libnet_t *l;
    int ifd, id, seq;
    u_int32_t sip, dip;
    char errbuf[LIBNET_ERRBUF_SIZE];
    char *interface = "wlan0";    

    l = libnet_init(LIBNET_RAW4, interface, errbuf);
    if(l == NULL) {
        printf("libnet_init: %s\n", errbuf);
        exit(1);
    }

    libnet_seed_prand(l);
    id = libnet_get_prand(LIBNET_PRu32);
    seq = libnet_get_prand(LIBNET_PRu32);
    libnet_build_icmpv4_echo(
            ICMP_ECHO,  //u_int8_t type
            0,           //u_int8_t code
            0,           //u_int16_t sum
            1,           //u_int16_t id
            seq,        //u_int16_t seq
            NULL,        //u_int8_t* payload
            0,           //u_int32_t payload_s
            l,          //libnet_t* l
            0            //libnte_ptag_t ptag
        );

    sip = libnet_name2addr4(l, "192.168.1.5", LIBNET_DONT_RESOLVE);
    dip = libnet_name2addr4(l, "192.168.1.1", LIBNET_DONT_RESOLVE);

    libnet_build_ipv4(
            LIBNET_IPV4_H + LIBNET_ICMPV4_ECHO_H, //u_int16_t ip_len
            0,                //u_int8_t tos
            id,              //u_int16_t id
            0,                //u_int16_t frag
            64,           //u_int8_t ttl
            IPPROTO_ICMP,    //u_int8_t prot
            0,                //u_int16_t sum
            sip,             //u_int32_t src
            dip,             //u_int32_t dst
            NULL,             //u_int8_t* payload
            0,                //u_int32_t payload_s
            l,               //libnet_t* l
            0                 //libnet_ptag_t ptag
        );

    if(libnet_write(l) == -1) {
        printf("libnet_write: %s\n", libnet_geterror(l));
        exit(1);
    }

    libnet_destroy(l);

    return 0;
}

このようにlibnetを使えば簡単にパケットを作成することができる。


0件のコメント

コメントを残す

アバタープレースホルダー

メールアドレスが公開されることはありません。 が付いている欄は必須項目です