LiveContainer

iOS アプリランチャー — ゲスト IPA をホストプロセス内で実行し、1 つの App ID で複数アプリ・複数データコンテナを運用する sideload 基盤。

1 — 概要

LiveContainer(LiveContainer/LiveContainer)は、iOS アプリを端末へ個別インストールせず、ランチャー本体の中で起動する sideload ツール。エミュレータやハイパーバイザではなく、Mach-O の改変と dlopen によるゲスト実行環境を構築する。

∞ apps1 App ID で複数
iOS 15+対応 OS
JITiOS 26 未満で署名省略可
SideStore内蔵版あり

無料開発者アカウントの 3/10 アプリ制限は LiveContainer 内のゲストには適用されない。同一アプリの複数バージョン・複数データコンテナも共存できる。配布は Standalone と LiveContainer+SideStore の 2 系統(Stable / Nightly)。

第三者ビルドへの注意: すべてのゲストアプリは LiveContainer 内に置かれるため、非公式ビルドは keychain やログイン情報を含むデータへフルアクセスできる。公式 README も公式ビルド以外のサポート対象外と明記している。
要件内容
OSiOS / iPadOS 15+(マルチタスクは 16.0+)
インストーラAltStore 2.0+ または SideStore 0.6.0+
ビルドXcode。Debug 用 DEVELOPMENT_TEAM を xcconfigs/Global.xcconfig に設定
2 — モジュール構成
主要ディレクトリ
LiveContainer/          # メイン実行体 — ゲスト環境セットアップ・ロード
LiveContainerSwiftUI/ # SwiftUI ランチャー UI(未選択時に表示)
MultitaskSupport/     # 仮想ウィンドウ・PiP・iPad ネイティブウィンドウ
SideStore/            # SideStore 更新連携(XPC)
TweakLoader/          # CydiaSubstrate +  tweak 注入(全ゲスト)
ZSign/                  # 同梱署名(Feather 派生 zsign)
LaunchAppExtension/   # ホーム画面ショートカット用
LiveProcess/          # SideStore 連携プロセスハンドラ
モジュール役割
LiveContainer(main)LCBootstrap.m / dyld_bypass_validation 等でゲスト Mach-O をパッチし dlopen 起動
LiveContainerSwiftUIIPA 追加・選択・設定 UI。Localizable.xcstrings で多言語
MultitaskSupportFrontBoardAppLauncher ベースの in-app マルチタスク
TweakLoaderゲストごとに tweak フォルダを読み込み、UIKit フック等を注入
ZSignJIT-less 時は LiveContainer と同証明書でゲストを再署名
SideStoreアプリ更新(refresh)統合用 XPC サーバー
3 — 起動メカニズム

README の「How does it work?」に沿った流れ。ホスト(LiveContainer)がゲスト実行ファイルを動的ライブラリ化し、パスと Bundle を差し替えてからエントリポイントへジャンプする。

flowchart TD
  A[IPA インストール] --> B[Mach-O パッチ]
  B --> B1["__PAGEZERO を 0xFFFFC000 / 0x4000 に変更"]
  B --> B2["MH_EXECUTE → MH_DYLIB"]
  B --> B3["TweakLoader.dylib を load command 注入"]
  B --> C["@executable_path フック
_NSGetExecutablePath"] C --> D["NSBundle.mainBundle をゲストに差替"] D --> E{JIT 利用?} E -->|Yes iOS26未満| F[Library Validation バイパス] E -->|JIT-less| G[ZSign で再署名] F --> H[dlopen ゲスト実行体] G --> H H --> I[TweakLoader が tweak 読込] I --> J[エントリポイント → UIApplicationMain]

Mach-O パッチの要点

  • __PAGEZERO の vmaddr / vmsize を固定値へ書き換え、ゲストがホストアドレス空間に載る余地を確保
  • ファイルタイプを MH_DYLIB に変更し、通常の実行ファイルではなく動的ライブラリとしてロード可能にする
  • TweakLoader.dylib を load command で注入 — 以降すべてのゲストに tweak 基盤が載る

実行パスと Bundle の偽装

  • dyld4::APIs::_NSGetExecutablePath をフックし、config.process.mainExecutablePath を書き換え可能な領域へ差し替え(builtin_vm_protect または TPRO unlock)
  • NSBundle.mainBundle をゲストアプリの bundle に上書き — ゲストから見た「自分自身」のパスが正しく見える

Library Validation バイパス

JIT が使える環境(iOS 26 未満)では codesign を完全に迂回できる。JIT-less では全実行ファイルを署名するためこの経路は使わない。実装は Restoring Dyld Memory Loading 系の手法に由来。

Keychain の半分離

entitlements.xml で 128 個の keychain access group を定義し、同一アプリの各コンテナへランダム割当。最大 128 コンテナで keychain を分離できる(完全サンドボックスではない — 後述の制限参照)。

4 — 主な機能
機能操作・条件
IPA インストール「+」から IPA 選択 → 次回起動アプリを指定。長押しで管理
ホーム画面追加公式ガイド — LaunchAppExtension 経由
複数 LiveContainer別インスタンス間でデータ移行ほぼシームレス。同時起動に利用
マルチタスクバナー長押し → Multitask。SideStore/AltStore インストール時は Keep App Extensions 必須。JIT は PID アタッチ対応 enabler(StikDebug 等)が必要
JITiOS 26 未満で署名省略。詳細は JIT ガイド
Tweak外部 tweak フォルダをゲストごとに指定 — TweakLoader が注入
複数コンテナ同一アプリのデータコンテナを複数保持。外部コンテナも可
アプリ非表示ロック / 非表示設定(README の Hiding Apps 参照)
Fix File Picker / 通知ゲスト個別設定でファイルピッカー・ローカル通知の互換修正
Open In AppURL 入力または iCloud ショートカット共有で対応アプリを起動

全アプリが動くわけではない。compatibility ラベル付き Issue で既知問題を確認。リストに無ければ多くは動作するが、動かない場合は Issue テンプレートから報告。

5 — 制限事項
項目影響
ゲスト entitlementsホストへは適用されない(sideload では基本 entitlements で足りる想定)
App Permissions端末全体でグローバルに適用 — ゲスト単位の分離なし
サンドボックスゲストコンテナは相互アクセス可能 — 他ゲストのデータを読める
App Extensions未対応(LiveContainer は sandbox 内、SpringBoard がゲストを認識しない、App ID 消費)
マルチタスク + iPhone MirroringiPad 物理キーボードは修正済みだが、Mirroring は別チェックで未解決
Push 通知リモート push は動作しない
Custom URL scheme 照会動作しない可能性(README は ? 付き)
TODO(上流): カスタム Mach-O パーサの代わりに ChOma 採用が README に記載されている。