【问题标题】:libnet tcp header results to be all zerolibnet tcp 标头结果全为零
【发布时间】:2017-04-18 17:45:59
【问题描述】:

我正在使用 libnetpcap 编写几行 C 代码。

目的是进行 3 次握手,手动嗅探我 NIC 上的过滤流量,查找 SYN 数据包并使用原始 ipv4 套接字创建 SYN-ACK 响应。

我使用pcap_loop()成功接收原始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 标头字段导致全为零。

我在指针分配中做错了吗?

【问题讨论】:

    标签: c sockets libpcap handshake libnet


    【解决方案1】:

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

    但是,您的指针算法是错误的。指针算法是基于指针的类型完成的,而不是基于字节。这意味着这段代码:

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

    ip-&gt;ip_hl &lt;&lt; 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));
    

    【讨论】:

    • 我不必检查 TCP 数据包,因为我在 pcap_loop() 之前过滤它。对了,很明确的答案,谢谢!
    猜你喜欢
    • 1970-01-01
    • 2023-02-09
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 2012-04-13
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多