首页 > 解决方案 > iOS网络扩展包解析

问题描述

我正在开发一个 VPN(iOS 网络扩展),并使用 C/C++ 直接读取文件描述符(而不是 Swift),目前它成功捕获了设备的请求数据包,但我不知道如何解析 iOS 的数据包,我可以甚至找不到数据包格式化的网络层或协议。

我将 Packet 的二进制文件转换为十六进制,以便能够使用在线工具进行解码;以下是我需要解析的示例:

000000024500003B5461000040110C390A07000208080808FA2D0035002739B4DE790100000100000000000003777777056170706C6503636F6D0000010001

000000024500003CBAE200004011A5B60A07000208080808E48A0035002892DAE43B01000001000000000000037777770669636C6F756403636F6D0000010001

00000002450000375324000040110D7A0A07000208080808DD7F003500232BBA841801000001000000000000056170706C6503636F6D0000010001

但是当尝试使用在线解码器解析时,他们说无效数据包失败。

上面是什么网络层或协议?

请注意,上面是 3 个数据包样本(不是我拆分的一个)。

标签: iosvpnnetworkextension

解决方案


它是带有字节前缀的tun层协议:4

1. 一旦我们使用 C/C++ 读取文件描述符,NEPacketTunnelProvider如:

let tunFd = self.packetFlow.value(forKeyPath: "socket.fileDescriptor") as! Int32

// ... pass above to C/C++ backend

而不是使用Swift类似:

self.packetFlow.readPackets { [weak self] (packets: [Data], protocols: [NSNumber]) in
    // Handle packets here...
}

2.每次我们读取数据包时,数据包都会有4额外的字节前缀tun-layer(例如)。00 00 00 02

3. 为了让大多数在线工具能够理解数据包,请删除那些起始4字节,并在其前面加上 Mac-Header-Hex 前缀,例如:

01 00 5E 00 00 09 C2 01 17 23 00 00 08 00

请注意,通过上述操作,我们将初始tun层数据包转换为tap层数据包。

4此外,一旦将数据包写入文件描述符(在删除 Mac-Header 之后),请记住再次为这些字节添加前缀。


2021 年更新;Apple 不鼓励直接访问文件描述符(它可能会在未来的 iOS 版本中被删除)。


推荐阅读