HackiOS启动 Apple 的开源XNU 内核(xnu-8796.121.2,即 iOS 16.5 的内核)在 Android 手机硬件上,并运行未经修改的 iOS 16.5 用户空间在其之上:launchd → backboardd → SpringBoard → 应用。我们自己的 EFI 加载器、我们自己替代 Apple 闭源驱动的实现、一个 UEFI 移植,以及运行在兼容层上的 Linux Wi-Fi 驱动,使这一切成为可能。
它运行在两个地方:
- POCO X5 Pro 5G(redwood,Snapdragon 778G)—— 不刷写任何东西:UEFI 通过
fastboot boot启动,整个系统驻留在 RAM 中,重启后手机回到 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. 的商标。
在手机上拍摄,Adreno GPU 正在绘制(gpu=1)。更多见截图。
可用的功能
| 可用 | 尚不可用 |
|---|---|
| 锁屏、滑动解锁、带全部图标的主屏幕(两页)、原生 iOS 16 壁纸 | 蜂窝网络、蓝牙 |
| 系统手势:上滑(主屏幕、应用切换器)、边缘滑动(返回)、控制中心 | 在我们的内核下充电(手机只会放电) |
| 应用:设置、时钟、日历、照片、备忘录、Safari 等;手机上的小组件(天气、日历) | 为应用提供 Metal 支持(进行中:456 个系统着色器中已有 293 个在 Adreno 上运行,见docs/air.md在 hackios-xnu-userland 中) |
| 手机触摸屏(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 | |
| 声音(扬声器、主麦克风),Camera.app 中的相机(前置/后置、预览、对焦、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 或更新版本——它
git clone https://github.com/oosexgang/hackios-xnu-kernel.git hackios cd hackios common/setup.sh #将 hackios-xnu-userland 带入同一目录树,检查主机 ios165/fetch.sh #从 Apple 的 CDN 下载 7.4 GB 并解压所需内容(5-15 分钟) common/build.sh qemu-virt #构建 APFS 镜像(以及内核,如果工具链存在) common/run.sh qemu-virt #在 QEMU 窗口中运行 20 分钟的会话
锁屏在 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/ #声音(adsp=1)
adb pull /vendor/firmware/aw8697_haptic.bin fw-haptic/ #触觉反馈(将fw-*目录放在工作区旁边。Wi-Fi 还需要fw-wifi/mac——无线电的地址,占一行——以及fw-wifi/network——网络名称和密码。userland/build.sh打印出写入了哪个固件。)
common/build.sh redwood GL=1 #镜像 + out/redwood-boot.img common/run.sh redwood 900 #加载器进入 RAM,系统镜像进入 RAM,15 分钟的会话
或使用以下命令逐步执行xl:
./xl enter #Android -> fastboot -> 我们的加载器进入 RAM(fastboot boot);它建立自己的 USB 连接 ./xl ramdisk #将系统镜像上传到手机的 RAM(2.5 GB,约 80 秒),每个加载器会话一次 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 #回到 Android
./xl不带参数时会列出所有命令(日志、屏幕和声音录制、摄像头帧、停止、状态……)。
预构建启动镜像
每个版本都有hackios-redwood-boot.img附带:内含我们加载器的 redwood UEFI,可直接用于fastboot boot。它不包含任何 Apple 文件;系统镜像仍在你自己的机器上生成(见上文)。
从源码构建
common/build.sh <device>会运行这台机器能运行的每一步,并使用prebuilt/处理其余部分。
- 内核—— 需要theos在
~/theos(cctools 和iPhoneOS16.5.sdk)以及clang lld python perl。详情: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 + 加载器平台
然后按照docs/PORTING.md:UEFI 移植、加载器的平台描述、内核的驱动、固件。设备 profile 位于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/touch.py stacks NAME实时栈(QEMU):qemu/symstack.py LOG NAME,然后ipsw(需要 - )。检查如何骗过你:docs/checks.md
。
截图GL=1 REST=1从手机屏幕,一次会话(gpu=1,
):
- 许可证
ios165/fetch.sh仓库中没有任何 iOS 文件: 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 的衍生作品,必须如此,而我们此处的其他代码(加载器、脚本)也在同一许可证下发布。第三方代码保留其自身许可证,如上所列。
团队
OOSEX GANG —@oodze(创始人),@netusd,@wannqn,@hxfuxyyXD。新闻:t.me/oosexgangdevs。













