Apple Siliconで仮想iPhoneを実行する - vphone-cli
iOS開発やAppleのシステムサービスに触れたことがある方なら、Xcodeの標準シミュレーターの限界に遭遇したことがあるでしょう。シミュレーターはホストアーキテクチャ向けのバイナリをビルドし、特別なmacOS環境で実行します。これはRapid UIプロトタイピングには適していますが、実際のiPhone用のDarwinカーネルもなく、適切なプロセス分離もなく、システムデーモンのホストもありません。ここ数年、低レベルコンポーネントやチweakのテストには、机の上にテストデバイスのスタックを置いておく必要がありました。
状況は、macOS 15 Sequoiaでセキュリティ研究者向けのPrivate Cloud Compute(PCC)環境をAppleがリリースしたことで変わりました。開発者のLakr233はこのインフラを活用し、vphone-cliを作成しました。これはApple Silicon Mac上で実際のiOSを含む本格的な仮想マシンをビルドして実行するコンソールユーティリティです。

内部動作の仕組み
このプロジェクトは、AppleのVirtualization.frameworkシステムフレームワークと、プライベート仮想化タイプPV=3の上に構築されています。このユーティリティは、標準のiPhoneファームウェアとCloudOSイメージという2つの公式IPSWイメージを取得します。その後、スクリプトがそれらをマージし、ブートチェーンにパッチを適用し、DFUリカバリを実行して、カスタムシステムパーティションを適用します。
結果は、独自のネットワークアドレス、SSHアクセス、VNC接続を備えた本物のゲストiOSインスタンスです。
ホストの準備
プロジェクトを実行するのはワンクリックでは完了しません。Appleは内部仮想化メカニズムを厳重に保護しているため、ホストシステムの制限を緩和する必要があります。
macOS 15以降のMシリーズMacが必要です。まず、SIPを無効にするか、ゲストリサーチシステムを有効にします。これを行うには、起動時に電源ボタンを長押ししてMacをリカバリーモードで再起動し、ターミナルを開きます:
csrutil disable
csrutil allow-research-guests enable
通常モードで再起動後、AMFIを無効にするカーネルパラメータを渡します:
sudo nvram boot-args="amfi_get_out_of_my_way=1 -v"
システム全体のチェックを無効にしたくない場合は、作者が代替手段を提供しています。SIPをデバッグモードのままにして、制限を選択的に解除する補助バイナリvphone-amfidontを通じてユーティリティを起動できます。
Homebrewの依存関係でコアユーティリティをインストールします:
brew install [email protected] aria2 wget gnu-tar openssl@3 ldid-procursus sshpass keystone cmake libusb ipsw zstd
brew install zqxwce/tap/vphone-cli
最初のVMの作成
VM作成プロセス全体は単一のコマンドで自動化されています。ユーティリティは必要なIPSWファイルをダウンロードし、ブートローダーにパッチを適用し、バンドルを作成し、初期セットアップ手順を実行します:
vphone-cli vm create myphone -V jb
vphone-cli vm launch myphone
-Vフラグ(または--variant)はファームウェア変更の奥行きを設定します。リポジトリには5つのバリアントがあります:
lessは4つのパッチのみを含み、iOSの標準セキュリティメカニズムを有効にしたままにします。regularは、AMFI、Signed System Volume(SSV)署名チェック、およびTXMをバイパスする42個のパッチを含みます。devはエンタイトルメントチェックとデバッグロックのバイパスを追加します。jbは113個のパッチを適用し、SileoパッケージマネージャーとTrollStoreを即座にインストールします。expはジェイルブレイクバージョン拡張し、仮想マシン内で実行されているという事実を隠すパッチを追加します。
jbプロファイルはほとんどの実験に適しています。作成が完了すると、イメージが起動し、接続できます。
接続と操作
仮想デバイスの制御は、ターミナルとグラフィックスの2つのチャンネルに分かれています。
シェルアクセスはポート22222でSSHを使用します:
ssh -p 22222 mobile@<ip-адрес-виртуалки>
ジェイルブレイクビルドのmobileユーザーのデフォルトパスワードはalpineです。プロファイルdevまたはregularを選択した場合は、ユーザーrootとして接続します。
グラフィックディスプレイは、内蔵VNCサーバーを通じてポート5901で出力されます。macOSの内蔵画面共有アプリを開き、vnc://<ip-адрес-виртуалки>:5901を入力して開きます。
初期iOSセットアップにはいくつかの問題があります。「Press home to continue」と表示された画面では、VNCウィンドウで右クリックします:これにより、物理的なHomeボタンの押下がエミュレートされます。初期セットアップ中に地域を選択する場合は、USAを指定するのが最善です。EU諸国や日本を選択すると、システムが追加の規制チェックを実行しますが、現在仮想環境では失敗します。
.ipaまたは.tipa形式のサードパーティアプリをインストールするには、実行中の仮想マシンのウィンドウにファイルをドラッグするだけです。
自動化とソケットベースの制御
作者はプログラム可能な制御機能も組み込んでいます。VMバンドル内にUnixソケットvphone.sockが作成されます。これを通じて、画面タップコマンド、スワイプ、ハードウェアボタンイベント、クリップボードデータを送信できます。
ソケットを通じた各アクションは、現在の画面状態のスクリーンショットを返します。これは、エンドツーエンドの統合テストを作成したり、言語モデルをアプリ探索に接続したりするのに便利です。プロジェクトエコシステムには、このソケットをModel Context Protocolでラップする готовыйサーバーvphone-mcpがすでに存在します。
注意点
プロジェクトは積極的に開発中で、まだ荒削りな部分があります。
ネストされた仮想化はハードウェアレベルでサポートされていません。別のmacOS仮想マシン(例えば、クラウドランナーやTart内)内でvphone-cliを実行することはできません,因此 физический Macが必要です。
カスタムファームウェアのインストール中に、ldid-procursusユーティリティでシステムバイナリを再署名する段階でプロセスがハングアップすることがあります。これは、稳定版のHomebrewフォーミュラにバグがあり、null値の処理関数が無限ループに入るためです。修正は、brew install --HEAD ldid-procursusで開発ブランチからパッケージを再ビルドすることです。
iOS 18ベースのアプリがエラーEXC_GUARDでクラッシュする場合は、--force-exc-guardフラグでパッチを再ビルドしてください。
誰がこのプロジェクトを見つけるか
このユーティリティは主に、リバースエンジニアとモバイルアプリセキュリティスペシャリストに役立ちます。ジェイルブレイク用の別々のデバイスを購入する必要がなくなり、APFSクローニング 통해システム状態をクリーンなスナップショットに素早くリセットできます。
チweak開発者や低レベルシステムデーモンエンジニアにとって、このプロジェクトは実際のスマートフォンをレンガに変えるリスクなしに便利なデバッグ環境を提供します。利用可能なApple Silicon MacとiOSの内部構造への興味があれば、このツールをデプロイして探索する価値は十分にあります。
関連プロジェクト