首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >libnet报头结果为全为零。

libnet报头结果为全为零。
EN

Stack Overflow用户
提问于 2017-04-18 17:45:59
回答 1查看 204关注 0票数 0

我正在使用、libnet、pcap编写几行C代码。

其目的是在我的网卡上进行三路握手,手动嗅探过滤后的流量,查找SYN数据包,并使用原始ipv4套接字创建SYN响应。

我成功地使用pcap_loop()接收原始SYN数据包。

在我的自定义packet_handler()中,我执行以下操作:

代码语言:javascript
复制
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连接的结果,我得到了以下结果:

代码语言:javascript
复制
192.168.1.64:0 > 192.168.1.64:0 [seq: 0 ack: 0]

如您所见,IP报头被正确读取,但TCP报头没有读取。特别是,问题是libnet_tcp_hdr头字段,其结果是全部为零。

我在指针分配中做错什么了吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-18 17:55:50

首先,您需要验证您的数据包处理程序只接收包含TCP的IP数据包,而不是UDP。

但是,指针算法是错误的。指针是根据指针的类型来完成的,而不是基于字节。这意味着这个代码:

代码语言:javascript
复制
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指针中。

或者,从另一个角度来看,上面的代码与以下代码完全相同:

代码语言:javascript
复制
struct libnet_tcp_hdr *tcp = (struct libnet_tcp_hdr *)(&ip[ip->ip_hl << 2]);

这可能会更清楚地显示出正在发生的事情。

您需要将该代码更改为以下内容:

代码语言:javascript
复制
struct libnet_tcp_hdr *tcp = (struct libnet_tcp_hdr *)((unsigned char*)ip + (ip->ip_hl << 2));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43478940

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档