首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TCPDump / libpcap -查找有效负载数据的内存位置

TCPDump / libpcap -查找有效负载数据的内存位置
EN

Stack Overflow用户
提问于 2013-06-23 15:16:50
回答 1查看 562关注 0票数 0

我正在尝试使用libpcap查看进出环回网络适配器的http流量。我刚开始学习网络编程,对这个库完全陌生。多亏了我之前收到的answer,我成功地检测到了我机器的"lo0“适配器(Mac OSx)上的链路层类型。

代码语言:javascript
复制
//lookup link-layer header type
link_layer_type = pcap_datalink(handle);
if(link_layer_type == DLT_NULL){
    printf("DLT_NULL"); // this true in the case of "lo0"
}

Programming with Pcap指南假设每个分组将包含以太网报头。因此,用于查找数据包的有效载荷的逻辑如下:

代码语言:javascript
复制
 ethernet = (struct sniff_ethernet*)(packet);
    ip = (struct sniff_ip*)(packet + SIZE_ETHERNET);
    size_ip = IP_HL(ip)*4;
    if (size_ip < 20) {
        printf("   * Invalid IP header length: %u bytes\n", size_ip);
        return;
    }
    tcp = (struct sniff_tcp*)(packet + SIZE_ETHERNET + size_ip);
    size_tcp = TH_OFF(tcp)*4;
    if (size_tcp < 20) {
        printf("   * Invalid TCP header length: %u bytes\n", size_tcp);
        return;
    }
}

payload = (u_char *)(packet + SIZE_ETHERNET + size_ip + size_tcp);

当检查源自不存在以太网报头的环回接口的分组的内容时,该逻辑正在清除不起作用。Link-Layer Header Types documentation声明链路层类型"DTL_NULL“包含一个4字节的报头,该报头由一个包含网络层协议的PF_值组成(在我的例子中,我猜是IPv4 )。

根据上述信息..如何正确定位数据包的有效负载位置?

任何指导或信息都将不胜感激。谢谢!

EN

回答 1

Stack Overflow用户

发布于 2013-08-06 02:58:18

给出上述信息的

..如何正确定位数据包的有效负载位置?

对于DLT_NULL,您的程序应该将数据包数据的前4个字节提取为32位数字。如果您正在进行实时捕获,您可以按主机的字节顺序提取它,并将其与您的操作系统的AF_INETAF_INET6值进行比较(如果它有AF_INET6定义;目前大多数操作系统版本都应该支持IPv6);如果您正在读取捕获文件,则需要在pcap_is_swapped()返回非零值的情况下对该值进行字节交换(您也可以将其用于实时捕获;对于实时捕获,它总是返回0),并且您需要与几个不同的"IPv6“值(24、28和30)进行比较,每个值都表示某些特定操作系统上的"IPv6”(幸运的是,在所有支持DLT_NULL的OSes上,AF_INET都是2,因为它们都取自4.2BSD)。

如果该值是IPv4值(2,如上所述),那么在这4个字节之后,就有了数据包的IPv4报头。如果它是IPv6值之一,那么在这4个字节之后就有了数据包的IPv6报头。如果它不是这些值中的任何一个,那么它就是另一个协议。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17258519

复制
相关文章

相似问题

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