
2026/10/23 0:26
Android デバイスで完全な iOS 16.5 ファームウェアを実行する
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
HackiOS は、Apple の許可なく、Android ハードウェア(具体的には POCO X5 Pro 5G)および Linux システム(QEMU を介して)で修正された iOS 16.5 を直接実行することに成功したことで、画期的な進歩を成し遂げました。このプロジェクトは OOSEX GANG によって独自に開発され、XNU カーネルをパッチ適用し、標準的な Apple のアップデートファイルから必要なコンポーネントを抽出することで、Wi-Fi や永続的ストレージなどの特徴をエミュレートしています。システムは最大 8 コアの CPU で 2.4GHz の周波数で動作し、Mesa/freedreno ドライバーを使って実際のハードウェア部品を駆動させながら、ロック画面、ホーム画面、標準のウォールペーパーを含む完全に機能的なインターフェースを起動します。現在 Safari、写真、メモ、設定、ウィジェットが実証されており、システムジェスチャー、マルチタッチ、リブート間のデータ永続性をサポートしています。Metal グラフィックス支援はまだ開発中(シェーダーの実装率は約 59%)であり、Secure Enclave などハードウェアの制限により App Store コンテンツは引き続き制限されていますが、この成就是、非対応アーキテクチャ上で複雑なオペレーティングシステムのリバースエンジニアリングに関する主要な概念実証となります。セットアップには、GPU、Wi-Fi、オーディオ支援のためのベンダーファームウェアを抽出する必要があり、セッションは約 15 分間続き、その後リロードが必要です。
本文
HackiOS: Android ハードウェアでの iOS 16.5 実行プロジェクト
HackiOS は、Android 製スマートフォンのハードウェア上で Apple のオープンソース XNU カーネル(バージョン xnu-8796.121.2、iOS 16.5)を実行し、その上に 未変更の iOS 16.5 ユーザーランドを動作させる研究プロジェクトです。
プロジェクト概要
このシステムを実現するために利用されている主要コンポーネントは以下の通りです:
- 自作 EFI ローダー: ブートプロセスを担う。
- 閉鎖的ドライバーの代替品: Apple 公式ドライバーに代わる実装。
- UEFI ポート: システム起動環境の移植版。
- Linux Wi-Fi ドライバー: 互換性レイヤー上で動作するネットワークスタック。
システムは以下の 2 つの環境で動作します:
- POCO X5 Pro 5G (redwood, Snapdragon 778G)
- フラッシュ(書き込み)作業は一切不要。
- UEFI は
コマンドで起動され、システム全体は RAM 上で動作します。fastboot boot - リブート後、スマートフォンは Android に戻ります。
- QEMU (virt, aarch64)
- Linux コンピュータ上での動作であり、実際のスマートフォンは必要ありません。
リポジトリ構成
本プロジェクトは以下の 2 つのリポジトリで構成されます:
| リポジトリ | 内容 |
|---|---|
| hackios-xnu-kernel (このリポジトリ) | - XNU のパッチ - EFI ローダー - UEFI ポート - Wi-Fi / QEMU スクリプト - xl プログラム - プリビルトされたカーネル/ローダー/UEFI - common/ スクリプト |
| hackios-xnu-userland | - 我々の - 注入ライブラリ - launchd ジョブ - APFS イメージビルダー - Apple の IPSW から iOS を抽出するスクリプト - Metal/Mesa の対応 |
⚠️ 免責事項: どちらのリポジトリにも Apple ファイルは含まれていません。
により、iOS 16.5 の IPSW が Apple の自 CDN からダウンロードされ、必要な要素があなたのマシン上で抽出されます。ios165/fetch.sh
HackiOS は OOSEX GANG による独立した研究プロジェクトであり、Apple Inc. との関連性はありません。承認・推奨も行っておりません。
動作状況一覧
| 動作している項目 | まだ動作していない項目 |
|---|---|
| 🔒 ロック画面: スワイプでの解除、ホーム画面(2 ページ)、標準壁紙 | 📡 セルラー通信 🔵 Bluetooth |
| 👆 システムジェスチャー: 上スワイプ(ホーム/スイッチャー)、エッジスワイプ(戻る) 🎮 コントロールセンター | 🔋 充電機能(スマートフォンは放電のみ) |
| 📱 アプリ: 設定、時計、カレンダー、写真、メモ、Safari など 🌤️ スマートフォンウィジェット(天気等) | |
| ⚙️ Metal 対応アプリ (進行中) Adreno 上で動作するシステムシェーダー 456 個のうち 293 個が実装済み。 詳細: | |
| 👆 タッチスクリーン: Goodix GT9916、マルチタッチ、ウェイク 🔘 電源ボタン・音量キーの実装 | |
| 📂 App Store / Apple ID サインイン Secure Enclave は不可;FairPlay デモンは終了状態 | |
⚡ CPU: 最大 8 コア ()、大コア 2.4GHz⏱️ ロック画面表示まで約 20 秒 | |
| 🎥 メディア録画: ビデオおよび Live Photo | |
📹 GPU: Adreno 642L ()Mesa/freedreno 経由、CoreAnimation 用 OpenGL ES | |
| 🌐 Wi-Fi (WCN6750, ath11k): 設定画面からの接続、Safari 通信(速度 55〜90 Mbit/s) | |
| 🔊 サウンド: スピーカー/マイク 📷 カメラ機能(前面/背面、プレビュー、フォーカス、HEIC フォーマット) | |
💾 データ永続化 によりリブート後も維持。スマートフォンのフラッシュ上に iOS ルートボリューム。 | |
🛠️ ツール: Sileo + Procursus (, )、チート(tweaks)、SSH |
⚠️ 研究用ベンチマーク: 本システムは ROM ではありません。セッションは特定の時間だけ続き、その後カーネルはローダーに戻り、ログを渡します。
素早く始める:QEMU(カーネルビルド不要)
prebuilt/ ディレクトリには、ビルド済みのカーネル、ローダー、およびプログラムが含まれています。必要なものはシステムのイメージのみで、これは Apple の IPSW をあなたのマシン上で作成します。
環境要件
- OS: Linux x86-64
- 空きディスク: 約 12GB
- 空き RAM: 4GB
インストール(パッケージ)
Arch Linux:
sudo pacman -S --needed git python 7zip lz4 gcc qemu-system-aarch64 qemu-ui-gtk edk2-aarch64
Debian/Ubuntu:
sudo apt install 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 # セットアップ (hackios-xnu-userland を同一ツリーに持ち込み、ホスト環境を確認) common/setup.sh # ダウンロードと抽出 (Apple の CDN から 7.4GB, 約 5〜15 分) ios165/fetch.sh # APFS イメージビルド (ツールチェーンがあればカーネルもビルド) common/build.sh qemu-virt # QEMU ウィンドウ内でのセッション開始 (約 20 分間) common/run.sh qemu-virt
🕒 動作確認: ロック画面は起動後 2〜3 分で表示されます。
オペレーションガイド
マウス操作:
- 左ボタン押し込み: フィンガー(タップ)
- 解除・アプリ退出: 画面最下縁から上スワイプ
- 戻る: 画面左端から右へスワイプ
キーボード割り当て:
| キー | 動作 |
|---|---|
| ホームボタン |
| ロック/電源ボタン |
| ボリュームアップ/ダウン |
(長押し) | 5 指タッチ模倣 |
スクリプトからの操作:
# スワイプ (x=0.5, y=0.985, ...) ./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、および上記のイメージが必要です。ストレージへの書き込みは行われず、ファームウェア自体もリポジトリには含まれません。
ファームウェア抽出
以下のコマンドを実行して、GPU、Wi-Fi、サウンド用のファームウェアをワークスペースに移動します:
# GPU (gpu=1) adb pull /vendor/firmware/a660_{gmu.bin,sqe.fw,zap.mdt,zap.b00,zap.b01,zap.b02} fw-gpu/ # Wi-Fi (wifi=1) adb pull /vendor/firmware_mnt/image/wpss.{mdt,b02,b03,b04,b05,b06,b07} fw-wifi/ # サウンド (adsp=1) adb pull /vendor/firmware_mnt/image/adsp.{mdt,b02,...,b36} fw-audio/ # ハプティクス adb pull /vendor/firmware/aw8697_haptic.bin fw-haptic/
📝 Wi-Fi の場合:
(ラジオアドレス) とfw-wifi/mac(SSID/PW) も必要です。fw-wifi/networkが使用したファームウェアを表示します。userland/build.sh
システム起動
方法 1: イメージビルドを使用
# イメージビルド (GL=1 は GPU アクセラレーションを有効化) common/build.sh redwood GL=1 # セッション開始 (ローダーとシステムイメージを RAM に読み込み、約 15 分間のセッション) common/run.sh redwood 900
方法 2: xl ツールを使用(段階的な実行)
./xl enter # Android -> fastboot -> RAM 上のローダー (fastboot boot); USB リンク確立 ./xl ramdisk # システムイメージを RAM にアップロード (約 2.5GB, 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>
構成要素のビルド詳細
- カーネル:
(~/theos
,cctools
) および clang, lld が必要。iPhoneOS16.5.sdkcd xnu ./apply.sh && cd ../xnu-deps && ./setup.sh && cd .. ./xnu-build.sh -j8 -k - ローダー:
(clang + lld-link、EDK2 不使用)。xnuloader/build.sh - イメージ:
(変数はファイル上部に定義)。REST=1 userland/build.sh - UEFI:
(Project Silicium ポート)。ビルド済みはuefi/README.md
。prebuilt/uefi
他のデバイスへの移植
common/new-device.sh <codename> path/to/device.dtb
その後、
docs/PORTING.md に従ってください(UEFI ポート、ローダーのプラットフォーム、ドライバー、ファームウェアの詳細)。
仕組みとアーキテクチャ
システム起動フローは以下の通りです:
graph TD Fastboot[fastboot boot] --> UEFI[UEFI (Mu-Silicium)] UEFI --> Loader[xnuloader (EFI アプリケーション)] subgraph XNU Components direction TB GICv3[GICv3] Timer[タイマー] Console[ビデオコンソール] APFS[APFS (RAM 上のイメージ、フラッシュ上の iOS ボリューム)] Ramfs[Ramfs (/private/var, /tmp)] Crypto[minicrypto の使用 (corecrypto 代替)] AMFI[AMFI とサンドボックスの代替品 (MAC ポリシー)] Drivers[ドライバー代替品: IOSurface, IOMobileFramebuffer...] Input[/dev/redwood-touch ← Goodix GT9916 / virtio-input] GPU[GPU: Adreno 642L] WiFi[Wi-Fi: WCN6750 (ath11k via LinuxKPI)] Sound[サウンド: ADSP / virtio-sound] end UEFI --> XNU[XNU (BCM2837 構成ベース + プラットフォーム対応)] XNU --> GICv3 XNU --> Timer XNU --> Console XNU --> APFS XNU --> Ramfs XNU --> Crypto XNU --> AMFI XNU --> Drivers XNU --> Input XNU --> GPU XNU --> WiFi XNU --> Sound XNU --> iOSApps[iOS 16.5 launchd → logd, notifyd... → SpringBoard] subgraph Injection Points direction TB Libraries[我々のライブラリ: backboardd, SpringBoard...] HID[(仮想 HID サービス)] ObjC[(ObjC メソッド交換 — メモリ上のみ)] Audio[(mediaserverd への CoreAudio 出力: RedwoodAudio.driver)] end iOSApps --> Libraries Libraries --> HID Libraries --> ObjC Libraries --> Audio
💡 重要: iOS のプログラム、フレームワーク、dyld シェアドキャッシュはバイト単位に変更されていません。不足している機能は **カーネル(ドライバー代替品)**か、
で注入するライブラリ (DYLD_INSERT_LIBRARIES) によって補完されています。kern.exec_inject
ディレクトリ構成
| パス | 内容 |
|---|---|
| setup.sh, build.sh / run.sh, new-device.sh, devices/*.conf, ugit |
| USB を介したスマートフォン制御(ローダー実行、ログ、スクリーンショットなど) |
| ローダー (loader.c), コンテナビルド (mkpayload.py) |
| XNU 変更パッチ、apply.sh, export.sh |
| Linux 上で XNU をビルドするための依存関係とスタブ |
| カーネルビルドスクリプト |
| UEFI ポート (mkxnuimg.py でパッキング) |
| Linux Wi-Fi ドライバー構築層 |
| QEMU 実行、タッチ入力、スタックシンボル化 |
| 録画、UFS/フラッシュツール (mk-ath11k.sh など)、ホストテスト |
| ビルド済みカーネル、ローダー、UEFI 部品 |
| スクリーンショット、checks.md, PORTING.md |
デバッグとスクリーンショット
ログの確認:
- セッションログ: QEMU の stdout または
(スマートフォンから)。logs/HHMMSS-run.log - userabort: ログに
を呼んだプロセスのスタックが表示されます。abort() - usertrap: (
) クラッシュ時の診断用。systrace=1 - ライブスタック (QEMU):
->qemu/touch.py stacks NAME
(IPSW の必要あり)。qemu/symstack.py LOG NAME
チェック項目: チェックが嘘をつく場合は
docs/checks.md を参照してください。
スクリーンショット取得: スマートフォンの画面からのセッションでは、以下の環境変数が必要です:
(GPU アクセラレーション)GL=1
(必要なリソースを確保)REST=1gpu=1
ライセンス情報
本リポジトリ全体は Apple Public Source License 2.0 でライセンスされています。
- 我々のコード: XNU の派生作品(APSL 2.0)およびローダー、スクリプトも同ライセンス。
- サードパーティのコード:
: APSL 2.0xnu/- ath11k: BSD-3-Clause-Clear
- FreeBSD LinuxKPI: BSD-2-Clause
- libzbitmap (libdeflate): MIT / Corellium LLC
- mkbootimg.py: Apache-2.0 (AOSP)
- UEFI ドライバー: Project Silicium の配布方法に従う。
チーム(OOSEX GANG)
- @oodze (創設者)
- @netusd, @wannqn, @hxfuxyyXD
最新情報: t.me/oosexgangdevs