libnet tcp header 结果全为零
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 header 已正确读取,但 TCP header 未正确读取。
特别是,问题是 libnet_tcp_hdr
header 字段结果全为零。
我在指针赋值中做错了什么吗?
首先,您需要确认您的数据包处理程序只接收携带 TCP 的 IP 数据包,而不是例如UDP.
但是,你的指针算法是错误的。指针运算是基于指针的类型完成的,而不是基于字节的。这意味着此代码:
struct libnet_tcp_hdr *tcp = (struct libnet_tcp_hdr *)(ip + (ip->ip_hl << 2));
向您的 ip
指针添加 ip->ip_hl << 2 * sizeof(struct struct libnet_ipv4_hdr
个字节。
或者换个角度看,上面的代码完全一样:
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));
我正在使用 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 header 已正确读取,但 TCP header 未正确读取。
特别是,问题是 libnet_tcp_hdr
header 字段结果全为零。
我在指针赋值中做错了什么吗?
首先,您需要确认您的数据包处理程序只接收携带 TCP 的 IP 数据包,而不是例如UDP.
但是,你的指针算法是错误的。指针运算是基于指针的类型完成的,而不是基于字节的。这意味着此代码:
struct libnet_tcp_hdr *tcp = (struct libnet_tcp_hdr *)(ip + (ip->ip_hl << 2));
向您的 ip
指针添加 ip->ip_hl << 2 * sizeof(struct struct libnet_ipv4_hdr
个字节。
或者换个角度看,上面的代码完全一样:
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));