[英]libnet tcp header results to be all zero
我正在使用libnet和pcap編寫一些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.