vphoned守护进程解析:vphone-cli如何用vsock JSON协议远程控制iOS虚拟机
【免费下载链接】vphone-cli项目地址: https://gitcode.com/GitHub_Trending/vp/vphone-cli
vphone-cli 是一款运行在 Apple Silicon Mac 上的 iOS 虚拟机工具,而其中的vphoned 守护进程是它实现远程控制的核心:vphoned 以 LaunchDaemon 身份常驻在 iOS 虚拟机内部,宿主端(macOS 上的 vphone-cli)通过vsock 通道 + 长度前缀 JSON 协议(vphone-control 协议)向它下发指令,就能远程模拟按键、点击屏幕、模拟定位、读取钥匙串、上传文件,甚至直接安装 IPA 应用。下面带你看懂这套"宿主—虚拟机"通信机制的设计与实现。
一、vphoned 是什么:驻留在 iOS 虚拟机内的"遥控器"
在 vphone-cli 的架构里,控制指令要跨越"宿主 macOS → 虚拟机 iOS"这道边界,vphoned 就是架在虚拟机一侧的代理(guest agent):
- 常驻方式:以 launchd 守护进程运行,配置为开机自启 + 崩溃自动拉起(
com.vphone.vphoned,RunAtLoad和KeepAlive均为 true),见 vphoned.plist。 - 监听端口:绑定 vsock 地址族
AF_VSOCK的1337 端口(VPHONED_PORT),vsock 是虚拟化环境中专用的宿主↔来宾通信通道,不走真实网络栈。 - 能力矩阵:启动时加载按键、定位、剪贴板、应用管理等各功能模块,在握手时把可用能力(caps)上报给宿主,例如
hid、touch、devmode、file、keychain、location、ipa_install、clipboard、apps、url、settings等。
vphoned 用 Objective-C 编写,通过 Makefile 用xcrun -sdk iphoneos clang交叉编译为 arm64 iOS 二进制,配合 entitlements.plist 中声明的一批私有 entitlements(如 HID 事件注入、位置模拟、后台剪贴板访问等)获得操作虚拟机的系统级权限。
二、vsock JSON 协议:4 字节头 + JSON 载荷
整套协议极其简洁,核心定义在 vphoned_protocol.h 和 vphoned_protocol.m:
每条消息 =
[uint32 大端长度头(4 字节)] + [UTF-8 JSON 载荷],单条消息上限 4MB。
JSON 中约定三个固定字段:
| 字段 | 含义 |
|---|---|
v | 协议版本(当前为 1) |
t | 消息类型,如hello、hid、ping、file_list |
id | 请求 ID(十六进制序号),响应中原样回传,用于匹配请求与响应 |
读写逻辑非常严谨:vp_read_fully/vp_write_fully循环读写直到字节数精确,避免粘包/拆包问题;异常路径用vp_drain丢弃多余字节保持流同步。宿主端实现位于 VPhoneControl.swift,用VZVirtioSocketDevice(Virtualization.framework 的 virtio-vsock 设备)拨号连接 1337 端口,并维护一个按id索引的"待处理请求"表——请求发出后异步等待,后台读循环收到带相同id的响应即回调,超时未回则报requestTimedOut。
这种设计的好处:JSON 可读性好、JSON 承载控制语义、二进制数据(文件、图片、更新包)则走"JSON 头 + 裸字节流"的混合传输,两全其美。
三、握手与自动更新:守护进程自己会升级
vphoned 最巧妙的设计之一是自更新,流程如下:
- 宿主连接后发送
hello,并携带本机 vphoned 二进制的 SHA-256 哈希(bin_hash); - vphoned 计算自身可执行文件的哈希做比对,若不一致,握手响应中置
need_update为 true; - 宿主随即发送
update消息头(含size),紧接着推送最多 10MB 的裸二进制; - vphoned 先写入临时文件再原子 rename 到缓存路径
/var/root/Library/Caches/vphoned,回复ok后主动退出; - launchd 的
KeepAlive立刻重启它,启动引导代码发现缓存二进制后直接execv替换——完成一次热升级,全程无需重启虚拟机。
此外握手响应还会上报 vphoned 名字、能力列表、iOS 版本和虚拟机 IP(宿主可据此显示"VPHONE [connected] — 192.168.x.x"并建立 SSH/VNC 连接)。宿主端还有完善的容错:连接失败 3 秒后自动重连、握手 8 秒超时、按命令类型分级设置请求超时(普通 10s / 慢操作 30s / 文件传输 180s)。
四、命令能力全景:从按键到 IPA 安装
宿主发什么,vphoned 就做什么。各命令按前缀分派(见 vphoned.m 的handle_client),对应宿主端方法见 VPhoneControl.swift:
| 消息类型 | 功能 | 说明 |
|---|---|---|
hid/touch | 按键与触摸 | 按 HID page/usage 注入按键;touch按归一化坐标注入单指触摸(解决 iOS 18 基础版 USB 触摸不可用的问题) |
devmode | 开发者模式 | 查询状态或武装开启(重启后生效) |
location/location_stop | 位置模拟 | 下发经纬度、海拔、精度、速度、航向,驱动定位仿真 |
file_list/file_get/file_put等 | 文件管理 | 列目录、下载、上传、建目录、删除、重命名,文件内容走内联二进制流 |
keychain_list/keychain_add | 钥匙串 | 读取/写入钥匙串条目(依赖 sqlite3 直读) |
clipboard_get/clipboard_set | 剪贴板 | 读取文本/图片,写入文本或图片(图片走内联二进制流) |
app_list/app_launch/app_terminate/app_foreground | 应用管理 | 列出已装应用(含版本、状态、PID)、启动、终止、获取前台应用 |
open_url | 打开 URL | 在虚拟机内让系统打开指定链接 |
settings_get/settings_set/low_power_mode | 系统设置 | 读写设置项、同步低电量模式 |
accessibility_tree | 无障碍树 | 抓取当前界面结构,供自动化测试使用 |
ipa_install | 安装 IPA | 宿主先把 IPA 和签名证书上传到/var/mobile/Documents/vphone-installs,再由 vphoned 调用系统接口完成签名注册与安装 |
ping/version | 心跳与版本 | 连通性检查、上报构建哈希 |
这些能力最终都暴露在 macOS 应用菜单栏上——VPhoneMenuController.swift 构建了 Connect、Keys、Apps、Record 等菜单组,让用户点一下菜单项就触发一次 vsock 请求。
五、协议安全与健壮性设计小结
- 版本协商:
v字段不匹配立即断开,防止新旧版本互相误发指令; - 完整性:4 字节头非法或超限(>4MB)直接丢弃;更新包限 10MB 上限;
- 请求生命周期:
id全程跟踪,断连时所有挂起请求统一失败返回,不会悬挂等待; - 原子更新:临时文件 + rename,杜绝半截二进制;
- 最小化阻塞:读循环跑在后台队列,命令分派逐条 autorelease,避免内存峰值。
六、延伸阅读与源码导航
| 模块 | 路径 | 说明 |
|---|---|---|
| 来宾端守护进程 | scripts/vphoned/ | 各功能子模块:vphoned_hid.m、vphoned_files.m、vphoned_keychain.m、vphoned_install.m等 |
| 协议实现 | vphoned_protocol.m | 帧解析/组帧核心 |
| 宿主端客户端 | VPhoneControl.swift | 连接、握手、请求-响应匹配、重连 |
| 构建 | scripts/vphoned/Makefile | iOS 交叉编译与签名哈希注入 |
| 文档 | docs/README_zh.md | 中文版项目总览 |
总结
vphoned 用一个不到几 KB 消息头的 JSON 协议,把 iOS 虚拟机变成了一个完全可编程的远端设备:vsock 保证通道可靠且与网络隔离,hello握手完成能力发现与热升级,id机制实现异步请求-响应,能力分派让每个菜单项都能"一键"落到虚拟机内的系统 API 上。这正是 vphone-cli 从"能启动 iPhone 虚拟机"进化到"能像 xcode 一样操纵 iPhone"的关键一步。如果你想动手研究,建议从 vphoned_protocol.h 的 20 行接口读起,再对照 VPhoneControl.swift 看宿主端如何复用同一套帧格式——两端代码加起来不到两千行,非常适合作为理解 vsock 通信的优秀范例。
【免费下载链接】vphone-cli项目地址: https://gitcode.com/GitHub_Trending/vp/vphone-cli
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考