Tôi đã kết nối tcp_cleanup_rbuf() và tôi đang cố lấy thông tin cổng và IP ra khỏi hàng đợi skb. Nhưng nó có vẻ trống rỗng. Đúng không? Nó đã được miễn phí vào thời điểm đó chưa?
Đây là tập lệnh shell mà tôi đang thử nghiệm. Sửa đường dẫn đến thư mục nguồn hạt nhân của riêng bạn, chạy nó và cũng chạy một ncat --keep-open --listen 0.0.0.0 5555
và một ncat <máy chủ IP> 5555
.
xóa && 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 đã sao chép)
// 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;
$queue = (struct sk_buff_head *)$sock->sk_receive_queue;
printf("%p \t", $queue);
printf("%p \n", (struct sk_buff *) $sock->sk_receive_queue);
printf("%p \n", $queue->next);
printf("%p \n", $queue->prev);
printf("%u %u\n", $queue->qlen, arg1);
nếu(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
$proto = $iph->giao thức; // 6 - TCP 17 - UDP https://en.wikipedia.org/wiki/List_of_IP_protocol_numbers
$ipv = $iph->phiên bản; // 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",
liên lạc,
pid
);
printf("%s:%u\t>\t%s:%u\t%u\n",
ntop($iph->saddr),
(uint16)($th->nguồn << 8) | ($th->nguồn >> 8),
ntop($iph->daddr),
(uint16)($th->dest << 8) | ($th->dest >> 8),
kích thước $
);
}
}'
Nếu có ai biết liệu tôi có làm gì sai hay có chức năng nào tốt hơn để hook hay không, tôi sẽ rất cảm kích.