
Загружайте и управляйте виртуальными iPhone на Apple Silicon с патчингом прошивки, вариантами джейлбрейка и функциями для исследований в области безопасности при тестировании и анализе iOS.
Загрузите виртуальный iPhone через Apple's Virtualization.framework, используя инфраструктуру исследовательской VM PCC.

Хост:
Зависимости:
brew install [email protected] 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 # установка зависимостей, сборка подмодулей toolchain, создание Python venv
./scripts/build.sh # сборка + подпись vphone-cli, сборка .app, кросс-компиляция vphoned
cd .build/vphone-cli.app/Contents/MacOS/
vphone-cli --help
Одна команда создаёт VM от начала до конца (загрузка → патч → DFU restore → установка CFW → первая загрузка):
vphone-cli vm create myphone -V jb # -V / --variant
vphone-cli vm launch myphone
vphone-cli vm create выполняет весь конвейер; отдельные шаги ниже позволяют управлять им вручную или перезапустить один этап.
vphone-cli vm list # список VM (--json для скриптов)
vphone-cli vm info myphone # показать одну VM
vphone-cli vm new myphone # создать пустой bundle (опции cpu/mem/disk)
vphone-cli vm config myphone --cpu 8 --memory 8192
vphone-cli vm clone myphone myphone-2 # быстрый APFS clone, новая идентичность устройства
vphone-cli vm export myphone --out myphone.tzst # zstd быстрый по умолчанию (--max = xz -9); --out может быть директорией (авто-имена <vm>.tzst/.txz); пропускает restore dir + staging files
vphone-cli vm import myphone.tzst --name restored
vphone-cli vm rename myphone iphone16
vphone-cli vm delete iphone16
vm create)vphone-cli vm new myphone # 1. пустой bundle
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 restore
vphone-cli vm stop myphone # остановка DFU загрузки
vphone-cli cfw install myphone --variant jb # 5. установка CFW (host-mount; запросит sudo)
vphone-cli vm launch myphone # 6. первая загрузка
Обновление до более новой iOS путём указания IPSW в fw prepare: --iphone-source /path/to.ipsw --cloudos-source /path/to.ipsw.
Пять вариантов патчей с возрастающим обходом безопасности — передайте один в --variant:
| Вариант | Цепочка загрузки | CFW | Примечания |
|---|---|---|---|
less | 4 патча | 2 фазы | Без патчей — сохраняет включённые механизмы защиты iOS |
regular | 42 патча | 10 фаз | Обход AMFI/SSV/Img4/TXM |
dev | 53 патча | 12 фаз | + обход TXM entitlement/debug |
jb | 113 патчей | 14 фаз | + полный jailbreak (Sileo, TrollStore авто-установка при первой загрузке) |
exp | 141 патч | 18 фаз | Надмножество JB + исследовательские патчи анти-VM-детекции |
См. research/0_binary_patch_comparison.md для разбивки по компонентам.
ssh -p 22222 mobile@<vm-ip> (пароль alpine)ssh -p 22222 root@<vm-ip>vnc://<vm-ip>:5901Всё, что создаёт vphone-cli, находится в ~/.vphone/ — вне репозитория и .app, чтобы подписанный bundle оставался переносимым. Перенаправьте всё дерево с помощью $VPHONE_ROOT:
| Путь | Содержимое |
|---|---|
~/.vphone/ | Корень данных пользователя — переопределите всё расположение с помощью $VPHONE_ROOT. |
~/.vphone/VMs/ | VM bundles — одна директория на VM. Это библиотека; переопределите с помощью $VPHONE_LIBRARY_ROOT. |
~/.vphone/ipsws/ | Загруженные iPhone + cloudOS IPSW, кэшируемые и переиспользуемые между VM. |
~/.vphone/tools/ | Кэшированные артефакты APFS seal-volume (apfs_sealvolume_<version>), полученные во время fw prepare. |
~/.vphone/debs/ | Кэшированные .deb пакеты, которые установка CFW jb/exp размещает в гостевой системе (Sileo, apt, …). |
~/.vphone/venv/ | Авто-подготавливаемое окружение Python (см. Python runtime; переопределите с помощью $VPHONE_VENV_DIR). |
Приоритет: индивидуальные переопределения ($VPHONE_LIBRARY_ROOT, $VPHONE_VENV_DIR) имеют приоритет над $VPHONE_ROOT, который имеет приоритет над значением по умолчанию ~/.vphone. Кэши ipsws/, tools/ и debs/ всегда находятся непосредственно в активном корне.
Вариант A — полностью отключить SIP, затем отключить AMFI через boot-arg (наиболее разрешительный).
В Recovery (долгое нажатие питания → Terminal):
csrutil disable
csrutil allow-research-guests enable
Затем перезагрузитесь в macOS и установите boot-arg AMFI (требует полностью отключённого SIP для вступления в силу):
sudo nvram boot-args="amfi_get_out_of_my_way=1 -v" # перезагрузка после
Вариант B — оставить SIP включённым (только debug-ослабление), затем добавить бинарник в белый список с помощью amfidont (оставляет AMFI включённым во всей системе).
В Recovery:
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 | 26.1-23B85 |
| Mac16,8 26.5.1 | 17,3_26.0_23A341 | 26.1-23B85 |
| Mac16,8 26.5.1 | 17,3_26.0.1_23A355 | 26.1-23B85 |
| Mac16,12 26.3 | 17,3_26.1_23B85 | 26.1-23B85 |
| Mac16,12 26.3 | 17,3_26.3_23D127 | 26.1-23B85 |
| Mac16,12 26.3 | 17,3_26.3_23D127 | 26.3-23D128 |
| Mac16,12 26.3 | 17,3_26.3.1_23D8133 | 26.3-23D128 |
| Mac16,11 26.2 | 17,3_26.4_23E246 | 26.4-23E5207q |
| Mac16,11 26.2 | 17,3_26.5_23F77 | 26.4-23E5207q |
| Mac16,11 27.0b2 | 17,3_26.5.2_23F84 | 26.4-23E5207q |
| Mac16,6 26.4.1 | 17,3_26.6_23G71 | 26.4-23E5207q |
| Mac16,11 27.0b2 | 17,3_26.6.1_23G83 | 26.4-23E5207q |
| Mac16,11 27.0b2 | 17,3_27.0_24A5380h | 26.4-23E5207q |
| Mac16,6 26.4.1 | 17,3_27.0_24A5390f | 26.4-23E5207q |
| Mac16,6 26.6.1 | 17,3_27.0_24A5408d | 26.4-23E5207q |
| Mac16,11 27.0b2 | 17,3_27.0_24A5418b | 26.4-23E5207q |
| Mac16,11 27.0b2 | 17,3_27.0_24A5424a | 26.4-23E5207q |
zsh: killed ./vphone-cli — ограничения AMFI/debug не обойдены; см. Предварительные требования (amfi_get_out_of_my_way=1 или amfidont).
Virtualization is not available on this hardware — ваш Mac сам является VM; загрузка гостя PV=3 не может быть вложенной. Используйте не-вложенный хост macOS 15+.
Зависание на "Press home to continue" — подключитесь через VNC и щёлкните правой кнопкой мыши (двухпальцевый клик), чтобы имитировать кнопку «Домой».
Системные приложения не устанавливаются — при настройке iOS не выбирайте Японию или ЕС в качестве региона (дополнительные проверки регулирования, которые VM не может выполнить); выберите, например, США.
Приложение падает при запуске с EXC_GUARD / GUARD_TYPE_MACH_PORT — повторно пропатчите с помощью vphone-cli fw patch <name> --variant <v> --force-exc-guard, затем повторите restore/install (#291). Всегда включено для баз iOS 18.
Установка .ipa/.tipa — используйте меню Install запущенной VM (drag-drop или выбор файла).
cfw install зависает при повторной подписи системного бинарника (например, Campo), память растёт без ограничений — известная ошибка в ldid-procursus до 2.1.5-procursus7 (текущий Homebrew stable): bytes(uint64_t) вызывает __builtin_clzll(0) без zero-guard, что является неопределённым поведением, и в этой сборке приводит к длине 0, которая вызывает переполнение беззнакового счётчика цикла — ldid зацикливается, записывая по одному байту в растущий буфер, вместо завершения. Вызывается любым plist entitlements, содержащим целочисленное значение ровно 0 (некоторые реальные системные бинарники Apple имеют такие). Исправлено в upstream, но ещё не в tagged release; пересоберите из исходников: brew install --HEAD ldid-procursus && brew link --overwrite ldid-procursus. Сначала убейте зависший процесс ldid (sudo kill -9 <pid>), если вы уже столкнулись с этим.
vphone-cli предоставляет управляющий сокет хоста (<bundle>/vphone.sock) для программного управления — скриншоты, касания, свайпы, аппаратные клавиши, буфер обмена — каждое действие возвращает встроенный скриншот для AI-управляемого E2E-тестирования. См. vphone-mcp для MCP-сервера, оборачивающего его.