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),我们将立即处理。