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 版本中删除)。
我正在开发一个 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 atap
-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 版本中删除)。