libnet tcp头结果全部为零
我正在使用libnet和pcap编写几行C代码 其目的是手动执行3路握手,嗅探NIC上的过滤流量,查找SYN数据包,并使用原始ipv4套接字创建SYN-ACK响应 我使用libnet tcp头结果全部为零,c,sockets,libpcap,handshake,libnet,C,Sockets,Libpcap,Handshake,Libnet,我正在使用libnet和pcap编写几行C代码 其目的是手动执行3路握手,嗅探NIC上的过滤流量,查找SYN数据包,并使用原始ipv4套接字创建SYN-ACK响应 我使用pcap\u loop()成功接收原始SYN数据包 在我的自定义数据包处理程序()中,我执行以下操作: void packet_handler(u_char *user_args, const struct pcap_pkthdr *cap_header, const u_char *packet) { struct
pcap\u loop()
成功接收原始SYN数据包
在我的自定义数据包处理程序()
中,我执行以下操作:
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)
);
}
正如您所看到的,IP头被正确读取,但TCP头没有被正确读取。
特别是,libnet\u tcp\u hdr
头字段导致全部为零
指针分配是否有问题?首先,您需要验证数据包处理程序是否只接收承载TCP的IP数据包,而不是UDP 但是,您的指针算法是错误的。指针算术是基于指针的类型完成的,而不是基于字节。这意味着该代码:
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));
struct libnet\u tcp\u hdr*tcp=(struct libnet\u tcp\u hdr*)((unsigned char*)ip+(ip->ip\u hl我不必检查tcp数据包,因为我在pcap\u循环()之前过滤它。
。顺便说一句,答案非常清楚,谢谢!
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));