GitHub 趋势 · 第 47 期
在 Mac 上跑真 iOS:它把 141 处系统防护做成了五档旋钮
#iOS虚拟化#二进制补丁#AppleSilicon
这期这个项目值得写的,不是「能在 Mac 上看 iOS 桌面」——想要那个效果,模拟器早就给了。值得写的是它把「绕过多少层系统防护」做成了一个命令行参数:从 4 处补丁到 141 处,五档,明码标价摆在 README 里,你自己选。
一份肯把风险编上号摊开的项目,比一份假装自己没有风险的项目可信得多。
要测 iOS 应用的人大概都撞过同一堵墙:模拟器不是真系统。你可以在 Xcode 模拟器里点 UI,但碰不到真机核心里那一层——TCC 授权、沙盒策略、LaunchServices 注册、显示管线、推送设备身份,全是另一个世界的行为。真机又只有一台,一次 DFU 恢复之后很难回到干净状态。
中间那层需求——「一台可以随便弄坏、坏了就重来的真 iOS」——长期是空的。
项目是什么:借 Apple 自己的虚拟化能力,启动一台真 iPhone
项目是 Lakr233/vphone-cli,Swift 写的命令行工具。README 第一句原话:
Boot a virtual iPhone via Apple’s Virtualization.framework using PCC research VM infrastructure.
翻译过来:它借 Apple 自己的 Virtualization.framework,配合 PCC(Private Cloud Compute)研究虚拟机的底层设施,在 Apple Silicon 上启动一台虚拟 iPhone。跑的是真实 iOS 系统镜像——一份 iPhone IPSW,加一份叫 cloudOS 的伴随镜像——不是重写的兼容层。
一条命令走完全流程:下载 → 打补丁 → DFU 恢复 → 装 CFW → 首次启动。所有产物都落在 ~/.vphone/ 下,仓库和 .app 里不留数据,整个目录树可以用 $VPHONE_ROOT 重定向。
一个参数,五档:从 4 处补丁到 141 处
README 有一张表,五档按「绕过多少层安全」递增。这一档由 --variant 指定。
| 档位 | 引导链补丁 | CFW 阶段 | 这一档做了什么 |
|---|---|---|---|
| less | 4 | 2 | Patchless,保留 iOS 自带缓解机制 |
| regular | 42 | 10 | AMFI / SSV / Img4 / TXM 绕过 |
| dev | 53 | 12 | 再加 TXM entitlement 与调试绕过 |
| jb | 113 | 14 | 再加完整越狱,首启自动装 Sileo、TrollStore |
| exp | 141 | 18 | JB 超集 + 反 VM 检测研究补丁 |
表里那些数字不是形容词。仓库里 research/0_binary_patch_comparison.md 一份文档,把 AVPBooter、iBSS、iBEC、LLB、TXM、kernelcache、CFW 安装各阶段的每一条二进制改动逐条列了出来——补丁名、目标函数名、它被哪几档启用,都标了。文档还专门说明了 exp 与 jb 的差集:「EXP 是 JB 的超集」,分叉只在那几条实验项上。
被中和掉的安全机制,它自己列了一份清单
同一份文档末尾还有一张汇总表,把「哪些安全机制被绕过或禁用了」直接列成清单。逐条读下来是这些:
- ▪签名校验:DGST、Img4 / image4 镜像签名,引导链层面改为接受任意 payload
- ▪TXM:trustcache 查找改成恒真、调试器 entitlement、开发者模式门
- ▪AMFI:post-validation 跳过、cdhash trust-cache 恒真、execve kill 路径改成放行
- ▪SSV 与 APFS seal:跳过 sealed-volume 检查与 seal panic
- ▪Launch constraints、dyld 策略、Sandbox / MACF 钩子(含 IOKit 一批)
- ▪代码签名页哈希:逐页重算 CodeDirectory 槽位,规避 Invalid Page 被 SIGKILL
- ▪Lockdown Mode 查询、轻量代码要求(LWCR)断言、LaunchServices entitlement 注册门
- ▪相机 TCC 授权:直接返回 Authorized
反过来那张名单:哪些是故意不补的
真正让我服气的是另一张表:明确不补的库。文档列了 9 个,理由写得很具体——在这些库上打补丁,会关掉让它们不去碰真实 silicon ANE / AGX / 硬件编解码器的 VM 快速路径:
System/Library/Frameworks/CoreML.framework/CoreML System/Library/PrivateFrameworks/Espresso.framework/Espresso System/Library/PrivateFrameworks/AppleNeuralEngine.framework/AppleNeuralEngine System/Library/PrivateFrameworks/CoreRE.framework/CoreRE System/Library/PrivateFrameworks/RenderBox.framework/RenderBox System/Library/PrivateFrameworks/WebGPU.framework/WebGPU System/Library/PrivateFrameworks/caulk.framework/caulk System/Library/PrivateFrameworks/IOSurfaceAccelerator.framework/IOSurfaceAccelerator System/Library/ExtensionKit/Extensions/HostInferenceProviderService.appex/HostInferenceProviderService
换句话说,这份补丁集的边界不是「能补就补」,而是「补了会让系统更坏的地方就不补」。141 这个数字因此反而不像吹点,更像标价:每一档换到什么、丢掉什么,都写在你读得到的地方。
上手:README 原命令
宿主硬条件:Apple Silicon、macOS 15+、Xcode 加 iOS SDK,以及最后那一条——需要放松宿主的安全设置。依赖与安装:
brew install python@3.13 aria2 wget gnu-tar openssl@3 ldid-procursus sshpass keystone cmake libusb ipsw zstd brew install zqxwce/tap/vphone-cli
从源码构建:
git clone --recurse-submodules https://github.com/Lakr233/vphone-cli.git ./scripts/setup_tools.sh # install deps, build toolchain submodules, create the Python venv ./scripts/build.sh # build + sign vphone-cli, bundle the .app, cross-compile vphoned cd .build/vphone-cli.app/Contents/MacOS/ vphone-cli --help
一条命令建完一台 VM,上面那张表的五档就在这里选:
vphone-cli vm create myphone -V jb # -V / --variant vphone-cli vm launch myphone
想手动跑每一段也行,README 把它拆成了对应的五步:
vphone-cli vm new myphone vphone-cli fw prepare myphone --iphone-version 26.1 vphone-cli fw patch myphone --variant jb vphone-cli vm launch myphone --dfu & vphone-cli restore myphone --get-shsh vphone-cli restore myphone vphone-cli vm stop myphone vphone-cli cfw install myphone --variant jb vphone-cli vm launch myphone
连进去:jb 档用 mobile 账号、密码 alpine,regular 与 dev 档用 root,VNC 在 5901 端口。
ssh -p 22222 mobile@<vm-ip> ssh -p 22222 root@<vm-ip> vnc://<vm-ip>:5901
最后是那件必须进恢复模式做的事。README 给了两条路,A 路更彻底、B 路留一点余量:
csrutil disable csrutil allow-research-guests enable sudo nvram boot-args="amfi_get_out_of_my_way=1 -v" # reboot after
B 路是保留 SIP、只保留 debug,再给这个二进制单独加白名单:
csrutil enable --without debug csrutil allow-research-guests enable vphone-amfidont
README 给 A 路的注解是 the most permissive,给 B 路的说明是「leaves AMFI enabled system-wide」——一个把整机放开,一个只放开一个二进制。
我的判断:适合谁、不适合谁、坑
先说结论:这是研究工具,不是消费品。门槛不在命令行,在你愿不愿意为它动宿主机的安全设置。
适合谁
想反复测 iOS 应用、又不想拿真机来回刷机的人——vm clone 是 APFS 快速克隆,而且会生成全新设备身份,这在真机上做不到。
做 iOS 内核、沙盒、代码签名方向研究的人——research/ 目录里那份补丁对比文档本身就是能读的研究材料,不是营销页。
想把 iOS 塞进自动化测试的人——工具暴露了一个宿主控制 socket(vphone.sock),能截屏、触摸、滑动、按硬件键、读写剪贴板,每个动作回一张截图,README 写明这是给 AI 驱动 E2E 测试用的。
不适合谁
拿云上 Mac 实例试的人:FAQ 里「嵌套虚拟化不通」有专门一条,现象是 Virtualization is not available on this hardware,原因是宿主 Mac 自己就是一台 VM,PV=3 客体无法嵌套。
想装完就忘的人:这东西要动你日常那台机器的 SIP 与 AMFI。它不是能试完就删的工具。
坑
1. exp 那 141 处里包含反 VM 检测研究补丁——做法是重命名内核的 hv_vmm_present sysctl OID,再让一批用户态库读不到真实标记。文档写得明明白白,但这一档显然不该日常用。
2. 别用版本号判断成熟度。README 有一条 FAQ 直接自曝上游依赖的 bug:ldid-procursus 到 2.1.5-procursus7(也就是当前 Homebrew 的 stable)在重签系统二进制时会无界吃内存,根因是 __builtin_clzll(0) 没做零值保护、无符号循环计数器下溢,触发条件是任何含整数值 0 的 entitlements plist。官方给了绕过命令:brew install --HEAD ldid-procursus && brew link --overwrite ldid-procursus。
3. 相机只有半个。同一份文档写明相机补丁属于 Stage 0,只放开了授权门,下游真正的帧投递管线(cameracaptured / vcamd)仍是未完成的工作;音频在 VM 上不工作。
4. 这份 10KB 的 README 里没有出现授权范围或合规声明,只有宿主降级步骤。要不要碰,得自己判断。
数据脚注
地址:https://github.com/Lakr233/vphone-cli
star:REST API 实测 11,471;Trending 月榜同期快照 11,576。两者不一致(差 105),此处并列写出,不做取舍。
fork 1,456 · watcher 67 · 未关 issue 26 · 仓库体积约 5,694 KB · 语言 Swift
许可:MIT 标准全文,Copyright (c) 2026 @Lakr233,未追加自定义条款
最新版本:v1.0.14(2026-09-10 发布,非预发布),附件 vphone-cli-1.0.14.zip 约 34.8 MB、下载 303 次;tags 一页 30 个,从 0.1.0 排到 1.0.14
仓库创建 2026-02-26,最近推送 2026-09-10,default_branch 为 main
本期素材取自 README.md、LICENSE、research/0_binary_patch_comparison.md 原文与 GitHub REST API 实测
数据来源:GitHub Trending 官方页面 + GitHub REST API · 抓取时间:2026-09-11
你身边有没有那种「宁愿拿真机刷到冒烟也不肯用模拟器」的人?把这期转给他,顺便问他敢不敢关自己电脑的 SIP。
下期预告:cordiverse/cordis(8,359 star,本月 +8,270,TypeScript)——本期未写项目里月榜动量第一。
#iOS虚拟化#二进制补丁#AppleSilicon