Skip to content

Repository files navigation

CarrierSIM

Скрипт привязывает SIM-карты iPhone по IMSI к системному пакету оператора Vodafone_hu или к любому другому пакету, который есть в iOS телефона. Задуман для включения звонков по Wi-Fi (VoWiFi) в России. Заодно включается кодек EVS и 5G на части диапазонов.

Работает на macOS и Windows. На Linux не работает: там нет нужной библиотеки Apple.

Работает на iPhone 12–18, включая модели mini, Pro, Pro Max, Plus, Air и e, с iOS 18–27, включая iOS 27.0.1 и 27.2 beta 2.

Экспериментальный инструмент. Работа на будущих версиях iOS не гарантируется.

Что нужно

  • Python 3.11 или новее, рекомендуется 3.12. На Windows нужна 64-битная версия.
  • Windows: iTunes x64 с сайта Apple. Версия из Microsoft Store и Apple Devices могут не подойти.
  • macOS: ничего дополнительно ставить не нужно.
  • iPhone, кабель USB и интернет для первого запуска. Потом можно без кабеля, по Wi-Fi (пункт 10).

Как запустить

  1. Распакуйте архив целиком в «Загрузки».
  2. Подключите iPhone кабелем, разблокируйте его и нажмите «Доверять». Закройте Finder и iTunes, если в них идёт синхронизация.
  3. Запустите файл двойным щелчком:
    • macOS: Запуск macOS.command
    • Windows: Запуск Windows.cmd
  4. В меню выберите 1 и дождитесь сообщения «Готово».

При первом запуске скрипт сам скачает нужные библиотеки в папку .venv. Это займёт пару минут.

Меню

Пункт Что делает
1 Установить профиль по bundle.yaml (МТС России — Vodafone_ro, остальные — Vodafone_hu)
2 Показать SIM и план установки, ничего не записывая
3 Проверить компьютер и файлы, телефон не нужен
4 Вернуть штатный профиль (выбранной SIM или всем)
5 Восстановить после сбоя
6 Справка по флагам
7 Выбрать другой профиль и SIM (1, 2 или обе)
8 Диагностика связи: IMS, VoLTE/VoWiFi/VoNR, сеть, 5G SA (только чтение журнала)
9 Проверка звонка: канал (Wi-Fi/LTE/5G) и кодек EVS/AMR (только чтение журнала)
10 Переключить связь с iPhone: кабель или Wi-Fi (эксперимент). В режиме Wi-Fi все действия с телефоном идут без кабеля

Какой профиль ставить: bundle.yaml

Файл bundle.yaml рядом со скриптом задаёт пакет для пункта 1:

# Пакет по умолчанию для всех операторов
default: Vodafone_hu
# Пакет для конкретного оператора: MCCMNC без пробела (250 01 = МТС RU)
25001: Vodafone_ro

Для каждой SIM сначала ищется строка с её MCCMNC, затем default. Без файла ставится Vodafone_hu. Имя пакета — как папка в /System/Library/Carrier Bundles/iPhone на телефоне, без .bundle. Пункт 7 и флаг --bundle на время запуска заменяют файл.

После установки: включить VoWiFi

  1. «Настройки → Сотовая связь → нужная SIM» → включите «Вызовы по Wi-Fi».
  2. Включите авиарежим, затем включите Wi-Fi.
  3. Дождитесь, когда рядом с названием оператора появится отметка Wi-Fi.
  4. Выключите авиарежим. Дальше VoWiFi должен подключаться сам.

Как это работает

Профиль оператора для SIM выбирает процесс CommCenter. Пакеты лежат в двух местах:

  • /System/Library/Carrier Bundles/iPhone/*.bundle — системные пакеты, подписаны Apple, раздел только для чтения;
  • /var/mobile/Library/Carrier Bundles/iPhone — пользовательский каталог: обновления пакетов (IPCC) и симлинки, по которым CommCenter находит пакет для SIM.

Скрипт меняет только пользовательский каталог.

Компьютер общается с iPhone по USB или, в режиме Wi-Fi, по локальной сети через службы, которые телефон открывает после «Доверять». Скрипт использует пять из них:

  • AFC (Apple File Conduit, com.apple.afc) — доступ к файлам телефона, но только внутри /var/mobile/Media. Этой службой пользуются приложения для импорта фото и файловые менеджеры для iPhone. К /var/mobile/Library и /System она доступа не даёт.
  • installation_proxy — установка приложений и пакетов оператора IPCC.
  • syslog_relay — системный журнал телефона, из него читаются сообщения CommCenter.
  • streaming_zip_conduit — загрузка ZIP-архива с распаковкой в /var/mobile/Media.
  • AirTraffic (com.apple.atc) — синхронизация медиатеки iTunes/Finder.

Первые четыре скрипт вызывает через библиотеку pymobiledevice3, AirTraffic — через библиотеку Apple (см. ниже).

Шаги:

  1. Триггер. Через installation_proxy ставит подписанный IPCC другого оператора (AVEA_tr, Swisscom_ch или O2_Germany — тот, что не совпадает с вашими SIM). Установка IPCC заставляет CommCenter заново выбрать пакеты. Если каталога на телефоне ещё нет, она его создаёт. Пакет триггера остаётся в каталоге, но к вашим SIM не относится.
  2. Копия. Забирает каталог в /var/mobile/Media, читает его по AFC и сохраняет в runs/…/original.zip.
  3. Запись. Добавляет в корень каталога симлинки с именем из 15 цифр IMSI каждой выбранной SIM на /System/Library/Carrier Bundles/iPhone/Vodafone_hu.bundle (или на пакет, выбранный в пункте 7). Остальное содержимое каталога не меняется.
  4. Проверка. Читает записанный каталог обратно и сравнивает с планом. Затем снова ставит триггер и по журналу CommCenter (Resolved path, Verification Result) проверяет, какой пакет выбран для каждой SIM и принята ли его подпись. Если в пункте 7 выбранный пакет не выбран ни для одной SIM (такого пакета нет в этой iOS), каталог возвращается из копии.

Каталог лежит вне /var/mobile/Media, поэтому через AFC записать его нельзя. Перенос сделан по методу AirLift: архив с деревом каталога загружается в Media через streaming_zip_conduit, а затем служба синхронизации AirTraffic (протокол iTunes) в ходе поддельной синхронизации книг перемещает его на место по относительному пути. Служебные файлы, которые AirTraffic оставляет в /var/mobile/Media/Books, скрипт удаляет, а исходное состояние Books сверяет с копией. Протокол AirTraffic реализован закрытой библиотекой Apple AirTrafficHost: на macOS она входит в систему, на Windows ставится с iTunes. Под Linux её нет, поэтому там скрипт не работает.

Пункт 4 удаляет из корня каталога все симлинки с именем из 15 цифр. Остальное содержимое каталога, включая симлинки по MCCMNC и пакеты IPCC, не трогается.

Если что-то пошло не так

  • «Прошлая операция не завершилась». Выберите пункт 5, затем повторите нужный пункт.
  • Вернуть штатный выбор пакетов. Пункт 4 удаляет IMSI-симлинки, добавленные скриптом.
  • Папка runs хранит копии каталога и журналы операций. Пока установка идёт, не удаляйте её. Переносить её в новую версию не нужно: остатки прошлых запусков скрипт убирает с телефона сам. Не публикуйте её: в журналах есть идентификаторы SIM и телефона.
  • Версия CarrierSIM указана в меню, начале session.log, environment.json и блоке диагностики. Суффикс -dev означает версию в разработке. «Сборка скрипта» — первые 12 символов SHA256 файла carrier.py, позволяющие различать изменения внутри одной версии. Без подключения телефона версию можно посмотреть командой python carrier.py --version.

macOS пишет «Запуск macOS.command повреждено… Переместите в Корзину». Файл не повреждён: macOS так блокирует неподписанные файлы, скачанные из интернета или Telegram.

  1. Нажмите «Отменить».
  2. Откройте «Терминал», напечатайте bash с пробелом в конце, перетащите в окно файл Запуск macOS.command и нажмите Enter.

Можно один раз снять метку карантина с папки, и дальше двойной щелчок будет работать:

/usr/bin/xattr -r -s -d com.apple.quarantine "$HOME/Downloads/CarrierSIM"

Windows не видит iPhone. В «Проводнике» телефон есть (как Apple iPhone, видны фото), а iTunes и скрипт его не находят. Значит, не установлен драйвер Apple Mobile Device USB. Переустановка iTunes не всегда помогает. Скачайте драйвер «Apple Mobile Device USB Driver» из Microsoft Update Catalog, распакуйте .cab и в командной строке от администратора выполните pnputil /add-driver usbaapl64.inf /install из папки с распакованными файлами. Затем перезагрузите компьютер.

«iPhone запрещает установку (InstallProhibited)». В «Экранном времени» запрещена установка приложений: «Настройки → Экранное время → Ограничения контента и конфиденциальности → Покупки в iTunes Store и App Store → Установка приложений» — поставьте «Да» на время установки. То же бывает у телефонов с профилем управления (MDM).

«iPhone запрещает изменить Books/Books.plist, а в нём остались записи скрипта». Сохраните папку runs с резервными копиями. В одном случае помогла такая последовательность:

  1. Отключите iPhone от компьютера.
  2. Закройте все приложения на iPhone, смахнув их в переключателе приложений.
  3. Принудительно перезагрузите iPhone: быстро нажмите и отпустите кнопку увеличения громкости, затем кнопку уменьшения громкости, после этого удерживайте боковую кнопку до логотипа Apple (инструкция Apple).
  4. После загрузки разблокируйте iPhone и подключите его к компьютеру.
  5. В той же папке CarrierSIM повторите пункт 5 меню (--recover). Если ошибка повторится, отправьте автору текст ошибки и журнал сеанса.

«Служебные файлы Books постоянно меняются». Закройте приложение «Книги» на iPhone, дождитесь окончания загрузки книг и повторите.

«Скрипт не может работать из этой папки». Скопируйте папку CarrierSIM в «Загрузки» и запустите оттуда.

Без кабеля: Wi-Fi (экспериментально)

Пункт 10 в меню или флаг --wifi. Те же службы идут через usbmuxd по сети, как синхронизация Finder по Wi-Fi. Полный цикл установки по Wi-Fi проверен на iPhone 16 Pro Max / iOS 27.0.1: работает, но медленнее, чем по кабелю.

Доверие по Wi-Fi не выдаётся: без готовой пары скрипт остановится и попросит кабель. Сеть должна пропускать Bonjour: гостевые сети и изоляция клиентов на роутере не подойдут.

Как проверить

Подготовка (с кабелем, один раз)

  1. Подключите iPhone кабелем, разблокируйте, нажмите «Доверять».
  2. Запустите меню, пункт 2. SIM должны показаться: доверие есть.
  3. Откройте Finder → iPhone в боковой панели → вкладка «Основные» → включите «Показывать этот iPhone, если он подключён к Wi-Fi» → «Применить». На Windows то же в iTunes, «Обзор» → «Параметры».
  4. Закройте Finder/iTunes и отключите кабель.

Проверка связи (ничего не пишет)

  1. iPhone и компьютер в одной сети Wi-Fi (не гостевой, без изоляции клиентов). iPhone разблокирован, экран не гаснет.
  2. Меню: 10 (должно стать «Wi-Fi»), затем 2.
  3. Появились SIM и план — связь по Wi-Fi работает. «iPhone не виден по Wi-Fi» — не включена галка из шага 3, телефон спит или сеть режет Bonjour. «Нет доверия» — повторите шаги 1–2.

Установка

  1. Кабель держите под рукой. Меню: 10 → Wi-Fi, затем 1.
  2. Установка идёт дольше, чем по кабелю, — это нормально. Если сеть нестабильна и выпадает «Сбой AirTraffic», подключите кабель и повторите в режиме «кабель».
  3. При сбое скрипт сам откатывает телефон, тоже по Wi-Fi. Если телефон уснул или пропал из сети посреди записи, этап прерывается через 5 минут, дальше откат. Не откатил — подключите кабель, 10 → кабель, 5.
  4. «Готово» — проверьте VoWiFi по разделу «После установки».

Журналы каждого запуска лежат в runs, host.jsonl — ответы AirTraffic. Их и прикладывайте к отчёту.

Для продвинутых

python3 carrier.py --status                          # SIM и план, без записи
python3 carrier.py --wifi --status                   # то же по Wi-Fi
python3 carrier.py                                   # Vodafone HU на все SIM
python3 carrier.py --bundle O2_Germany --sims 1      # другой профиль, только SIM 1
python3 carrier.py --restore                         # вернуть штатные профили
python3 carrier.py --restore --sims 2               # только для SIM 2
python3 carrier.py --help                            # все флаги

На Windows вместо python3 пишите py. Подробное техническое описание есть в README.txt.


Протокол переноса основан на AirLift (MIT, лицензия в LICENSE-AirLift.txt).

Автоматические проверки

Workflow Tests запускается на коммитах в ветках и в pull request. Матрица проверяет Python 3.11–3.14 на Windows, Linux, macOS 15 и 26 (Apple Silicon и Intel) и macOS 27 (Apple Silicon, образ GitHub xcode-27 в режиме public preview): установку зависимостей через тот же код, что использует запускатель, импорты сервисов, компиляцию исходников и регрессионные тесты. Это 28 сочетаний Python и ОС. Фактические версии ОС и Python и архитектура выводятся в журнал задания. Общий статус Python compatibility успешен только после прохождения всей матрицы; его можно назначить обязательной проверкой в правилах ветки.

Тесты проверяют архивы и резервные копии, конфигурацию профилей, выбор и восстановление SIM, обработку ошибок, служебные файлы Books и логи. Они используют временные файлы и имитацию границ подключения, не подключаются к телефону и не заменяют проверку на реальном iPhone.

Локальный запуск без установки зависимостей и подключения телефона:

python -m unittest discover -s tests -v

About

No description, website, or topics provided.

Resources

Stars

138 stars

Watchers

7 watching

Forks

Releases

Packages

Contributors

Languages