9512.net
甜梦文库
当前位置:首页 >> IT/计算机 >>

pcap文件格式


PCAP 文件格式
每个.pcap 文件的文件头 Pcap Header:24B 每个.pcap 文件中的数据包头 Packet Header:16B 每个.pcap 文件中的数据报 Packet Data:14B 以太头+TCP/IP 数据 具体如下:

1.pcap 文件头部(pcap header) sturct pcap_file_header { DWORD magic; WORD version_major; WORD version_minor; DWORD thiszone; DWORD sigfigs; DWORD snaplen; DWORD linktype; } 说明: 1、标识位 magic:32 位的,这个标识位的值是 16 进制的 0xa1b2c3d4。 32-bit magic number , The magic number has the value hex a1b2c3d4. 2、主版本号 version_major:16 位, 默认值为 0x2。返回写入被打开文件所使用的 pcap 函 数的主版本号。 16-bit major version number, The major version number should have the value 2. 3、副版本号 version_minor:16 位,默认值为 0x04。 16-bit minor version number, The minor version number should have the value 4. 4、区域时间 thiszone:32 位,实际上该值并未使用,因此可以将该位设置为 0。 32-bit time zone offset field that actually not used, so you can (and probably should) just make it 0;

5、精确时间戳 sigfigs:32 位,实际上该值并未使用,因此可以将该值设置为 0。 32-bit time stamp accuracy field that not actually used, so you can (and probably should) just make it 0; 6、数据包最大长度 snaplen:32 位,该值设置所抓获的数据包的最大长度,如果所有数据 包都要抓获, 将该值设置为 65535; 例如: 想获取数据包的前 64 字节, 可将该值设置为 64。 32-bit snapshot length" field; The snapshot length field should be the maximum number of bytes perpacket that will be captured. If the entire packet is captured, make it 65535; if you only capture, for example, the first 64 bytes of the packet, make it 64. 7、链路层类型 linktype:32 位, 数据包的链路层包头决定了链路层的类型。 32-bit link layer type field. The link-layer type depends on the type of link-layer header that the packets in the capture file have: 以下是数据值与链路层类型的对应表 0 BSD loopback devices, except for later OpenBSD 1 Ethernet, and Linux loopback devices 以太网类型,大多数的数据包为这种类 型。 6 802.5 Token Ring 7 ARCnet 8 SLIP 9 PPP 10 FDDI 100 LLC/SNAP-encapsulated ATM 101 raw IP, with no link 102 BSD/OS SLIP 103 BSD/OS PPP 104 Cisco HDLC 105 802.11 108 later OpenBSD loopback devices (with the AF_value in network byte order) 113 special Linux cooked capture 114 LocalTalk 文件头部后面就是一个一个的数据包头部与数据内容了,格式如下:

2. 数据包头结构 struct pcap_pkthdr { struct timeval ts; /* time stamp */ bpf_u_int32 caplen; /* length of portion present */ bpf_u_int32 len; /* length this packet (off wire) */ }; ts:时间戳 cpalen:当前分组的长度

len:数据包的长度 struct timeval 结构体在 time.h 中的定义为: struct timeval { __time_t tv_sec; /* Seconds. */ __suseconds_t tv_usec; /* Microseconds. */ }; 其中,tv_sec 为 Epoch 到创建 struct timeval 时的秒数,tv_usec 为微秒数,即秒后面的零头。 说明: (1) DWORD 就是 32bit 的 unsigned long。 (2) 时间戳,包括: 秒计时:32 位,一个 UNIX 格式的精确到秒时间值,用来记录数据包抓获的时间,记 录方式是记录从格林尼治时间的 1970 年 1 月 1 日 00:00:00 到抓包时经过的秒数; 毫秒计时:32 位, 抓取数据包时的毫秒值。 time stamp, consisting of: UNIX-format time-in-seconds when the packet was captured, i.e. the number of seconds since January 1,1970, 00:00:00 GMT (that GMT, *NOT* local time!); the number of microseconds since that second when the packet was captured; (3) 数据包长度:32 位 ,标识所抓获的数据包保存在 pcap 文件中的实际长度,以字节为单 位。 32-bit value giving the number of bytes of packet data that were captured; (4) 数据包实际长度: 所抓获的数据包的真实长度,如果文件中保存不是完整的数据包, 那么这个值可能要比前面的数据包长度的值大。 32-bit value giving the actual length of the packet, in bytes (which may be greater than the previous number, if you are not saving the entire packet). 3. 数据包内容 通常就是链路层的数据帧,长度就是 Caplen,这个长度的后面,就是当前 PCAP 文件 中存放的下一个 Packet 数据包,也就是说:PCAP 文件里面并没有规定捕获的 Packet 数据 包之间有什么间隔字符串,下一组数据在文件中的起始位置。我们需要靠第一个 Packet 包 确定。最后,Packet 数据部分的格式其实就是标准的网路协议格式了可以任何网络教材上找 得到。 每个数据包的前 14 字节是以太头,后面才是 ip 首部等内容。

读取 pcap 文件
有了 pcap 文件的格式说明之后, 要读取 pcap 类型的文件就很简单了。 这里只是分离出 pcap 文件里面一个一个的数据包,而没有对每个数据包进行单独的解析。 打开一个 pcap 文件,解析后将其写入一个文本文件:

fopen = open('f:\\test.pcap','rb') fwrite = open('f:\\result.txt','w') stringPacket = fopen.read() 这样整个 pcap 文件的内容就已经存储在 stringPacket 里面了, 可见该程序在处理大型 的 pcap 文件时候并不适合。 首先找到该 pcap 文件的头部极其描述, 并将其一个一个的写入 txt: pcapHeader = {} pcapHeader['magic'] = stringPacket[0:4] pcapHeader['version_major'] = stringPacket[4:6] pcapHeader['version_minor'] = stringPacket[6:8] pcapHeader['thiszone'] = stringPacket[8:12] pcapHeader['sigfigs'] = stringPacket[12:16] pcapHeader['snaplen'] = stringPacket[16:20] pcapHeader['linktype'] = stringPacket[20:24] fwrite.write("the head of this pacpFile is:\n") for key in ['magic','version_major','version_minor', 'thiszone','sigfigs','snaplen','linktype']: fwrite.write(key + ":" + repr(pcapHeader[key]) + '\n') 头部的各个字段,根据其位置,就可以一个一个的找出来了。这里要说明一点的是,在 写入文件的时候,如果用 str()函数代替 repr()函数,那么写入的全部是乱码。这两个函数 都是将参数转换为字符串类型,但是区别我还不知道,留待以后补充。 找出头部后,剩下的就是一个一个的数据包了。这个时候,stringPacket 已经指向第 24 个字节处了,令 i=24,然后定义三个数据 pcap_pkthdr = {}存储每个数据包的头部, pcapData =''存储每个数据包的内容, pcapNum 记录是第几个数据包,初始化为 1,接下 来的代码如下: while i < len(stringPacket): pcap_pkthdr['GMTime'] = stringPacket[i:i+4] pcap_pkthdr['microTime'] = stringPacket[i+4:i+8] pcap_pkthdr['caplen'] = stringPacket[i+8:i+12] pcap_pkthdr['len'] = stringPacket[i+12:i+16] pcap_len = struct.unpack('I',pcap_pkthdr['len'])[0] print pcap_pkthdr['len'] fwrite.write("the " + repr(pcapNum) + "th packet:\n") for key in ['GMTime','microTime','caplen','len']: fwrite.write(key + ":" + repr(pcap_pkthdr[key]) + '\n') fwrite.write("data: " + repr(stringPacket[i+16:i+16+int(pcap_len)]) + "\n")

i = i + 16 + pcap_len pcapNum = pcapNum + 1 这样所有的数据包都被解析出来了。与之前同样的道理,这里不能使用 str()函数来代 替 repr()函数。此外这里还用到了 struct 结构里面的 unpack 函数,该函数与 pack 函数是 一对刚好相反的。如下介绍: struct.pack 用于将 Python 的值根据格式符,转换为字符串(因为 Python 中没有字节 (Byte)类型, 可以把这里的字符串理解为字节流或字节数组)其函数原型为: 。 struct.pack(fmt, v1, v2, …),参数 fmt 是格式字符串,v1, v2, …表示要转换的 python 值。下面的例子将两 个整数转换为字符串(字节流): import struct a = 20 b = 400 str = struct.pack("ii", a, b) print 'length:', len(str) print str print repr(str) 输出为: length: 8 乱码 '\x14\x00\x00\x00\x90\x01\x00\x00' 格式符”i”表示转换为 int,’ii’表示有两个 int 变量。进行转换后的结果长度为 8 个字节 (int 类型占用 4 个字节,两个 int 为 8 个字 节),可以看到输出的结果是乱码,因为结果 是二进制数据,所以显示为乱码。可以使用 python 的内置函数 repr 来获取可识别的字符串, 其中十六进制的 0×00000014, 0×00001009 分别表示 20 和 400。 struct.unpack 做的工作刚好与 struct.pack 相反,用于将字节流转换成 python 数据类型。 它的函数原型为: struct.unpack(fmt, string), 该函数返回一个元组。 下面是一个简单的例子: str = struct.pack("ii", 20, 400) a1, a2 = struct.unpack("ii", str) print 'a1:', a1 print 'a2:', a2 输出为: a1: 20 a2: 400

另外,unpack 函数还可以用来取字串,下面表示的是先取五个字符然后跳过 4 个字符 再取三个字符,输出为一个元祖:('Test ', 'ing') format = '5s 4x 3s' print struct.unpack(format, 'Test astring')


赞助商链接

更多相关文章:
PCAP文件格式网络数据包分析软件设计与实现
PCAP 文件格式网络数据包分析软件设计与实现 摘要:通过对主流转包软件所保存的 PCAP 格式文件进行解析统计, 开发了一种针对 PCAP 文件格式的网络数据包分析软件, 该...
pcap中的时间戳
当读取或写入捕捉文件时,Wireshark 按需要在内置格式和其他捕捉文件格式 间进行时间戳转换。 捕捉时,Wireshark 使用 libpcap(WinPcap)捕捉库(支持纳秒精度)。除非...
更多相关标签:

All rights reserved Powered by 甜梦文库 9512.net

copyright ©right 2010-2021。
甜梦文库内容来自网络,如有侵犯请联系客服。zhit325@126.com|网站地图