我正在使用libnet和pcap编写几行 C 代码。
目的是手动进行 3 次握手,在我的 NIC 上嗅探过滤后的流量,查找 SYN 数据包并使用原始 ipv4 套接字创建 SYN-ACK 响应。
我使用pcap_loop()
.
在我的自定义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
导致全为零的标题字段。
我在指针分配中做错了吗?