C -Libnet TCP标头结果均为零



我正在使用 libnet pcap

目的是在我的NIC上手动嗅探过滤的流量,寻找SYN数据包并使用RAW IPv4套接字创建SYN-ACK响应。

我使用pcap_loop()成功接收RAW SYN数据包。

在我的自定义packet_handler()中,我执行以下操作:

void packet_handler(u_char *user_args, const struct pcap_pkthdr *cap_header, const u_char *packet) {
    struct libnet_ipv4_hdr *ip = (struct libnet_ipv4_hdr *)(packet + LIBNET_ETH_H);
    struct libnet_tcp_hdr *tcp = (struct libnet_tcp_hdr *)(ip + (ip->ip_hl << 2));
    printf(
        "%s:%"PRIu16" > %s:%"PRIu16"t[seq: %"PRIu32"tack: %"PRIu32"]n",
        libnet_addr2name4(ip->ip_src.s_addr, LIBNET_DONT_RESOLVE),
        ntohs(tcp->th_sport),
        libnet_addr2name4(ip->ip_dst.s_addr, LIBNET_DONT_RESOLVE),
        ntohs(tcp->th_dport),
        ntohl(tcp->th_seq), ntohl(tcp->th_ack)
    );
}

作为打开TCP连接的结果,我得到了以下结果:

192.168.1.64:0 > 192.168.1.64:0 [seq: 0 ack: 0]

您可以看到IP标头正确读取,但是TCP标头未正确。特别是,问题是libnet_tcp_hdr标头字段,结果为零。

我在指针分配中做错了什么?

首先,您需要验证数据包处理程序仅接收带有TCP的IP数据包,而不是例如。udp。

但是,您的指针算术是错误的。指针AritMeTemet是根据指针的类型完成的,它不是基于字节。这意味着此代码:

struct libnet_tcp_hdr *tcp = (struct libnet_tcp_hdr *)(ip + (ip->ip_hl << 2));

ip->ip_hl << 2 * sizeof(struct struct libnet_ipv4_hdr字节添加到您的ip指针。

或者,如果您以另一种方式查看,则上述代码与:

完全相同
struct libnet_tcp_hdr *tcp = (struct libnet_tcp_hdr *)(&ip[ip->ip_hl << 2]);

可能会更清楚地显示发生的事情。

您需要将该代码更改为以下内容:

struct libnet_tcp_hdr *tcp = (struct libnet_tcp_hdr *)((unsigned char*)ip + (ip->ip_hl << 2));

相关内容

  • 没有找到相关文章

最新更新