簡體   English   中英

libnet tcp標頭結果全部為零

[英]libnet tcp header results to be all zero

我正在使用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標頭字段全為零。

我在指針分配中做錯了嗎?

首先,您需要驗證您的數據包處理程序僅接收帶有TCP而不是UDP的IP數據包。

但是,您的指針算法是錯誤的。 指針算術是根據指針的類型完成的,而不是基於字節的。 這意味着此代碼:

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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM