pcap文件格式和wireshark解析

发表于:2018-9-03 11:24

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:inns    来源:博客园

  pcap文件头
  用python代码表达结构如下,I是32位无符号数,下面的定义均采用32位方式
  # bpf_u_int32 magic;  固定为0xA1B2C3D4,表示pcap包文件
  # u_short version_major; 主版本号
  # u_short version_minor; 分支版本号
  # bpf_int32 thiszone; 时区
  # bpf_u_int32 sigfigs;
  # bpf_u_int32 snaplen; 每个包的最大长度
  # bpf_u_int32 linktype; 链路层协议族
  self.struct_pcap_file_header = '!I2H4I'

  pcap每个包的头
  # struct timeval ts;
  # bpf_u_int32 caplen;
  # bpf_u_int32 len;
  self.struct_pcap_pkthdr = '!4I'

  timeval是c的时间戳结构体,前面一个整型数是秒数偏置,后面一个整型数是微秒偏置,详情可以查阅相关文档
  生成pcap文件
  使用python简单生成,写入到test.pcap文件,写入了两个包到该文件,linktype设置为162,在wireshark源码中表示保留给用户的USER15 类型
  # -*-coding:utf-8-*-
  """
  Author:yinshunyao
  Date:2017/3/24 0024上午 10:47
  """
  import unittest
  import struct
  class PacpTest(unittest.TestCase):
  def setUp(self):
  # pcap文件头格式
  # http://www.winpcap.org/docs/docs_412/html/structpcap__file__header.html
  # bpf_u_int32 magic;  固定为0xA1B2C3D4,表示pcap包文件
  # u_short version_major; 主版本号
  # u_short version_minor; 分支版本号
  # bpf_int32 thiszone; 时区
  # bpf_u_int32 sigfigs;
  # bpf_u_int32 snaplen; 每个包的最大长度
  # bpf_u_int32 linktype; 链路层协议族
  self.struct_pcap_file_header = '!I2H4I'
  # pcap包头格式
  # http://www.winpcap.org/docs/docs_412/html/structpcap__pkthdr.html
  # struct timeval ts;
  # bpf_u_int32 caplen;
  # bpf_u_int32 len;
  self.struct_pcap_pkthdr = '!4I'
  # 文件头
  self.file_header = struct.pack(
  self.struct_pcap_file_header,
  0xA1B2C3D4, 4, 1, 0, 0, 0xFFFF, 162  # USER15
  )
  def test_generate_pcap(self):
  # 消息体内容
  pkg_content1 = struct.pack('!2I', 100, 101)
  pkg_content2 = struct.pack('!2I', 101, 100)
  #
  pkg_header = struct.pack(
  self.struct_pcap_pkthdr, 0x4A5B1784, 0x00081C6D,
  len(pkg_content1), len(pkg_content1)
  )
  with open('test.pcap', 'wb') as test:
  test.write(self.file_header+pkg_header+pkg_content1+pkg_header+pkg_content2)

  wireshark解析效果
  用自定义的wireshark插件协议解析整体效果如下,后面具体介绍插件内容,可以看到Encapsulation type字段值是60,协议是USER15
  这个值跟前面文件头里面的link162的映射关系,在wireshark中完成,具体处理可以查看wireshark的C源码。
  协议名称和消息体解析,需要捕获这个数据流在自定义的协议插件中处理,下一章会提到。
  两个包的时间戳一样,是因为前面写入文件的包头是一样的。

    上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号