
vphoned守护进程解析vphone-cli如何用vsock JSON协议远程控制iOS虚拟机【免费下载链接】vphone-cli项目地址: https://gitcode.com/GitHub_Trending/vp/vphone-clivphone-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.vphonedRunAtLoad和KeepAlive均为 true见 vphoned.plist。监听端口绑定 vsock 地址族AF_VSOCK的1337 端口VPHONED_PORTvsock 是虚拟化环境中专用的宿主↔来宾通信通道不走真实网络栈。能力矩阵启动时加载按键、定位、剪贴板、应用管理等各功能模块在握手时把可用能力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协议版本当前为 1t消息类型如hello、hid、ping、file_listid请求 ID十六进制序号响应中原样回传用于匹配请求与响应读写逻辑非常严谨vp_read_fully/vp_write_fully循环读写直到字节数精确避免粘包/拆包问题异常路径用vp_drain丢弃多余字节保持流同步。宿主端实现位于 VPhoneControl.swift用VZVirtioSocketDeviceVirtualization.framework 的 virtio-vsock 设备拨号连接 1337 端口并维护一个按id索引的待处理请求表——请求发出后异步等待后台读循环收到带相同id的响应即回调超时未回则报requestTimedOut。这种设计的好处JSON 可读性好、JSON 承载控制语义、二进制数据文件、图片、更新包则走JSON 头 裸字节流的混合传输两全其美。三、握手与自动更新守护进程自己会升级vphoned 最巧妙的设计之一是自更新流程如下宿主连接后发送hello并携带本机 vphoned 二进制的 SHA-256 哈希bin_hashvphoned 计算自身可执行文件的哈希做比对若不一致握手响应中置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/MakefileiOS 交叉编译与签名哈希注入文档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),仅供参考