在拆包的过程中,我们必须要对WireShark截获的数据包的格式(即.pcap后缀的文件)有很清楚的了解,所以就把今天所学记录下来,以飨后来者。
一、结构体说明
pcap.h里定义了文件头的格式
struct pcap_file_header {
bpf_u_int32 magic;
u_short version_major;
u_short version_minor;
bpf_int32 thiszone;
bpf_u_int32 sigfigs;
bpf_u_int32 snaplen;
bpf_u_int32 linktype;
};
看一下各字段的含义:
magic: 4字节 pcap文件标识 目前为“d4 c3 b2 a1”
major: 2字节主版本号 #define PCAP_VERSION_MAJOR 2
minor: 2字节次版本号 #define PCAP_VERSION_MINOR 4
thiszone:4字节时区修正 并未使用,目前全为0
sigfigs: 4字节精确时间戳 并未使用,目前全为0
snaplen: 4字节抓包最大长度如果要抓全,设为0x0000ffff(65535), tcpdump -s 0就是设置这个参数,缺省为68字节
linktype:4字节链路类型 一般都是1:ethernet
数据报头的格式
struct pcap_pkthdr {
struct timeval ts;
bpf_u_int32 caplen;
bpf_u_int32 len;
};
struct timeval {
long tv_sec;
suseconds_t tv_usec;
};
ts: 8字节 抓包时间 4字节表示秒数,4字节表示微秒数
caplen:4字节 保存下来的包长度(最多是snaplen,比如68字节)
len: 4字节数据报的真实长度,如果文件中保存的不是完整数据包,可能比caplen大。
二、结构图
图1详细的描述了我们截获数据包的大致结构:
图1 pcap文件整体结构
Pcap文件头24B各字段说明:
Magic:4B:0×1A 2B 3C 4D:用来识别文件自己和字节顺序。0xa1b2c3d4用来表示按照原来的顺序读取,0xd4c3b2a1表示下面的字节都要交换顺序读取。一般,我们使用0xa1b2c3d4
Major:2B,0×02 00:当前文件主要的版本号
Minor:2B,0×04 00当前文件次要的版本号
ThisZone:4B 时区。GMT和本地时间的相差,用秒来表示。如果本地的时区是GMT,那么这个值就设置为0.这个值一般也设置为0 SigFigs:4B时间戳的精度;全零
SnapLen:4B最大的存储长度(该值设置所抓获的数据包的最大长度,如果所有数据包都要抓获,将该值设置为65535; 例如:想获取数据包的前64字节,可将该值设置为64)
LinkType:4B链路类型
常用类型:
0 BSD loopback devices, except for later OpenBSD
1 Ethernet, and Linux loopback devices
6 802.5 Token Ring
7 ARCnet
8 SLIP
9 PPP
10 FDDI
100 LLC/SNAP-encapsulated ATM
101 “raw IP”, with no link
102 BSD/OS SLIP
103 BSD/OS PPP
104 Cisco HDLC
105 802.11
108 later OpenBSD loopback devices (with the AF_value in network byte order)
113 special Linux “cooked” capture
114 LocalTalk
三、详细结构
直接来图吧,同样的事情用图总会直接简明,而且易懂。见图二。
图2 字段的详细结构
四、举例
以下(见图3)是我截获的数据包,以.pcap后缀保存的,用UE直接打开,可以详细看到它的内部结构和上面吻合。
图3 pcap文件部分截图
注:蓝色选中的部分即为24字节的数据包包头
我截获的的以太网帧的第一帧如图4所示:
图4 第一帧的内容
对比图3和数据报头16字节格式,你会很容易知道Frame 1的92bytes是5C 00 00 00计算出来的。到此为止,我想各位应该很清楚的了解Frame 1在什么位置,以及.pcap文件的格式了吧。
阅读(3773) | 评论(0) | 转发(0) |