跳到正文
Hacker News· aghuang·· 5 小时前AI 评分58

OOSEX GANG 开源 HackiOS:在 Android 手机和 QEMU 上运行 iOS 16.5 固件

Show HN: Run full iOS 16.5 firmware on Android Devices

AI 导读

OOSEX GANG 开源 HackiOS 项目,用自研 EFI loader 和 UEFI 移植在 Android 手机硬件上启动苹果开源 XNU 内核(xnu-8796.121.2,即 iOS 16.5 内核),并在其上运行未修改的 iOS 16.5 用户空间,从 launchd 到 SpringBoard 再到应用。

正文 · AI 翻译

HackiOS 在 Android 手机硬件上启动 Apple 的开源 XNU 内核(xnu-8796.121.2,即 iOS 16.5 的内核),并在其上运行未经修改的 iOS 16.5 用户空间:launchd → backboardd → SpringBoard → 应用。我们自己的 EFI 加载器、我们自己对 Apple 闭源驱动的替代实现、一个 UEFI 移植,以及运行在兼容层上的 Linux Wi-Fi 驱动,使这一切成为可能。

它运行在两个地方:

  • POCO X5 Pro 5G(redwood,Snapdragon 778G)——不刷写任何东西:UEFI 通过 fastboot boot 启动,整个系统驻留在内存中,重启后手机便回到 Android;
  • QEMU(virt,aarch64)——在任何 Linux 电脑上做同样的事,无需手机。

本仓库是该项目的一半:

仓库 内容
hackios-xnu-kernel(本仓库) XNU 补丁、EFI 加载器、UEFI 移植、Wi-Fi、QEMU 脚本、xl、预构建的内核/加载器/UEFI、common/ 脚本
hackios-xnu-userland 我们的 init、注入的库、launchd 任务、APFS 镜像构建器、从 Apple 的 IPSW 中提取 iOS 的脚本、Metal/Mesa 相关工作

两个仓库中都不含任何 Apple 文件。ios165/fetch.sh 从 Apple 自己的 CDN 下载 iOS 16.5 IPSW 到你的机器,并在那里提取所需内容。HackiOS 是 OOSEX GANG 的一个独立研究项目,与 Apple Inc. 无关联,也未获其授权或认可。iOS、iPhone 和 Apple 是 Apple Inc. 的商标。

Lock screen Home screen Control Center Settings

在手机上拍摄,由 Adreno GPU 绘制(gpu=1)。更多见 Screenshots。

可用的功能

可用 尚不可用
锁屏、滑动解锁、带全部图标的主屏幕(两页)、iOS 16 原生壁纸 蜂窝网络、蓝牙
系统手势:上滑(主屏幕、应用切换器)、边缘滑动(返回)、控制中心 在我们的内核下充电(手机只会放电)
应用:设置、时钟、日历、照片、备忘录、Safari 等;手机上的小组件(天气、日历) 应用的 Metal 支持(进行中:456 个系统着色器中已有 293 个在 Adreno 上运行,见 hackios-xnu-userland 中的 docs/air.md)
手机触摸屏(Goodix GT9916)、多点触控、触摸唤醒;真实的电源键和音量键 App Store 内容和 Apple ID 登录(无 Secure Enclave;FairPlay 守护进程退出)
最多 8 个 CPU 核心(cpus=8),大核 2.4 GHz,约 20 秒进入锁屏 视频和实况照片录制
通过 Mesa/freedreno 使用 Adreno 642L GPU(gpu=1,为 CoreAnimation 提供 OpenGL ES)
Wi-Fi(WCN6750,ath11k):从设置中连接,通过 Wi-Fi 使用 Safari,55–90 Mbit/s
声音(扬声器、主麦克风)、相机应用中的摄像头(前置/后置、预览、对焦、HEIC 照片)
iOS 写入的数据在重启后保留(var_store=1 ufs_write=1);iOS 根卷位于手机闪存上
Sileo + Procursus(dpkg、apt)、插件、SSH

它是研究平台,不是 ROM:一次会话持续给定的秒数,然后内核返回加载器并交出日志。

快速开始:QEMU,无需构建内核

prebuilt/ 包含由这些仓库构建的内核、加载器和我们的程序,因此你只需要系统镜像,它会在你的机器上从 Apple 的 IPSW 制作。

需要:Linux x86-64、约 12 GB 可用磁盘、4 GB 可用内存。软件包(Arch):

sudo pacman -S --needed git python 7zip lz4 gcc qemu-system-aarch64 qemu-ui-gtk edk2-aarch64

(Debian/Ubuntu:git python3 7zip liblz4-dev gcc qemu-system-arm qemu-efi-aarch64;7-Zip 必须为 23 或更新版本——它可读取 APFS。)

git clone https://github.com/oosexgang/hackios-xnu-kernel.git hackios
cd hackios
common/setup.sh               # brings hackios-xnu-userland into the same tree, checks the host
ios165/fetch.sh               # downloads 7.4 GB from Apple's CDN and extracts what is needed (5-15 min)
common/build.sh qemu-virt     # builds the APFS images (and the kernel, if the toolchain is there)
common/run.sh qemu-virt       # a 20-minute session in a QEMU window

锁屏在 2–3 分钟后出现。

  • 按住鼠标左键 = 手指。解锁/离开应用:从最底部边缘上滑;返回:从左侧边缘滑动。
  • 按键:H 主屏幕,L 锁定/电源,↑/↓ 音量,F11(按住)五指。
  • 通过脚本:qemu/touch.py swipe 0.5 0.985 0.5 0.3 250、qemu/touch.py tap 0.615 0.71、qemu/touch.py key home;截图:qemu/screendump.sh shot.png。
  • SpringBoard 出现后系统仍在注册应用:请给它 30–40 秒。
  • Debian/Ubuntu UEFI 固件:QEMU_EFI=/usr/share/AAVMF/AAVMF_CODE.fd QEMU_VARS=/usr/share/AAVMF/AAVMF_VARS.fd。

在手机上(POCO X5 Pro 5G)

你需要一台已解锁引导加载程序的 POCO X5 Pro 5G(redwood)、adb 和 fastboot,以及上一节中的镜像。不会向手机存储写入任何内容。

手机自身的固件不在仓库中,也无法放入仓库:它属于厂商,取自将要运行它的那台手机,来自其 Android:

adb pull /vendor/firmware/a660_{gmu.bin,sqe.fw,zap.mdt,zap.b00,zap.b01,zap.b02} fw-gpu/      # GPU (gpu=1)
adb pull /vendor/firmware_mnt/image/wpss.{mdt,b02,b03,b04,b05,b06,b07} fw-wifi/              # Wi-Fi (wifi=1)
adb pull /vendor/firmware_mnt/image/adsp.{mdt,b02,...,b36} fw-audio/                         # sound (adsp=1)
adb pull /vendor/firmware/aw8697_haptic.bin fw-haptic/                                       # haptics

(将 fw-* 目录放在工作区旁边。Wi-Fi 还需要 fw-wifi/mac——无线电在一行上的地址——以及 fw-wifi/network——网络名称和密码。userland/build.sh 会打印出装入了哪个固件。)

common/build.sh redwood GL=1          # images + out/redwood-boot.img
common/run.sh redwood 900             # loader into RAM, system image into RAM, a 15-minute session

或使用 xl 逐步执行:

./xl enter            # Android -> fastboot -> our loader in RAM (fastboot boot); it brings up its own USB link
./xl ramdisk          # upload the system image into the phone's RAM (2.5 GB, ~80 s), once per loader session
XL_SECS=900 XL_CMDLINE="touchscreen=1 cpufreq=1 bootcpu=7 cpus=8 gpu=1 wifi=1 adsp=1" ./xl run
./xl screenshot shot.png
./xl reboot           # back to Android

不带参数的 ./xl 会列出所有命令(日志、屏幕和声音录制、相机帧、停止、状态……)。

预构建启动镜像

每个版本都附带 hackios-redwood-boot.img:内含我们加载器的 redwood UEFI,可直接用于 fastboot boot。它不包含任何 Apple 文件;系统镜像仍在你的机器上制作(见上文)。

从源码构建

common/build.sh <device> 会运行此机器能运行的每一步,其余步骤使用 prebuilt/。

  • Kernel — needs theos in ~/theos (cctools and iPhoneOS16.5.sdk) and clang lld python perl. Details: xnu/README.md.
    xnu/apply.sh && xnu-deps/setup.sh && ./xnu-build.sh -j8 -k
  • 加载器 — xnuloader/build.sh(clang + lld-link,一个不使用 EDK2 的 EFI 应用程序)。
  • 镜像 — REST=1 userland/build.sh(变量在该文件顶部有说明)。
  • UEFI — uefi/README.md(Project Silicium 移植);运行不需要,prebuilt/uefi 已包含它。
  • 重新构建后:tools/update-prebuilt.sh 会刷新 prebuilt/。

移植到其他设备

common/new-device.sh <codename> path/to/device.dtb   # profile + loader platform from the phone's device tree

然后按照 docs/PORTING.md 操作:UEFI 移植、加载器的平台描述、内核的驱动程序、固件。设备配置文件位于 common/devices/(redwood.conf、qemu-virt.conf、_template.conf)。

工作原理

fastboot boot ──► UEFI (Mu-Silicium) ──► xnuloader (EFI application)
                                           │  stays resident: USB link (fastboot protocol),
                                           │  watchdog, receives the kernel's log
                                           ▼
            XNU (BCM2837 config as the base + our platform)
              ├─ GICv3, timer, video console, return to the loader
              ├─ APFS (images in RAM, iOS volume on flash), ramfs (/private/var, /tmp)
              ├─ minicrypto instead of corecrypto, AMFI and Sandbox stand-ins (MAC policies)
              ├─ driver replacements: IOSurface, IOMobileFramebuffer, AppleKeyStore, network stack
              ├─ input: /dev/redwood-touch ◄─ Goodix GT9916 (phone) / virtio-input (QEMU)
              ├─ GPU: Adreno 642L, Wi-Fi: WCN6750 (ath11k via LinuxKPI), sound: ADSP / virtio-sound
              ▼
   iOS 16.5 launchd → logd, notifyd, cfprefsd, runningboardd, backboardd, SpringBoard, apps
              ├─ our libraries are injected into backboardd, SpringBoard and mediaserverd
              │  (virtual HID services, a few ObjC method swaps — in memory only)
              └─ mediaserverd gets our CoreAudio output device (RedwoodAudio.driver)

iOS 程序、框架和 dyld 共享缓存一个字节都没有改变:它们缺少的功能由内核(驱动程序替换)或由内核通过 DYLD_INSERT_LIBRARIES 注入的库(kern.exec_inject)来完成。

布局

路径 内容
common/ setup.sh(工作区)、build.sh / run.sh(按设备)、new-device.sh、devices/*.conf、ugit
xl 通过 USB 驱动手机:加载器、内核运行、日志、截图、屏幕和声音录制
xnuloader/ 加载器:loader.c(UEFI 应用程序)、mkpayload.py(内核 + 镜像 + 参数容器)
xnu/ 我们对 XNU 的修改:补丁、新文件、apply.sh / export.sh
xnu-deps/ 在 Linux 上构建 XNU 所需的一切:setup.sh、工具包装器、桩
xnu-build.sh、xnu-env.sh 内核构建
uefi/、mkxnuimg.py UEFI 移植以及为 fastboot boot 打包启动镜像
wifi/lx/ Linux 的 Wi-Fi 驱动程序为我们的内核构建所依赖的层
qemu/ QEMU 运行、触摸输入、截图、栈符号化
tools/ 录制(recording.py、sound.py)、UFS/闪存工具、mk-ath11k.sh、new-workspace.sh、主机测试
prebuilt/ 构建好的内核、加载器和 UEFI 部分(NOTICES.md 用于内核中的第三方代码)
docs/ 截图、checks.md、PORTING.md

调试

  • 会话日志:QEMU 的 stdout 或来自手机的 logs/HHMMSS-run.log。
  • RC_JOBS=rc.jobs.tour REST=1 userland/build.sh — 一个能解锁并打开第一页所有应用的镜像。
  • 日志中的 userabort: 是调用了 abort() 的进程的栈;usertrap:(配合 systrace=1)— 崩溃。
  • 实时栈(QEMU):qemu/touch.py stacks NAME,然后 qemu/symstack.py LOG NAME(需要 ipsw)。
  • 检查如何可能欺骗你:docs/checks.md。

截图

从手机屏幕,一次会话(GL=1 REST=1、gpu=1):

Home screen, page 2 Search Settings > General Calendar Clock

Wallet Messages Music Maps App Store

许可证

  • 仓库中不包含任何 iOS 文件:ios165/fetch.sh 会从 Apple 的 CDN 将它们下载到你的机器上。
  • xnu/ 是 XNU 的衍生作品,与 XNU 本身一样在 APSL 2.0 下分发;prebuilt/mach.* 是由它构建的内核。它还包含 ath11k(BSD-3-Clause-Clear)和 FreeBSD LinuxKPI 代码(BSD-2-Clause):参见 prebuilt/NOTICES.md。
  • xnu/files/bsd/miscfs/apfs/libzbitmap/ 和 xnu-deps/build/lzbitmap/ — libzbitmap(Corellium LLC,此处为 MIT);xnu/files/bsd/miscfs/apfs/libdeflate/ — libdeflate 1.24(Eric Biggers,MIT,此处为 COPYING)。
  • ath11k、Linux 和 FreeBSD 的源码不在仓库中:tools/mk-ath11k.sh 会拉取固定版本的发布包。 wifi/lx/patches/*.patch 是我们对 FreeBSD 头文件的改动;wifi/lx/ 的其余部分是我们的。
  • uefi/files/Binaries/redwood 和 prebuilt/uefi/SILICIUM_UEFI.fd 包含来自手机小米固件的 UEFI 驱动,其分发方式与 Project Silicium 为其他设备分发它们的方式相同; prebuilt/uefi/mkbootimg.py — AOSP,Apache-2.0。
  • 本仓库依据 Apple Public Source License 2.0 授权:我们对 XNU 的改动是 XNU 的衍生作品,必须如此,而我们在此处的其他代码(loader、脚本)也以相同许可证发布。第三方代码保留其自身许可证,如上所列。

团队

OOSEX GANG — @oodze(创始人)、@netusd、@wannqn、 @hxfuxyyXD。新闻:t.me/oosexgangdevs。

来源:Hacker News · github.com