zoukankan      html  css  js  c++  java
  • cap文件格式解析

    简介

      cap包为通过抓包软件保存下来的数据包文件,不同的抓包软件保存下来的cap包格式也有很大差异,从最开始的4个字节便可以看出,如下列出不同抓包软件的cap包文件前4字节的差异

    #define CAP_SNIFFER_WINDOWS_200X        "x58x43x50x00"  //sniffer抓包的cap文件
    #define PCAP_WIRESHARK_TCPDUMP          "xd4xc3xb2xa1   //wireshark抓包的pcap文件
    

       以下以sniffer抓包的cap文件为示例,但也会介绍下其他cap文件的基本格式。

      如下是sniffer cap文件头4个字节:

      如下为其他cap文件头4个字节:

    cap文件格式

      cap文件开始有128字节的文件头部分,接下来是抓获到的数据包部分,包括40字节的数据头和数据内容部分,具体的数据内容的长度需要根据数据头部分确定。cap文件大概结构如下:

      在此说明下,除了sniffer抓的文件,其他cap文件的格式区别如下,cap文件开始是24字节的文件头部分,接下来同样是数据包部分,包括16字节的数据头和数据内容部分,具体的数据内容的长度同样需要数据头部分确定。

      以上结构中数据内容部分包括从数据链路控制层头开始,然后IP报头,传输层报头,最后到传输层以及后续的应用层数据。

    数据头格式

      sniffer的128字节或其他类型cap文件的前16字节的文件头部分在此只是取出前4个字节作为区分cap文件类型,其他数据没有用到。所以现在直接开始介绍数据头部分。sniffer的数据头部分为40字节,具体的结构类型如下:

      其他类型cap文件的数据头部分格式如下,长度为16字节:

    struct tcpdump_record_head {
    	unsigned int time_seconds;  //精确到秒的时间戳
    	unsigned int time_microsecondes; //精确到毫秒的时间戳
    	unsigned int len;   //数包长度:标识所抓获的数据包保存在cap文件中的实际长度,以字节为单位。
    	unsigned int len_copy; //数据包实际长度:所抓获的数据包真实的长度,如果文件中保存不是完整的数据包,那么这个值可能要比前面的数据包长度的值大
    };
    

    数据内容解析

      根据以上读取出头部信息中的数据长度,截取相应长度的数据内容进行解析,以下根据协议层数只解析每层协议头部的个别字段,通过此方式对数据内容进行逐层解析。

    1、首先解析数据链路层协议

      对数据内容跳转12个字节,过滤MAC信息,获取2字节的协议类型字段,此字段标志着数据链路层的下一层是什么协议,对获取出的2字节数据需要进行网络字节序到主机字节序的转换,然后与如下数据进行比较确定下层协议类型:

    0x86DD /*ipv6*/ 
    0x0800 /* ipv4 */
    0x8847 /* MPLS unicast */
    0x8848 /* MPLS multicast */
    0x0806 /* arp */
    0x8035 /* rarp */
    0x8863 /* PPPoE protocol */
    

     2、网络层

      通过以上方式获取下层协议的类型后,下边我们以ipv4作为示例,假设数据内容的网络层是IPV4,ipv4网络层的数据内容第1个字节就包含了ip协议的版本号和ip层的头长度,具体内容如下:

      上图中的45,4表示为IPV4,5*4(ip头部长度计算方式需要乘以4)表示ip头部长度,因为这次只获取出1字节内容,所以没必要对数据进行字节序转换。

      下边是IP的数据包格式:

      

      各字段的含义如下:

    3、传输层

      通过以上方式知道了网络层头部长度,可以直接跳过网络层头部部分,下边开始解析传输层。传输层分为TCP和UDP,下边以TCP作为示例,如下是TCP报文格式:

      根据以上TCP报文格式可知如果想获取TCP头部长度,需要跳过12个字节,获取4位首部长度,为了方便获取,我们会直接获取两个字节(16位)数据,并对获取的数据进行字节序转换,然后获取4位首部长度。如下为实现的代码示例:

    short tcpHeaderLenAndFlag = 0;
    int tcpHeaderLen = ((ntohs(tcpHeaderLenAndFlag)&0xF000)>>12) * 4; //TCP头部的长度同样需要乘以4
    

     4、应用层

      通过上诉方式可以获取TCP的首部长度,直接跳过TCP层来到应用层,因为没有对TCP层进行详细解析,目前无法获取应用层协议的具体协议信息。

    通过以上方式解析完数据头和数据内容后,按照cap文件的格式,下边又会是数据头和数据内容,直到把cap文件全部解析完。

    总结

      本次简单介绍了cap文件的格式,以及协议的基本解析,因为会涉及到非常多的协议,在此不对数据包的具体内容进行解析。

  • 相关阅读:
    ubuntu c++ 关机 重启 挂起 API
    Java 并发 —— Java 标准库对并发的支持及 java.util.concurrent 包
    机器学习: Logistic Regression--python
    机器学习:朴素贝叶斯--python
    理解YOLOv2训练过程中输出参数含义
    darknet YOLO 编译使用GPU
    机器学习:决策树--python
    Xmodem通信协议实例
    MQTT协议笔记之连接和心跳
    Android实现推送方式解决方案
  • 原文地址:https://www.cnblogs.com/baihl/p/10776031.html
Copyright © 2011-2022 走看看