iOS网络扩展数据包解析

iOS network extension packet parsing

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

我把Packet的binary转成了Hex,以便可以用在线工具解码;以下是我需要解析的示例:

000000024500003B5461000040110C390A07000208080808FA2D0035002739B4DE790100000100000000000003777777056170706C6503636F6D0000010001

000000024500003CBAE200004011A5B60A07000208080808E48A0035002892DAE43B01000001000000000000037777770669636C6F756403636F6D0000010001

00000002450000375324000040110D7A0A07000208080808DD7F003500232BBA841801000001000000000000056170706C6503636F6D0000010001

但是当尝试用 online decoder 解析时,他们失败了,说无效数据包。

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

Note that above are 3 packet samples (not one splitted by me).

它是 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。每次我们读取数据包时,tun-layer 数据包(例如 00 00 00 02)前面有 4 个附加字节。

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

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

Note that by doing above, we convert initial tun-layer packet to a tap-layer packet.

Also, remember to prefix again those 4 bytes, once writing a packet into the file-descriptor (after removing Mac-Header).


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