• 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文件的格式,以及协议的基本解析,因为会涉及到非常多的协议,在此不对数据包的具体内容进行解析。

  • 相关阅读:
    杂谈-论时间成本
    java笔记:排错5:误删maven target:恢复不了,怎么再生成
    十大经典排序(转发帖)
    java笔记(Idea,Maven):误删maven项目的target的class,怎么再生成target
    JDK解压版制作
    日常报错记录4:ssh工程复制粘贴顺序。
    欧朋Opera 浏览器(打不开百度)提示“您的连接不是私密连接”,解决办法
    日常报错记录2: MyBatis:DEBUG [main]
    JavaWeb-SQL-Servlet-JSP学做购物系统——日志一
    git 命令
  • 原文地址:https://www.cnblogs.com/baihl/p/10776031.html
Copyright © 2020-2023  润新知