Tcpdump格式文件分析

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Tcpdump格式文件分析
一、前言
Tcpdump是Linux系统上最有名的抓包工具,它所保存的dmp格式文件能被许多抓包分析工具读取(EtherPeek、Ethereal、WinPcap等)。

由于想通过读取Tcpdump格式文件的方式,分析抓取到的数据包。

查阅过许多关于TCP/IP协议的书,都是关于IP数据包这层的分析。

没有关于Tcpdump格式文件的介绍。

后来看过Tcpdump主页()上下载的源码后发现,其对Tcpdump格式文件的处理是通过libpcap这个库实现的。

你也可以调用这个库实现对Tcpdump格式文件的读取,但美中不足的是它只提供C语言调用库,不提供Java语言调用库。

最后在其网站的/release/地址看到了libpcap库的源代码,以下所有结论都是通过分析这个源代码得出的,并且只对Tcpdump格式文件主版本号大于等于2的有效(在之后的Tcpdump格式文件头中会对主版本号加以说明)。

二、总体介绍
Tcpdump格式文件是标准的二进制文件,可以使用UltraEdit等工具打开。

分析后发现其文件分为三部分:
1.Tcpdump格式文件头;
2.Packet头;
3.IP数据报包。

其中Tcpdump格式文件头长度为24个字节,Packet头部分长度为16个字节,并且在所有的抓包分析工具(EtherPeek、Ethereal、WinPcap等)中都不能显示出来。

下图就是各部分内容的示意图,其中标记了一个Tcpdump格式文件头和两对Packet头+ IP数据报包。

三、背景知识
Tcpdump在处理Tcpdump格式文件头和Packet头部分数据时将所有数据颠倒后再进行保存的,所以当从Tcpdump格式文件中读出这两部分数据后还需要再颠倒回来。

共提供两个方法:
1、SWAPLONG函数将长整形的前后颠倒,例如:将AABBCCDD颠倒为DDCCBBAA;
2、SWAPSHORT函数将短整形的前后颠倒,例如:将AABB颠倒为BBAA。

四、Tcpdump格式文件头
1、Tcpdump格式文件头各部分说明
2、Tcpdump格式文件标记
Tcpdump格式文件标记为32位无符号整形(4字节)。

在C原文件中定义为“#define TCPDUMP_MAGIC 0xa1b2c3d4”。

从原文件中读出为0xd4c3b2a1然后通过颠倒就为定义的0xa1b2c3d4。

3、主版本号、子版本号
主版本号、子版本号均为16位无符号整形(2字节)。

主版本号为0x0200,子版本号0x0400。

颠倒后变为主版本号为0x0002,子版本号0x0004。

4、时区、精确的时间戳
时区、精确的时间戳均为32位无符号整形(4字节)。

在抓到的所有数据包里均为0,而且在源代码中也没大看懂是干什么用的(如果有谁看懂了请通知我,谢谢!)。

我的猜测结论如下:
1、时区,可能会根据这个时区的设置,将每个Packet头中的时间戳转换成本地时间显示;
2、精确的时间戳,这个实在不明白有什么作用,并且在源代码中看到这个值无论在什么情况下
都被强制赋了个0?
5、每个数据包大小
每个数据包大小为32位无符号整形(4字节)。

每个数据包大小为0x60000000。

颠倒后变为0x00000060。

转为十进制为96字节。

其记录的是使用Tcpdump命令的-s参数时设置的值。

说明:
-s:设置每个数据包的大小,单位为字节,默认值为68;
6、数据链类型
数据链类型为32位无符号整形(4字节)。

数据链类型为0x01000000。

颠倒后变为0x00000001。

但其含义不是很明白(如果有谁看懂了请通知我,谢谢!)。

7、C源代码
以下内容摘自libpcap源代码的pcap.h文件中:
五、Packet头
1、Packet头各部分说明
2、时间戳
时间戳由两个32位无符号整形构成(8字节),其中高4位为时间戳的秒部分,低4位为时间戳的微秒部分(百万分之一秒)。

2.1秒部分
这是本文档中最难理解的部分,因为不能通过简单的计算来说明,必需使用编程语言来帮助说明。

秒部分为0x3e3fda44。

颠倒后秒部分为0x44da3f3e。

将其转为十进制为1155153726。

A)Java语言
以上代码运行结果为“Thu Aug 10 04:02:06 CST 2006”,也就是在EtherPeek中看到的04:02:06 08/10/2006。

为什么要乘以1000呢?是因为在Java语言中Date的构造函数必须输入毫秒值,但得到的十进制是秒,所以要乘以1000。

B)C语言
可以使用如下语句:
最后ts就是你要的时间。

2.2微秒部分
微秒部分为0xea230b00。

颠倒后微秒部分为0x000b23ea。

将其转为十进制为730090。

但请注意微秒是小数点后的部分,所以需要在后边补0。

由于百万分之一秒是9位,所以应该在730090后补3个0,也就是在EtherPeek中看到的730090000。

3、本次保存的IP数据报长度、IP数据报原有长度
本次保存的IP数据报长度、IP数据报原有长度均为32位无符号整形(4字节),本次保存的IP数据报长度、IP数据报原有长度均为0x4a000000,颠倒后为0x0000004a。

转为十进制为74,说明抓到的IP数据报长度为74字节。

本次保存的IP数据报长度和IP数据报原有长度有可能相同,也有可能不同。

例如:本次保存的IP数据报长度0x60000000,IP数据报原有长度0x9c000000。

颠倒后本次保存的IP数据报长度0x00000060,IP 数据报原有长度0x0000009c。

转成十进制后本次保存的IP数据报长度96,IP数据报原有长度156。

说明抓到的这个数据报长度为156字节,但只将前96个字节保存在此Tcpdump文件中(还记得在Tcpdump格式文件头中讲到的每个数据包大小吗?)。

注意:如果要写Tcpdump文件分析工具,在读取IP数据报包时必须按照本次保存的IP数据报长度读取,否则有可能将下一个数据包的内容一起读出来造成错误。

4、C源代码
以下内容摘自libpcap源代码的pcap-int.h文件中:
六、IP数据报包
IP数据报包的有关内容请参见有关TCP/IP协议的书籍。

相关文档
最新文档