我正在使用、libnet、和pcap编写几行C代码。
其目的是在我的网卡上进行三路握手,手动嗅探过滤后的流量,查找SYN数据包,并使用原始ipv4套接字创建SYN响应。
我成功地使用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头字段,其结果是全部为零。
我在指针分配中做错什么了吗?
发布于 2017-04-18 17:55:50
首先,您需要验证您的数据包处理程序只接收包含TCP的IP数据包,而不是UDP。
但是,指针算法是错误的。指针是根据指针的类型来完成的,而不是基于字节。这意味着这个代码:
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));https://stackoverflow.com/questions/43478940
复制相似问题