iOS Network Extension捕获数据包的协议类型与解析方法咨询
数据包协议判定与解析方法
1. 所属协议层级说明
你捕获的数据包属于网络层IPv4协议,在线工具解析失败是因为iOS Network Extension返回的IP数据包自带4字节的框架自定义前缀,不属于标准IP协议内容:
所有样本开头的00000002就是NE框架的标识前缀,剥离前4字节后剩下的内容就是标准IPv4报文。以第一个样本为例,剥离前缀后开头为4500,高4位4代表IPv4版本,低4位5代表IPv4首部长度为20字节,完全符合IPv4报文的格式规范。
进一步解析可以发现三个样本的IPv4首部协议字段值为11(十进制17),对应传输层UDP协议,UDP目的端口为0035(十进制53),因此三个包均为发往8.8.8.8的DNS查询请求,分别查询www.apple.com、www.icloud.com、apple.com的A记录。
2. 标准解析步骤
- 第一步:剥离NE前缀,每个数据包丢弃前4字节,得到标准IP报文
- 第二步:解析IPv4首部(参考RFC791规范):
- 0~3位:IP版本号,4为IPv4、6为IPv6
- 4~7位:首部长度,单位为4字节,实际长度为该值乘以4
- 第9字节:传输层协议号,常见值1对应ICMP、6对应TCP、17对应UDP
- 1215字节:源IP地址,1619字节:目的IP地址
- 第三步:根据协议号解析传输层首部:
本次样本为UDP协议,UDP首部固定8字节:- 01字节:源端口,23字节:目的端口
- 45字节:UDP报文总长度,67字节:校验和
- 第四步:解析传输层载荷,本次样本目的端口为53,按照DNS协议(RFC1035)结构解析即可获取查询的域名、记录类型等内容。
3. C/C++实现解析的参考思路
直接定义对应协议的结构体,按偏移读取字段即可,注意网络字节序转主机字节序需要使用ntohs/ntohl系统函数:
// IPv4首部结构体定义 struct ipv4_header { uint8_t version_ihl; // 高4位版本,低4位首部长度 uint8_t tos; // 服务类型 uint16_t total_len; // IP报文总长度 uint16_t id; // 标识 uint16_t frag_off; // 分片偏移 uint8_t ttl; // 生存时间 uint8_t protocol; // 传输层协议号 uint16_t checksum; // 首部校验和 uint32_t saddr; // 源IP地址 uint32_t daddr; // 目的IP地址 }; // UDP首部结构体定义 struct udp_header { uint16_t sport; // 源端口 uint16_t dport; // 目的端口 uint16_t len; // UDP报文长度 uint16_t checksum; // 校验和 };
解析时先将数据包指针偏移4字节跳过NE前缀,再强转为对应结构体指针即可读取字段。
内容的提问来源于stack exchange,提问作者Top-Master
相关产品推荐
相关产品推荐

