ios - iOS网络扩展包解析
问题描述
我正在开发一个 VPN(iOS 网络扩展),并使用 C/C++ 直接读取文件描述符(而不是 Swift),目前它成功捕获了设备的请求数据包,但我不知道如何解析 iOS 的数据包,我可以甚至找不到数据包格式化的网络层或协议。
我将 Packet 的二进制文件转换为十六进制,以便能够使用在线工具进行解码;以下是我需要解析的示例:
000000024500003B5461000040110C390A07000208080808FA2D0035002739B4DE790100000100000000000003777777056170706C6503636F6D0000010001
000000024500003CBAE200004011A5B60A07000208080808E48A0035002892DAE43B01000001000000000000037777770669636C6F756403636F6D0000010001
00000002450000375324000040110D7A0A07000208080808DD7F003500232BBA841801000001000000000000056170706C6503636F6D0000010001
但是当尝试使用在线解码器解析时,他们说无效数据包失败。
上面是什么网络层或协议?
请注意,上面是 3 个数据包样本(不是我拆分的一个)。
解决方案
它是带有字节前缀的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 版本中被删除)。
推荐阅读
- reactjs - 蚂蚁设计表点击表格单元格
- unreal-engine4 - 虚幻引擎:如何激活键盘?
- python - 如何使用 Beautiful soup 解析 htm 文件
- formatting - 为什么这个代码修复会破坏我的琐事?
- mysql - 将 3 行合并为一行
- c# - 如何处理内存中实体对使用 EF 6 的单元测试类/服务的限制
- symfony - Capistrano 和 Symfony:上限中止!LoadError: 无法加载此类文件 -- capifony_symfony2
- spring - Thymeleaf 和 SpringMVC 的复选框
- node.js - Node.js - 尝试捕获未返回的错误
- javascript - td 内部元素的 onClick toggleClass 和兄弟 td 内部元素的 removeClass