Отказ от экспорта IPA из магазина приложений с сертификатом разработки

Вопрос

Можно ли отменить/предоставить IPA, экспортированные для AppStore, с сертификатом разработки и профилем?

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

Похоже, ни один из популярных инструментов не делает этого правильно. Кто-нибудь когда-нибудь справился с этим или это невозможно по какой-то причине?

Результаты

В журнале устройства я не вижу ничего, о чем сообщает сам процесс приложения, поэтому ОС, должно быть, убила его перед запуском. Я вижу это:

securityd[101] <Notice>: cert[0]: CheckLeafMarkerOid =(leaf)[]> 0
securityd[101] <Notice>: cert[0]: SubjectCommonName =(leaf)[]> 0
securityd[101] <Notice>: cert[0]: IssuerCommonName =(path)[]> 0
amfid(Security)[196] <Notice>:  [leaf CheckLeafMarkerOid IssuerCommonName SubjectCommonName]
amfid(libmis.dylib)[196] <Info>: Blacklist does not exist.
amfid(libmis.dylib)[196] <Info>: Using empty blacklist.
amfid(libmis.dylib)[196] <Info>: CreateMISAuthListWithStream: open stream failed (may be non-existing)
amfid(libmis.dylib)[196] <Info>: CreateMISAuthListWithStream: creating empty auth list
assertiond[66] <Notice>: Unable to obtain a task name port right for pid 1683: (os/kern) failure (5)
SpringBoard(FrontBoard)[57] <Error>: Unable to register for exec notifications: No such process
SpringBoard(BaseBoard)[57] <Error>: Unable to get short BSD proc info for 1683: No such process
SpringBoard(BaseBoard)[57] <Error>: Unable to get proc info for 1683: No such process
SpringBoard(BaseBoard)[57] <Error>: Unable to obtain a task name port right for pid 1683: (os/kern) failure (0x5)
SpringBoard(BaseBoard)[57] <Error>: Unable to get short BSD proc info for 1683: No such process
SpringBoard(FrontBoard)[57] <Error>: Unable to obtain a process handle for <FBApplicationProcess: 0x10bc26cd0; com.company.product.name; pid: 1683>

Похоже, это указывает на проблему с правами. Однако, когда я вручную распечатываю их (/usr/libexec/PlistBuddy -x -c "print :Entitlements " /dev/stdin <<< $(security cms -D -i "$1"/embedded.mobileprovision) > entitlements.plist ) из установленного IPA, у меня есть:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
        <key>application-identifier</key>
        <string>TEAMID.*</string>
        <key>com.apple.developer.default-data-protection</key>
        <string>NSFileProtectionComplete</string>
        <key>com.apple.developer.team-identifier</key>
        <string>TEAMID</string>
        <key>get-task-allow</key>
        <true/>
        <key>keychain-access-groups</key>
        <array>
                <string>TEAMID.*</string>
        </array>
</dict>
</plist>

Это ясно показывает, что право get-task-allow является истинным.

Инструменты

Какой бы инструмент я ни пробовал, я получаю тот же результат, например

Похожие вопросы

Обновление 1

(реакция на @Yoshkebab)

Вывод otool предполагает, что двоичный файл не зашифрован: otool -l App/Payload/App.app/App | grep -A 4 -i encrypt:

          cmd LC_ENCRYPTION_INFO
      cmdsize 20
     cryptoff 0
    cryptsize 0
      cryptid 0
--
          cmd LC_ENCRYPTION_INFO_64
      cmdsize 24
     cryptoff 0
    cryptsize 0
      cryptid 0

Однако, например. Хоппер не может его разобрать... Есть ли упоминания о том, что Apple применяет шифрование в Xcode? Это указывало бы на то, что у них есть этот ключ в системах пользователя? Также я не вижу шагов сборки, которые указывали бы на это (дизайн кода просто добавляет подпись, не так ли?)

Clutch не видит мое приложение, а библиотека dumpdecrypted Стефана Эссера не работает, потому что я подозреваю, что приложение сразу же дает сбой (моя настройка в порядке, потому что она работает для других приложений).


person dzan    schedule 01.08.2017    source источник
comment
Вы только печатаете права в профиле подготовки с помощью plistbuddy, чтобы найти права в самом приложении, вам нужно будет использовать codesign -d --entitlements - [path to app binary]   -  person Tristan Burnside    schedule 01.08.2017
comment
Права профиля предоставления — это те, которые используются для отказа от двоичного файла, поэтому после подписания выходные данные двух будут (должны) быть идентичными.   -  person Jonas    schedule 01.08.2017
comment
Вы не можете. Убедитесь, что вы видите здесь и здесь   -  person Honey    schedule 14.12.2020


Ответы (1)


Приложения, подписанные в AppStore, не только подписаны сертификатом разработчика, но и двоичные файлы также зашифрованы закрытым ключом Apple. Таким образом, вы можете отказаться от приложений, но если вы не расшифруете двоичный файл, вы не сможете их запустить. Проверьте команду загрузки двоичного файла LC_ENCRYPTION_INFO (самый простой способ — использовать MachoView), если вы видите флаг Crypt ID != 0, бинарник зашифрован.

Предполагая, что это так, вы все равно можете это сделать, это немного утомительно, и вам понадобится взломанное устройство с установленным приложением.

  1. Подключитесь к своему устройству с помощью SSH. Самый простой способ сделать это с помощью gandalf
  2. Получите Clutch и установите его на свое устройство - следуйте их инструкциям (я обнаружил, что самый простой способ скомпилировать его это изменить имя пакета)
  3. Выгрузить расшифрованное приложение в новый IPA (Clutch -d "YOUR_PACKAGE_ID")

Теперь у вас есть расшифрованный IPA, который вы можете отказаться

person Yoshkebab    schedule 01.08.2017
comment
Есть ли у вас какие-либо упоминания об Apple, применяющей DRM, когда разработчик экспортирует для App Store? Имеет ли смысл делать это в облаке после загрузки? Я обновлю свой пост с дополнительной информацией о шифровании и т. д. - person dzan; 01.08.2017