Невозможно связать () сокет внутри Apple Calendar (инъекция dylib)

Я пытаюсь проверить Apple Calendar в iOS 8.1 (MobileCal.app) Покажите, следуя этому руководству.

Для этого я делаю инъекцию libReveal.dylib который запускает свой собственный HTTP-сервер, к которому подключается приложение OS X Reveal.

Этот метод отлично работает с большинством системных приложений iOS (телефон, заметки, напоминания и т. Д.), Но что-то в Календаре препятствует настройке HTTP-сервера.

Когда Календарь запущен, libReveal.dylib правильно вводится, но потом я вижу это в журнале:

MobileCal [5110]: ОШИБКА: Ошибка запуска HTTP-сервера: Ошибка Домен =NSPOSIXErrorDomain Code=1 "Операция не разрешена" UserInfo=0x17426aa40 {NSLocalizedDescription= Операция не разрешена, NSLocalizedFailureReason= Ошибка в функции bind()}

MobileCal [5110]: ОШИБКА: не удалось запустить сервер с ошибкой: Ошибка Домен = Код NSPOSIXErrorDomain = 1 "Операция не разрешена" UserInfo=0x17426aa40 {NSLocalizedDescription= Операция не разрешена, NSLocalizedFailureReason= Ошибка в функции bind()}

Есть идеи о том, что может помешать настройке HTTP-сервера в Календаре? Я заметил, что MobileCal.app расслоение имеет Entitlements.plist файл, в то время как большинство других системных приложений нет. Может ли эта проблема быть связана с файлом прав?


Я также связывался со службой поддержки Reveal, они реагировали, но не могли точно определить причину проблемы. С помощью RevealLoader от Cydia дает тот же результат.

1 ответ

Решение

Ты прав насчет Entitlements.plist, Проблема очень проста - MobileCal.app использует пользовательский профиль песочницы.

На самом деле в iOS много профилей песочницы, не только для приложений AppStore. Многие компоненты системы iOS используют их. Чтобы узнать, какой из них вам нужно посмотреть на права приложения. Более конкретно, seatbelt-profiles ключ.

MobileCal.app подписан с MobileCal профиль. И именно поэтому вы не можете использовать bind(), Я подозреваю, что все сети заблокированы. То же самое можно сказать и о Camera.app, Оно использует MobileSlideShow профиль, который также блокирует все сети.

Я могу придумать и использовать два решения этой проблемы:

  1. Напишите демон. Демон выполнит всю работу, заблокированную профилем песочницы. App и демон будут взаимодействовать через некоторый API IPC (например, уведомления или порты маха). Основная проблема с этим - IPC API также может быть заблокирован профилем песочницы. Например, Camera.app песочница блокирует все API-интерфейсы IPC, которые могут отправлять произвольные данные. Работают только уведомления Дарвина, которые не могут отправлять произвольные данные. Есть способы решить эту проблему, но это будет очень уродливо.

  2. Отказаться от приложения с удаленным профилем песочницы. Таким образом, приложение будет иметь доступ ко всему, и вы сможете выполнять всю работу внутри вашего dylib. Это то, что я использую сейчас, и это работает очень хорошо. Это также своего рода хак, но он значительно улучшает ваш код, не имея дело с IPC и его сложностью. Для меня это того стоит.

Это все в целом. В вашем случае я думаю, что будет работать только второе решение.

Конечно, просто редактирование Entitlements.plist недостаточно. Фактические права указаны в бинарном файле самого приложения. Вы можете подать в отставку либо на своем Mac, либо на самом iDevice. На Mac у вас есть выбор кода и ldid. На iDevice ваш единственный выбор - это ldid.

Давайте посмотрим, как вы можете решить вашу проблему с помощью ldid. Во-первых, вы сбрасываете права с

ldid -e MobileCal > entitlements.xml

Затем вы редактируете дампированные права и переустанавливаете двоичный файл приложения с помощью

ldid -Sentitlements.xml MobileCal

(Да, между -S и файл прав).

Вот и все.

Другие вопросы по тегам