プログラミング
AppleのVirtualization.framework経由で仮想iPhoneを起動する
Boot a Virtual iPhone via Apple's Virtualization.framework (github.com)
要約
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