夜雨聆风学习资料网

ARTICLE · 1198778

【iOS模拟器】代码开源+保姆级教程!让iOS跑在安卓、Linux上!

【iOS模拟器】代码开源+保姆级教程!让iOS跑在安卓、Linux上!

一张图。

这是 iOS 的主屏幕。图标和状态栏都在,Dock 也能用。

但它不是跑在 iPhone 上。

上面两张分别是锁屏和「关于本机」。做这个模拟器的项目叫 Inferno,由 ChefKiss 团队维护,GitHub 上 3,900 多 star。

01  它是 QEMU 的一个分支

这一点得先说清楚,因为它决定了后面所有步骤。

Inferno 是 QEMU 的分支,不是从零写的模拟器。

仓库里的目录结构几乎就是 QEMU 的样子,`hw/`、`target/`、`tcg/`、`ui/`、`qom/` 这些都在。它做的工作,是在 QEMU 里补上 Apple 的芯片和设备。

表 1 · 它模拟了什么

模块
说明
显示
AppleDisplayPipe
触控
MT SPI 多点触控
安全隔区
SEP ROM 加 SEP 固件
IOMMU
DART
协处理器
Always-On Processor
启动
SecureROM
DMA
SmartIO
缩放
硬件缩放器,实验性,需手动在 `boot.c` 里开

第三行是重点。Secure Enclave 也模拟出来了。

这块芯片是苹果的安全核心,管密钥、管加密。把它模拟出来,意味着系统能正常解密 Data 分区,才能启动。少了这一步,iOS 根本起不来。

02  目前能跑到哪一步

项目在文档里写得很实在。

表 2 · 支持情况

设备
状态
iPhone 11
能启动到 SpringBoard
iPhone 6s Plus
开发中,能启动但不能恢复,没有界面
ARM Mac(M 系列)
计划中
iPad
计划中
其他 iPhone
计划中

支持的 iOS 版本目前只有 14.x。 13、15、16、17、18 和 26 都列在计划里。

「能启动到 SpringBoard」这个说法很关键。SpringBoard 是 iOS 的桌面进程,能到这一步意味着系统跑起来了,能看到主屏幕、能点图标。

03  为什么要两台虚拟机

这是整个教程里最反直觉的一点。

它需要两台虚拟机。 项目把跑 iOS 的那台叫主虚拟机,另一台叫伴随虚拟机。

为什么? 因为恢复 IPSW 和联网这两件事,主虚拟机自己做不到。

表 3 · 两台机器各干什么

主虚拟机
伴随虚拟机
跑什么
iOS 系统
恢复工具链
恢复固件
不参与
`idevicerestore`
网络
靠伴随机转发
提供 USB 连接
内存要求
最低 6GB
—
磁盘要求
约 32GB 空闲
—

第二行和第三行是核心。伴随虚拟机通过 USB 连到主虚拟机上,然后在这个连接上跑恢复工具,把 iOS 刷进去。联网也是通过这条 USB 走反向共享。

项目说未来会做「不需要伴随机的恢复」,但目前还没做。

04  编译要装哪些依赖

步骤本身不难,难的是依赖多。

官方给三个平台的命令,macOS 用 Homebrew,Arch 用 pacman,Debian 系用 apt。下面以 macOS 为例。

brew install libtool meson ninja pkgconf dtc glib gnutls \ jpeg-turbo libpng libslirp libssh libusb lzo ncurses \ pixman snappy vde zstd libtasn1 lzfse

然后拉代码、更新子模块、配置、编译。

git clone https://github.com/ChefKissInc/Inferno cd Inferno && git submodule update --init mkdir build && cd build ../configure --target-list=aarch64-softmmu,x86_64-softmmu \ --enable-lzfse --enable-slirp --enable-nettle --enable-gnutls \ --disable-werror ninja

两个细节要多看两眼。

第一,子模块必须先更新。忘了这步编译会报一堆找不到文件的错。

第二,Linux 上可能撞到 Nettle 版本太老。文档里明确写了,低于 3.10 就得手动编。而且它给了一条很讲究的命令,下载之后先校验 sha256 再解压。

这里要问一句,为什么一个教程要教你怎么验哈希?

因为它在防供应链投毒。源码包从镜像站下载,镜像站遭篡改是真实存在的风险。

校验哈希这一步多花十秒,但能挡住这一类问题。这份手册在细节上的讲究,不只体现在这里。

05  恢复流程和那串参数

编译完,就到了启动环节。

启动命令很长,因为它要把一堆镜像文件挂成 NVMe 设备。root、firmware、syscfg、ctrl_bits、nvram、effaceable 和 panic_log,共七个命名空间,每一个都要指定扇区大小。

然后设置内存盘。这里有个容易踩的坑。

目录里有两个 RAM Disk,小的那个用来恢复,大的那个用来升级。

刷机命令在伴随虚拟机里跑。

idevicerestore --erase --restore-mode -i 0x1122334455667788 \ iPhone11,8,iPhone12,1_14.0_18A5351d_Restore.ipsw -T root_ticket.der

那个 `-i` 参数要注意。 它要填设备的 ECID,也就是芯片的唯一编号。这个值必须和你模拟的设备对上。

文档还提醒了一件事。USB 目前不稳定,恢复前建议断开 SSH 这类连接,否则可能因为资源紧张失败。

06  不补文件系统起不来

恢复完之后还不能用,得打补丁。

这一步是必须的,因为还没有 GPU 模拟。 系统默认走硬件渲染,模拟器提供不了,所以要改成软件渲染。

表 4 · 两个补丁

补丁
改什么
dyld 共享缓存
用 InfernoFSPatcher 处理
launchd 服务缓存
禁用五个会出问题的服务

第二个补丁要禁用的服务是这些。

com.apple.voicemail.vmd com.apple.CommCenter com.apple.CommCenterMobileHelper com.apple.CommCenterRootHelper com.apple.locationd

这里要问一句,为什么是这五个服务?

看出来了吗,四个和通信有关,一个和定位有关。因为基带还没做(项目标的是 WIP),所以凡是依赖蜂窝网络的服务都会把系统卡住。定位同理。

改法是把 plist 转成可读格式,给这几个服务各加一个 `Disabled` 键,值设为 `true`。

这一步在 macOS 上做。 文档里写了,Linux 和 Windows 的第三方 APFS 驱动没测过。

07  现在还做不到什么

项目自己列了一份常见问题,答得很干脆。

表 5 · 能用和不能用

功能
状态
启动到桌面
能
iCloud、App Store
不能
指纹和面容
不能
锁屏密码
不能
NFC 和 Apple Pay
不能
音频
开发中
基带
开发中

iServices 不能用的原因,文档给得挺技术,可能和 iOS 内部一个叫 Legacy FairPlay Key Descrambler 的 AES 硬件指令有关。

还有三条安全提醒,必须记住。

别设锁屏密码,目前不工作。别开定位服务。 别用「抹掉所有内容和设置」,会把系统搞坏。

第三条的后果最严重。原因是抹掉操作会触发恢复流程,而当前的文件系统补丁在恢复流程里不完整。

许可和背景

Inferno 的许可证有点特别。

主体沿用 QEMU 的 GPL v3,团队自己写的代码用 AGPL v3。

README 里解释了为什么用更严的 AGPL。因为之前有公司拿这个项目的代码做了闭源付费产品。

所以它加了 AGPL 这一层。AGPL 的要求是,只要你把这个软件作为网络服务提供给别人用,就必须开源你的修改。

品牌方面也有单独的限制条款,写在 `ui/icons/CKBrandingNotice.md` 里。

两个容易看漏的点

第一,项目强调它是人写的。

README 里挂了一个徽章,上面写着「written by humans, not AI」。在一个 AI 生成代码越来越普遍的时间点,这个徽章本身就是一种表态。

第二,它的门槛是真的高。

6GB 内存、32GB 磁盘、两台虚拟机、一堆依赖、一次编译、一次恢复、两个补丁。哪一步出错都得回头查。

但它把每一步都写下来了。 文档站上有完整的手册,从宿主机准备到文件系统补丁,分九节,每节都有具体命令和注意事项。

你有没有想过,为什么这么多年没人把 iOS 模拟出来?

项目地址

https://github.com/ChefKissInc/Inferno

官方手册

https://chefkiss.dev/guides/inferno/

许可

GPL v3(主体)+ AGPL v3(项目自有代码)

相关学习资料