Am conectat tcp_cleanup_rbuf() și încerc să scot informațiile despre IP și portul din coada skb. Dar pare a fi gol. Este corect? A fost deja eliberat în acel moment?
Iată un script shell cu care testez. Remediați calea către propriul director sursă al nucleului, rulați-l și, de asemenea, executați un ncat --keep-open --listen 0.0.0.0 5555
si a ncat <IP server> 5555
.
clear && bpftrace -e '
#include „/usr/src/kernels/3.10.0-957.el7.x86_64/include/net/sock.h”
#include „/usr/src/kernels/3.10.0-957.el7.x86_64/include/net/tcp.h”
#include „/usr/src/kernels/3.10.0-957.el7.x86_64/include/net/ip.h”
#include „/usr/src/kernels/3.10.0-957.el7.x86_64/include/linux/skbuff.h”
// static void tcp_cleanup_rbuf (struct sock *sk, int copiat)
// https://elixir.bootlin.com/linux/v4.9/source/net/ipv4/tcp.c#L1416
//
kprobe:tcp_cleanup_rbuf / comm == "ncat" /
{
$sock = (struct sock *) arg0;
$skb = (struct sk_buff *) $sock->sk_receive_queue.next;
$coada = (struct sk_buff_head *)$sock->sk_receive_queue;
printf("%p \t", $coada);
printf("%p \n", (struct sk_buff *) $sock->sk_receive_queue);
printf("%p \n", $coada->next);
printf("%p \n", $coada->prev);
printf("%u %u\n", $coada->qlen, arg1);
dacă (1)
{
$iph = (struct iphdr *)($skb->head + $skb->network_header); // https://elixir.bootlin.com/linux/v4.9/source/include/uapi/linux/ip.h#L85
$th = (struct tcphdr *)($skb->head + $skb->transport_header); // https://elixir.bootlin.com/linux/v4.9/source/include/uapi/linux/tcp.h#L24
$protocol = $iph->protocol; // 6 - TCP 17 - UDP https://en.wikipedia.org/wiki/List_of_IP_protocol_numbers
$ipv = $iph->versiune; // 4 - IPv4 6 - IPv6
$size = (($iph->tot_len >> 8) | (($iph->tot_len & 0xff) << 8)) - ($th->doff * 4) - ($iph->ihl * 4) ;
printf("%s\t%u\t",
comm,
pid
);
printf("%s:%u\t>\t%s:%u\t%u\n",
ntop($iph->saddr),
(uint16)($th->sursa << 8) | ($th->sursa >> 8),
ntop($iph->daddr),
(uint16)($th->dest << 8) | ($th->dest >> 8),
$size
);
}
}'
Dacă știe cineva dacă am făcut ceva greșit sau o funcție mai bună de conectat, aș fi foarte recunoscător.