Wireshark 的Pcap 文件格式分析及解析源码 下面主要介绍下Ethereal 默认的*.pcap 文件保存格式。 Pcap 文件头 24B 各字段说明: Magic:4B:0x1A 2B 3C 4D:用来标示文件的开始 Major:2B,0x02 00:当前文件主要的版本号 Minor:2B,0x04 00 当前文件次要的版本号 ThisZone:4B 当地的标准时间;全零 SigFigs:4B 时间戳的精度;全零 SnapLen:4B 最大的存储长度 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 Packet 包头和Packet 数据组成 字段说明: Timestamp:时间戳高位,精确到seconds Timestamp:时间戳低位,精确到microseconds Caplen:当前数据区的长度,即抓取到的数据帧长度,由此可以得到下一个数据帧的位置。 Len:离线数据长度:网络中实际数据帧的长度,一般不大于 caplen,多数情况下和Caplen 数值相等。 Packet 数据:即 Packet(通常就是链路层的数据帧)具体内容,长度就是Caplen,这个长度的后面,就是当前PCAP 文件中存放的下一个Packet 数据包,也就是说:PCAP 文件里面并没有规定捕获的Packet 数据包之间有什么间隔字符串,下一组数据在文件中的起始位置。我们需要靠第一个Packet 包确定。最后,Packet 数据部分的格式其实就是标准的网路协议格式了可以任何网络教材上找得到。 以下是我的实现,针对自定义的UDP 的抓包文件进行解析 typedef struct tagIpHead { int version;//版本 int headLength; //头长度 int diffsever; int totallength; //总长度 int identification; int flag; int fragment; int ttl; int protocoltype; //协议类型 int checksum; unsigned long srcip;//源 ip unsigned long dstip;//目的ip }IP_HEAD; typedef struct tagUdpHead { unsigned short srcport; //源端口 unsigned short dstport; //目的端口 int length; //udp 包...