您的位置:首页 > 其它

cap文件的格式说明

2012-10-19 19:42 274 查看
http://hi.baidu.com/ah__fu/item/10400911b071c9041994ec3b

/*

引子:近期颓废得厉害。好多朋友向我要一个读取CAP文件的类,一方面工作繁忙,另一方面有空了就懒洋洋的不想动。

终于好好收拾了一下心情,把关于我知道的有关CAP文件的东东拿出来和朋友们分享。

*/

我所发现的情况是:windows下的ethereal和Linux下的tcpdump所抓的包为同样的CAP文件的格式,sniffer软件所抓的包文件扩展名也是.cap,但格式却不太一样。本文主要说明ethereal和tcpdump抓包产生的.cap文件的格式。

其实,要获得PCAP文件的格式,除了直接打开.cap文件来分析外,可以看WinPcap包或Linux下/usr/include下的pcap.h头文件。pcap.h文件中不但提供了cap文件解析的各种结构体,还提供了解析函数。

OK,先使用UE或WinHex打开.cap文件,开始分析其内容:

========================================================================

00000000h: D4 C3 B2 A1 02 00 04 00 00 00 00 00 00 00 00 00 ; 悦病............

00000010h: FF FF 00 00 01 00 00 00 ; ......

========================================================================

前面24个字节是.cap文件的文件头。

头信息对应的结构体为:

struct pcap_file_header {

bpf_u_int32 magic;

u_short version_major;

u_short version_minor;

bpf_int32 thiszone; /* gmt to local correction */

bpf_u_int32 sigfigs; /* accuracy of timestamps */

bpf_u_int32 snaplen; /* max length saved portion of each pkt */

bpf_u_int32 linktype; /* data link type (LINKTYPE_*) */

};

cap文件中的linktype很重要,不同的网络环境下抓包,数据帧的帧头是不一样的。比如,在局域网内抓包,linktype为1 ( DLT_EN10MB, Ethernet (10Mb) ),以太网的帧头就是两个网卡物理地址;如果直接用ADSL拨号上线,则linktype为9 ( DLT_PPP, Point-to-point Protocol),数据帧头为PPP协议。

关于linktype支持的类型,可以参考pcap-bpf.h中定义的以DLT_开头的宏。

头信息后是顺序的每个数据段的信息,每个数据段中包含抓包时间、包类型等信息,然后是包的内容。

========================================================================

00000018h: F5 A4 9E 48 E5 A5 05 00 3E 00 00 00 3E 00 00 00 ; 酩濰濂..>...>...

00000028h: 00 13 C3 28 DC 00 00 E0 4D 60 61 0A 08 00 45 00 ; ..??.郙`a...E.

00000038h: 00 30 93 D0 40 00 80 06 2E 46 C0 A8 09 EA 3D 81 ; .0撔@.€..F括.??

00000048h: 30 9E 04 98 00 50 EB 1A 0A B7 00 00 00 00 70 02 ; 0??P?.?...p.

00000058h: FF FF 4F B4 00 00 02 04 05 B4 01 01 04 02 ; O?....?...

========================================================================

以上一个数据段的内容。数据段的头对应的结构体为:

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为抓包的时间;

caplen和len我发现一般都是一样的。(什么情况下会不一样还没搞懂)

16字节的数据段头之后就是包的信息了。例子中的包信息是局域网中抓的,所以是以太网帧头,结构体如下:

struct EthernetPacket

{

char MacDst[6]; ///< 目的网卡物理地址

char MacSrc[6]; ///< 源网卡物理地址

unsigned short PacketType; ///< 包类型, ip或ARP等

};

PacketType=0x0008是IP包,PacketType=0x0608是ARP包。

OK,有了以上参考,按照偏移量读取cap文件的内容就易如反掌了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: