Tcpdump格式文件分析的认识.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间: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等工具打开。分析后发现其文件分为三部分: Tcpdump格式文件头; Packet头; IP数据报包。 其中Tcpdump格式文件头长度为24个字节,Packet头部分长度为16个字节,并且在所有的抓包分析工具(EtherPeek、Ethereal、WinPcap等)中都不能显示出来。 下图就是各部分内容的示意图,其中标记了一个Tcpdump格式文件头和两对Packet头+ IP数据报包。 三、背景知识 Tcpdump在处理Tcpdump格式文件头和Packet头部分数据时将所有数据颠倒后再进行保存的,所以当从Tcpdump格式文件中读出这两部分数据后还需要再颠倒回来。 以下内容摘自libpcap源代码的savefile.c文件中: 共提供两个方法: SWAPLONG函数将长整形的前后颠倒,例如:将AABBCCDD颠倒为DDCCBBAA; 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字节)。每个数据包大小为0颠倒后变为0转为十进制为96字节。其记录的是使用Tcpdump命令的-s参数时设置的值。 说明: -s:设置每个数据包的大小,单位为字节,默认值为68; 6、数据链类型 数据链类型为32位无符号整形(4字节)。数据链类型为0颠倒后变为0但其含义不是很明白(如果有谁看懂了请通知我,谢谢!)。 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语言 可以使用如下语句:

文档评论(0)

xuefei111 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档