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 阶段这一档做了什么
less42Patchless,保留 iOS 自带缓解机制
regular4210AMFI / SSV / Img4 / TXM 绕过
dev5312再加 TXM entitlement 与调试绕过
jb11314再加完整越狱,首启自动装 Sileo、TrollStore
exp14118JB 超集 + 反 VM 检测研究补丁

表里那些数字不是形容词。仓库里 research/0_binary_patch_comparison.md 一份文档,把 AVPBooter、iBSS、iBEC、LLB、TXM、kernelcache、CFW 安装各阶段的每一条二进制改动逐条列了出来——补丁名、目标函数名、它被哪几档启用,都标了。文档还专门说明了 exp 与 jb 的差集:「EXP 是 JB 的超集」,分叉只在那几条实验项上。

被中和掉的安全机制,它自己列了一份清单

同一份文档末尾还有一张汇总表,把「哪些安全机制被绕过或禁用了」直接列成清单。逐条读下来是这些:

反过来那张名单:哪些是故意不补的

真正让我服气的是另一张表:明确不补的库。文档列了 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-procursus2.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