Tcpdump格式文件分析

Tcpdump格式文件分析
Tcpdump格式文件分析

Tcpdump格式文件分析

一、前言

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

由于想通过读取Tcpdump格式文件的方式,分析抓取到的数据包。查阅过许多关于TCP/IP协议的书,都是关于IP数据包这层的分析。没有关于Tcpdump格式文件的介绍。后来看过Tcpdump主页(https://www.360docs.net/doc/b05470518.html,)上下载的源码后发现,其对Tcpdump格式文件的处理是通过libpcap这个库实现的。你也可以调用这个库实现对Tcpdump格式文件的读取,但美中不足的是它只提供C语言调用库,不提供Java语言调用库。最后在其网站的https://www.360docs.net/doc/b05470518.html,/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协议的书籍。

相关主题
相关文档
最新文档