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文件格式及文件解析_图文.pdf
pcap文件格式及文件解析 - 第一部分:PCAP包文件格式 一 基本格式: 文
pcap文件格式.pdf
pcap文件格式 - PCAP文件格式分析及读取pcap文件内容。... PCAP 文件格式每个.pcap 文件的文件头 Pcap Header:24B 每个.pcap 文件中的数据包头 Packet Header:16B ...
简洁的Pcap文件格式--Wireshark.doc
PCAP 文件格式协议分析 一、基本格式: 文件头 数据包头 数据报 数据包头 数据报... pcap 文件格式 结构 文件头 数据包头 1 数据包 数据包头 n-1 数据包 数据...
pcap文件格式.doc
pcap文件格式 - pcap 文件格式 使用 wireshark 抓包工具,默
pcap及pcapng格式解析中文版.pdf
Figure 5 显示了一个堪比“经典 libpcap 格式的”pcapng 文件结构,它包含 一个节头块 (SHB) , 一个单一的接口描述块 (IDB) 和几个增强分组块 (EPB) 。 ...
Wireshark的Pcap文件格式分析及解析源码.doc
Wireshark 的 Pcap 文件格式分析及解析源码 下面主要介绍下 Eth
Pcap文件格式.doc
第一部分:PCAP文件格式 一基本格式: 文件头数据包头数据报数据包头数据报... 二、文件头: 文件头结构体 sturctpcap_file_header { DWORD DWORD DWORD DWORD...
PCAP文件格式网络数据包分析软件设计与实现.doc
PCAP文件格式网络数据包分析软件设计与实现 - PCAP 文件格式网络数据包分
Pcap 文件格式和 WireShark.pdf
Pcap 文件格式和 WireShark - Pcap? 文件格式和? Wire
pcap过滤规则格式.doc
暂无评价|0人阅读|0次下载 | 举报文档 标签: 过滤规则| pcap过滤规则格式_IT/计算机_专业资料。libpcap编写过滤规则的格式 函数名称:int pcap_compile(pcap_t...
pcapng格式解析.doc
暂无评价|0人阅读|0次下载|举报文档 pcapng格式解析_电脑基础知识_IT/计算机_专业...Please note that differently from the libpcap file format, timestamps are ...
ethereal(wireshark)文件格式libpcap.txt
ethereal(wireshark)文件格式libpcap_IT/计算机_专业资料。分析网络抓包工具ethereal(wireshark)等保存的文件的格式! libpcap 的数组表示:低位在前 文件头 24字节 1...
实验5 分析IP数据报格式.doc
Winpcap 基本介绍 数据报捕获的原理 实验5 5.1 实验目的 实验目的了解 IP ...更为重要的是Tcpdump是一个公开源代码和输出文件格式的软件,我们可以 在Tcpdunp...
实验报告封面及正文格式规范.doc
实验报告封面及正文格式规范_调查/报告_表格/模板_实用文档。至诚学院实验报告 ...Winpcap 开放代码函数库 3、语言:C++ 及 VS.NET 2010 开发平台 【背景知识】...
格式结构体.doc
格式结构体 - IPv4,6,udp,tcp报头格式结构体... 暂无评价|0人阅读|0次下载 | 举报文档格式结构体...程序 4 利用 WinPcap 函数库函数解析捕获的 TCP 数据...
更多相关标签:

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

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