pcap 文件通常用 wireshark 工具打开。 wireshark 在抓取和分析网络数据包的时候非常有用,不得不说它是一个很强大的工具。用wireshark 打开pcap文件后,所有的信息一目了然,但是作为一个(伪)geek ,还是需要有一点刨根问底的精神的,总想自己手动解析一次,那么这次就来玩转一下 pcap 文件。

首先看一下 pcap 的文件格式,出乎意料的是pcap的格式非常简单。

pcap

 

 

Pcap Header 是整个文件的头部,存放了关于这个pcap的一些信息。之后每个被捕获的数据包用一个(Head, Data)表示,Head里是关于这个数据包的捕获时间等信息,后面的Data就是这个数据包了。Data包含了MAC帧之上的所有内容。

先看 pcap header的数据结构。

再看看每个数据包的头部

有了这些信息,我们就可以得到每个Data域在文件中的偏移,从而读取他们。这里有另外一篇博客画的图,在这里盗用一下。

pcap

有了这些信息,就可以动手写代码了。这次打算用python处理而不是用c,因为更高级的语言能让我专注于处理文件格式和数据包,而不用被其他乱七八糟的东西干扰。在动手写代码之前,还要解决一个字节序的问题。我们知道不同架构的CPU有“大端”和“小端”之分,同样的,在网络上传输的数据也有他自己的字节序,当我们要传输的数据是一个结构体(而不是最基本的字符串)时,这些结构体会先被打包成二进制流再通过网络传输,当接收端收到数据以后,需要以相同的顺序把二进制流还原成各种结构体。python 提供了 struct 这个模块来处理这一切。

struct 模块最重要的三个函数 pack(), unpack(), calcsize()
pack(fmt, val) 按照指定的格式 fmt,把数据封装成二进制流。
unpack(fmt, string) 按照制定格式fmt, 把二进制流还原成数据,并返回一个tuple
calcsize(fmt) 计算给定格式占用了多少字节内存

关于fmt, 这儿有一张表,我也盗用一下。

除了这些格式以外,在fmt中我们还需要指定字节序,= 表示不用任何字节序,直接读出来,< 表示小端,  > 表示大端, ! 表示网络字节序,这四种符号都是按照原始字节数填充的,什么意思呢? 我们知道C/C++编译器为了提高内存读取效率,通常会把结构体填充到4字节对齐,fmt 中有 @ 可以实现4字节对齐。不过这些是struct的一些高级用法,在这里我们并不会用到。 知道了这些以后,我们就可以用一个简单的 python 代码把pcap文件的主要信息提取出来了。


似乎就算我们能解析pcap文件了也没什么用,因为保存在pcap_data.txt的内容大部分是乱码,但是我们可以仿照解析pcap文件的方式,继续用各种姿势解析数据报文的内容,这样就可以随心所欲的从一大堆pcap文件中得到我们想要的信息了。当然,真正实现起来并没有那么简单,因为每一层的协议都远远比pcap文件复杂,我也还在学习中,以后再来更新这篇文章~

 

 

2,563 views
Home

7 Comments so far

Trackbacks/Pingbacks

Leave a comment

Name(required)
Mail (required),(will not be published)
Website(recommended)

Fields in bold are required. Email addresses are never published or distributed.

Some HTML code is allowed:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>
URLs must be fully qualified (eg: http://blog.nlogn.cn),and all tags must be properly closed.

Line breaks and paragraphs are automatically converted.

Please keep comments relevant. Off-topic, offensive or inappropriate comments may be edited or removed.