Не могу получить данные (полезную нагрузку) из sk_buff - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь создать модуль для шифрования сетевых пакетов, но при попытке получить данные из sk_buff и распечатать их в Hexa не получим правильный пакет. Я использую этот метод для печати данных в гекса:

void pkt_hex_dump(struct sk_buff *skb)
{
    size_t len;
    int rowsize = 16;
    int i, l, linelen, remaining;
    int li = 0;
    uint8_t *data, ch;

    printk("Packet hex dump:\n");
    data = (uint8_t *) skb_mac_header(skb);

    if (skb_is_nonlinear(skb)) {
        len = skb->data_len;
    } else {
        len = skb->len;
    }

    remaining = len;
    for (i = 0; i < len; i += rowsize) {
        printk("%06d\t", li);

        linelen = min(remaining, rowsize);
        remaining -= rowsize;

        for (l = 0; l < linelen; l++) {
            ch = data[l];
            //data[l] = '1';
            printk(KERN_CONT "%02X ", (uint32_t) ch);
        }
        data += linelen;
        li += 10;

        printk(KERN_CONT "\n");
    }
}

Я использовал этот образец для создания приложения чата.

И output при отправке hello world сообщение от клиента к серверу:

[ 3981.963124] Packet hex dump:
[ 3981.963125] 000000   00 00 00 00 00 00 00 00 00 00 00 00 08 00 45 00
[ 3981.963128] 000010   00 34 6A 1F 40 00 40 06 D1 A2 7F 00 01 01 7F 00
[ 3981.963130] 000020   00 01 07 E4 BD 36 A2 52 E9 62 6D 40 3D FE 80 10
[ 3981.963133] 000030   02 00 FF 28 

И я пытаюсь следовать этому решению , но не могу получить никакого вывода.

Моя функция перехвата

static unsigned int hfunc( void *priv, struct sk_buff *skb, const struct nf_hook_state *state){

    struct iphdr *iph;          /* IPv4 header */
    struct tcphdr *tcph;        /* TCP header */
    uint16_t sport;
    uint16_t dport;
    struct ethhdr *ether = eth_hdr(skb);


    iph = ip_hdr(skb);          /* get IP header */
    tcph = tcp_hdr(skb);        /* get TCP header */
    sport = ntohs(tcph->source);
    dport = ntohs(tcph->dest);

      /* Watch only port of interest */
    if (dport == PTCP_WATCH_PORT || sport == PTCP_WATCH_PORT){



    printk(KERN_INFO "UDP packet is received: {'sport': %d; 'dport': %d}\n", sport, dport);



   printk("Source: %x:%x:%x:%x:%x:%x\n", ether->h_source[0], ether->h_source[1], ether->h_source[2], ether->h_source[3], ether->h_source[4], ether->h_source[5]);
   printk("Destination: %x:%x:%x:%x:%x:%x\n", ether->h_dest[0], ether->h_dest[1], ether->h_dest[2], ether->h_dest[3], ether->h_dest[4], ether->h_dest[5]);
   printk("Protocol: %d\n", ether->h_proto);


    pkt_hex_dump(skb);

    }
    return NF_ACCEPT;
}
...