HN 日本語サマリー

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

AppleのVirtualization.framework経由で仮想iPhoneを起動する

Boot a Virtual iPhone via Apple's Virtualization.framework (github.com)

105 pointsby hentrep32 コメント

要約

vphone-cliは、Apple Silicon Mac上でAppleのVirtualization.frameworkを利用して仮想iPhoneを起動できるコマンドラインツールです。このツールは、VMの作成、パッチ適用、DFUモードでの復元、カスタムファームウェア(CFW)のインストール、そして最終的な起動までを自動化します。様々なセキュリティ回避レベルを持つファームウェアバリアントが提供されており、開発や研究用途での利用が想定されています。

全文翻訳

vphone-cli AppleのVirtualization.frameworkを使用して、PCCリサーチVMインフラストラクチャで仮想iPhoneを起動します。 前提条件 ホスト: Apple Silicon macOS 15+ (Sequoia) Xcode + iOS SDK (ゲストデーモンをクロスコンパイルするため) SIP/AMFIの緩和: 未署名のバイナリでプライベートPV=3エンタイトルメントを許可するため 依存関係: brew install python@3.13 aria2 wget gnu-tar openssl@3 ldid-procursus sshpass keystone cmake libusb ipsw zstd インストール brew install zqxwce/tap/vphone-cli ビルド git clone --recurse-submodules https://github.com/Lakr233/vphone-cli.git ./scripts/setup_tools.sh # 依存関係のインストール、ツールチェーンサブモジュールのビルド、Python venvの作成 ./scripts/build.sh # vphone-cliのビルドと署名、.appのバンドル、vphonedのクロスコンパイル cd .build/vphone-cli.app/Contents/MacOS/ vphone-cli --help クイックスタート ワンコマンドでVMをエンドツーエンドで作成します(ダウンロード → パッチ → DFU復元 → CFWインストール → 初回起動): vphone-cli vm create myphone -V jb # -V / --variant コマンド vphone-cli vm create はパイプライン全体を実行します。以下の個別のステップにより、手動で操作したり、特定のステージを再実行したりできます。 管理 vphone-cli vm list # VMの一覧表示 (--json でスクリプト対応) vphone-cli vm info myphone # 特定のVM情報を表示 vphone-cli vm new myphone # 空のバンドルを作成 (cpu/mem/diskオプションあり) vphone-cli vm config myphone --cpu 8 --memory 8192 vphone-cli vm clone myphone myphone-2 # 高速なAPFSクローン、新しいデバイスID vphone-cli vm export myphone --out myphone.tzst # デフォルトでzstd高速化 (--max = xz -9); --out はディレクトリも指定可能 (<vm>.tzst/.txz を自動命名); restore ディレクトリとステージングファイルはスキップ vphone-cli vm import myphone.tzst --name restored vphone-cli vm rename myphone iphone16 vphone-cli vm delete iphone16 VMを手動でビルド (vm create が自動化していること) vphone-cli vm new myphone # 1. 空のバンドル vphone-cli fw prepare myphone --iphone-version 26.1 # 2. IPSWのダウンロードとマージ vphone-cli fw patch myphone --variant jb # 3. ブートチェーンのパッチ適用 vphone-cli vm launch myphone --dfu & # 4. DFUモードで起動 (バックグラウンド) vphone-cli restore myphone --get-shsh # SHSHを取得 vphone-cli restore myphone # DFU復元 vphone-cli vm stop myphone # DFUブートを停止 vphone-cli cfw install myphone --variant jb # 5. CFWのインストール (ホストマウント; sudoを要求) vphone-cli vm launch myphone # 6. 初回起動 IPSWを指定して新しいiOSにアップデート: --iphone-source /path/to.ipsw --cloudos-source /path/to.ipsw ファームウェアバリアント セキュリティバイパスのレベルが異なる5つのパッチバリアントがあります。--variant に指定してください: バリアント | ブートチェーン | CFW | メモ ---|---|---|--- less | 4パッチ | 2フェーズ | パッチレス — iOSの緩和策を有効にしたまま regular | 42パッチ | 10フェーズ | AMFI/SSV/Img4/TXMバイパス dev | 53パッチ | 12フェーズ | + TXMエンタイトルメント/デバッグバイパス jb | 113パッチ | 14フェーズ | + 完全なジェイルブレイク (Sileo, TrollStore は初回起動時に自動インストール) exp | 141パッチ | 18フェーズ | JBのスーパーセット + アンチVM検出リサーチパッチ 詳細は research/0_binary_patch_comparison.md を参照してください。 実行と接続 SSH (ジェイルブレイク): ssh -p 22222 mobile@<vm-ip> (パスワード: alpine) SSH (通常/開発): ssh -p 22222 root@<vm-ip> VNC: vnc://<vm-ip>:5901 場所 vphone-cliが作成するすべてのものは ~/.vphone/ 配下に保存されます。これはリポジトリや.appの外に置かれ、署名されたバンドルがポータブルであることを保証します。ツリー全体を $VPHONE_ROOT でリダイレクトできます: パス | 内容 ---|--- ~/.vphone/ | ユーザーごとのデータルート — $VPHONE_ROOT で場所全体を上書きできます。 ~/.vphone/VMs/ | VMバンドル — VMごとに1つのディレクトリ。これがライブラリです; $VPHONE_LIBRARY_ROOT で上書きできます。 ~/.vphone/ipsws/ | ダウンロードされたiPhone + cloudOS IPSW、VM間でキャッシュされ再利用されます。 ~/.vphone/tools/ | キャッシュされたAPFS seal-volume アーティファクト (apfs_sealvolume_<version>)、fw prepare中に取得されます。 ~/.vphone/debs/ | キャッシュされた.debパッケージ、jb/exp CFWインストール時にゲストに配置されます (Sileo, apt, …)。 ~/.vphone/venv/ | 自動プロビジョニングされたPython環境 (Pythonランタイム参照; $VPHONE_VENV_DIR で上書きできます)。 優先順位: 個別のアイテムの上書き ($VPHONE_LIBRARY_ROOT, $VPHONE_VENV_DIR) は $VPHONE_ROOT より優先され、 $VPHONE_ROOT は ~/.vphone のデフォルトより優先されます。ipsws/, tools/, debs/ キャッシュは常にアクティブなルートの直下に配置されます。 SIP/AMFI緩和オプション オプションA — SIPを完全に無効にし、次にブート引数でAMFIを無効にします(最も寛容)。 リカバリモード (電源長押し → ターミナル) で: csrutil disable csrutil allow-research-guests enable その後macOSに再起動し、AMFIブート引数を設定します(効果を得るにはSIPが完全にオフである必要があります): sudo nvram boot-args="amfi_get_out_of_my_way=1 -v" # 再起動後 オプションB — SIPをオンのままにし(デバッグ専用で緩和)、amfidontでバイナリをホワイトリストに登録します(AMFIはシステム全体で有効のままです)。 リカバリモードで: csrutil enable --without debug csrutil allow-research-guests enable その後macOSに再起動し: vphone-amfidont # ローカルビルドの場合は .build/vphone-cli.app/Contents/Resources/vphone-amfidont テスト済み環境 ホスト | iPhone | CloudOS ---|---|--- Mac16,11 | 27.0b2 | 17,3_18.6.2_22G100 Mac16,8 | 26.5.1 | 17,3_26.0_23A341 Mac16,8 | 26.5.1 | 17,3_26.0.1_23A355 Mac16,12 | 26.3 | 17,3_26.1_23B85 Mac16,12 | 26.3 | 17,3_26.3_23D127 Mac16,12 | 26.3 | 17,3_26.3_23D127 Mac16,12 | 26.3 | 17,3_26.3.1_23D8133 Mac16,11 | 26.2 | 17,3_26.4_23E246 Mac16,11 | 26.2 | 17,3_26.5_23F77 Mac16,11 | 27.0b2 | 17,3_26.5.2_23F84 Mac16,6 | 26.4.1 | 17,3_26.6_23G71 Mac16,11 | 27.0b2 | 17,3_26.6.1_23G83 Mac16,11 | 27.0b2 | 17,3_27.0_24A5380h Mac16,6 | 26.4.1 | 17,3_27.0_24A5390f Mac16,6 | 26.6.1 | 17,3_27.0_24A5408d Mac16,11 | 27.0b2 | 17,3_27.0_24A5418b Mac16,11 | 27.0b2 | 17,3_27.0_24A5424a FAQ zsh: killed ./vphone-cli — AMFI/デバッグ制限がバイパスされていません。前提条件(amfi_get_out_of_my_way=1 または amfidont)を参照してください。 Virtualization is not available on this hardware — あなたのMac自体がVMです。PV=3ゲストブートはネストできません。ネストされていないmacOS 15+ホストを使用してください。 Stuck on "Press home to continue" — VNCで接続し、右クリック(2本指クリック)してホームボタンをシミュレートしてください。 System apps won't install — iOSセットアップ中、日本またはEUを地域として選択しないでください(VMでは満たせない追加の規制チェックがあります)。例えば米国を選択してください。 App crashes on launch with EXC_GUARD / GUARD_TYPE_MACH_PORT — vphone-cli fw patch <name> --variant <v> --force-exc-guard で再パッチし、再復元/インストールしてください(#291)。iOS 18ベースでは常に発生します。 Install a .ipa/.tipa — 実行中のVMのInstallメニュー(ドラッグ&ドロップまたはファイルピッカー)を使用してください。 cfw install hangs re-signing a system binary (e.g. Campo), memory climbing unbounded — ldid-procursus 2.1.5-procursus7(現在のHomebrew安定版)までの既知のバグです。bytes(uint64_t) がゼロガードなしで __builtin_clzll(0) を呼び出し、未定義の動作となり、このビルドでは0バイト長として解決され、符号なしループカウンタがアンダーフローします。ldid は、整数値がちょうど0であるエンタイトルメントリストを含む任意のシステムバイナリで、1バイトずつ書き込みながらバッファを成長させ、終了しません。これはアップストリームで修正されましたが、まだタグ付きリリースには含まれていません。ソースから再ビルドしてください: brew install --HEAD ldid-procursus && brew link --overwrite ldid-procursus。既に発生している場合は、ハングしているldidプロセスを先に終了してください(sudo kill -9 <pid>)。 自動化 vphone-cliは、プログラムによる制御のためにホスト制御ソケット(<bundle>/vphone.sock)を公開しています — スクリーンショット、タッチ、スワイプ、ハードウェアキー、クリップボード — 各アクションはAI駆動のE2Eテストのためにインラインスクリーンショットを返します。これをラップするMCPサーバーについては vphone-mcp を参照してください。 謝辞 wh1te4ever/super-tart-vphone-writeup