HN 日本語サマリー

← 一覧へ戻る
プログラミング

Show HN: AndroidデバイスでiOS 16.5のフルファームウェアを実行

Show HN: Run full iOS 16.5 firmware on Android Devices (github.com)

493 pointsby aghuang181 コメント

要約

このプロジェクト「HackiOS」は、Androidデバイス上でiOS 16.5のXNUカーネルを起動し、未変更のiOSユーザー空間を実行することに成功しました。カスタムEFIローダー、ドライバー置換、UEFIポートなどを駆使して、ロック画面やホーム画面、一部の標準アプリなどの機能を実現していますが、セルラー通信やBluetoothは未対応です。このプロジェクトはGitHubで公開されており、QEMUまたは特定のAndroidスマートフォンでテスト可能です。

全文翻訳

HackiOS — XNUカーネル

HackiOSは、AppleのオープンソースXNUカーネル(iOS 16.5のカーネルであるxnu-8796.121.2)をAndroidスマートフォンハードウェア上で起動し、その上に未変更のiOS 16.5ユーザー空間を実行します。具体的には、launchd → backboardd → SpringBoard → アプリの順に動作します。独自のEFIローダー、Appleのクローズドソースドライバーの代替、UEFIポート、互換レイヤー上のLinux Wi-Fiドライバーなどがこれを可能にしています。

以下の2つの場所で実行できます。

  • 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イメージビルダー、iOSをAppleのIPSWから抽出するスクリプト、Metal/Mesa作業 |

どちらのリポジトリにもAppleのファイルは含まれていません。 ios165/fetch.shは、AppleのCDNからiOS 16.5 IPSWをあなたのマシンにダウンロードし、必要なものを抽出します。HackiOSはOOSE GANGによる独立した研究プロジェクトであり、Apple Inc.とは提携、認可、または承認されていません。iOS、iPhone、AppleはApple Inc.の商標です。

[画像: ロック画面] [画像: ホーム画面] [画像: コントロールセンター] [画像: 設定]

電話上で撮影された、Adreno GPU描画(gpu=1)。詳細はスクリーンショットを参照してください。

動作するもの

動作するもの
ロック画面、スワイプでアンロック、すべてのアイコンが表示されるホーム画面(2ページ)、標準iOS 16壁紙
システムジェスチャー:上にスワイプ(ホーム、アプリスイッチャー)、端からのスワイプ(戻る)、コントロールセンター
アプリ:設定、時計、カレンダー、写真、メモ、Safariなど。電話上のウィジェット(天気、カレンダー)
電話のタッチスクリーン(Goodix GT9916)、マルチタッチ、タッチでのウェイクアップ。物理的な電源ボタンと音量ボタン
最大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)、Tweak、SSH

動作しないもの(今のところ)

動作しないもの(今のところ)
セルラー、Bluetooth
当社のカーネル下での充電(電話は放電するだけ)
アプリ用のMetal(開発中:456個のシステムシェーダーのうち293個が既にAdrenoで実行中、hackios-xnu-userlandのdocs/air.mdを参照)
App StoreコンテンツとApple IDサインイン(Secure Enclaveなし;FairPlayデーモンが終了する)
ビデオおよびライブフォトの録画

これはROMではなく、研究用ベンチです。セッションは一定秒数持続した後、カーネルはローダーに戻り、ログを引き渡します。

クイックスタート:QEMU、カーネルビルド不要

prebuilt/にはカーネル、ローダー、およびこれらのリポジトリからビルドされたプログラムが含まれているため、必要なのはシステムイメージのみです。これはAppleのIPSWからあなたのマシン上で作成されます。

必要環境:Linux x86-64、約12 GBの空きディスク容量、4 GBの空きRAM。パッケージ(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               # 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(長押し)5本指。
  • スクリプトから: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)

アンロックされたブートローダー、adb、fastbootを備えたPOCO X5 Pro 5G (redwood)と、上記のセクションのイメージが必要です。電話のストレージには何も書き込まれません。

電話自体のファームウェアはリポジトリに含まれておらず、含まれることもありません。これはベンダーのものであり、実行される電話自体、つまりその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/adsp.{mdt,b02,...,b36} fw-audio/                         # サウンド (adsp=1)
adb pull /vendor/firmware/aw8697_haptic.bin fw-haptic/                                       # ハプティクス

(fw-*ディレクトリをワークスペースの隣に配置してください。Wi-Fiにはfw-wifi/mac — ラジオのアドレスを1行で — および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秒)、ローダーセッションごとに1回実行
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   # 電話のデバイスツリーからプロファイル + ローダープラットフォームを取得します

その後、docs/PORTING.mdに従ってください:UEFIポート、ローダーのプラットフォーム記述、カーネルのドライバー、ファームウェア。デバイスプロファイルはcommon/devices/にあります(redwood.conf、qemu-virt.conf、_template.conf)。

仕組み

fastboot boot ──► UEFI (Mu-Silicium) ──► xnuloader (EFIアプリケーション)
                                           │  常駐します:USBリンク(fastbootプロトコル)、
                                           │  ウォッチドッグ、カーネルのログを受信します
                                           ▼
            XNU (BCM2837設定をベースに、独自のプラットフォームを追加)
              ├─ GICv3、タイマー、ビデオコンソール、ローダーへの復帰
              ├─ APFS(RAM上のイメージ、フラッシュ上のiOSボリューム)、ramfs(/private/var、/tmp)
              ├─ corecryptoの代わりにminicrypto、AMFIとSandboxの代替(MACポリシー)
              ├─ ドライバーの置換:IOSurface、IOMobileFramebuffer、AppleKeyStore、ネットワークスタック
              ├─ 入力:/dev/redwood-touch ◄─ Goodix GT9916 (電話) / virtio-input (QEMU)
              ├─ GPU:Adreno 642L、Wi-Fi:WCN6750 (LinuxKPI経由のath11k)、サウンド:ADSP / virtio-sound
              ▼
   iOS 16.5 launchd → logd, notifyd, cfprefsd, runningboardd, backboardd, SpringBoard, アプリ
              ├─ 独自のライブラリがbackboardd、SpringBoard、mediaserverdにインジェクトされます
              │  (仮想HIDサービス、いくつかのObjCメソッドスワップ — メモリ上のみ)
              └─ mediaserverdは独自のCoreAudio出力デバイス(RedwoodAudio.driver)を取得します

iOSのプログラム、フレームワーク、dyld共有キャッシュは一バイトも変更されていません。それらが欠落している部分は、カーネル(ドライバーの置換)またはカーネルがDYLD_INSERT_LIBRARIES(kern.exec_inject)でインジェクトするライブラリによって補われます。

レイアウト

パス
common/
xl
xnuloader/
xnu/
xnu-deps/
xnu-build.sh, xnu-env.sh
uefi/, mkxnuimg.py
wifi/lx/
qemu/
tools/
prebuilt/
docs/

デバッグ

  • セッションログ:QEMUの標準出力または電話からの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。

スクリーンショット

電話の画面から、1回のセッション(GL=1 REST=1、gpu=1)で撮影:

[画像: ホーム画面、ページ2] [画像: 検索] [画像: 設定 > 一般] [画像: カレンダー] [画像: 時計]

[画像: ウォレット] [画像: メッセージ] [画像: 音楽] [画像: マップ] [画像: 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には、Project Siliciumが他のデバイス向けに配布する方法で配布されている、電話のXiaomiファームウェアからのUEFIドライバーが含まれています。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。