Как определить во время выполнения, предназначено ли приложение для разработки, магазина приложений или специального распространения?

Есть ли способ программно определить, было ли запущенное в данный момент приложение создано и подписано только для разработки или оно было создано для распространения? И можно ли определить, была ли она создана для магазина приложений или для специального распространения?

Это, например, возможно, чтобы получить доступ к подписи кода и получить информацию оттуда? Или в одном из вариантов присутствуют определенные файлы, которых нет в других? Является частью информации о комплекте? Или его можно вывести из исполняемого файла?

Любые подсказки приветствуются.


Похоже, что файл embedded.mobileprovision имеет формат ASN.1.


person Codo    schedule 06.08.2010    source источник


Ответы (5)


Самый простой способ проверить — посмотреть на embedded.mobileprovision ([[NSBundle mainBundle] pathForResource:@"embedded.mobileprovision" ofType:nil]):

  • Это немного сложно разобрать, так как это подписанный plist (подписанные данные PKCS # 7, согласно openssl asn1parse -inform der), но плохой хак - просто искать <plist и </plist>.
  • Разработка содержит UDID и <key>get-task-allow</key><true/>
  • Дистрибутив Ad Hoc содержит UDID (и get-task-allow=false)
  • Дистрибутив App Store не содержит UDID.

Другая вещь, которую вы можете проверить, — это права, встроенные в исполняемый файл (otool -l указывает его как LC_CODE_SIGNATURE). Анализировать это еще более утомительно (вам нужно проанализировать заголовок Mach-O и команды загрузки, а для «универсальных» двоичных файлов, которые теперь используются по умолчанию, вам нужно будет проверить загруженную в данный момент архитектуру или все архитектуры).

  • Сборки разработки содержат <key>get-task-allow</key><true/>
  • Сборки Ad Hoc и App Store содержат <key>get-task-allow</key><false/>

Я не думаю, что права различаются между сборками Ad Hoc и App Store.

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

Соображения безопасности

Ни один из них не так уж сложно обойти. Для первого метода приложение может просто «прокрутить» -[NSBundle pathForResource:ofType:]. Второй способ немного сложнее, в зависимости от того, какой API вы используете для чтения файла.

person tc.    schedule 06.08.2010
comment
Большое спасибо за ваш полезный вклад. Причина определения типа распространения заключается в том, что я хотел бы продать библиотеку, которую можно использовать бесплатно во время разработки и тестирования, но для распространения в App Store требуется лицензия. Файлы embedded.mobileprovision, которые я нашел в каталоге сборки Xcode, представляют собой двоичные файлы с некоторым встроенным XML. Это то же самое, как только приложение установлено на устройстве, или только часть XML установлена? - person Codo; 07.08.2010
comment
Привет, Кодо, у меня такая же ситуация... как ты реализовал проверку? - person Andrea; 14.09.2012
comment
Для внутреннего распространения вы увидите это: <key>ProvisionsAllDevices</key> <true/> - person Sveinung Kval Bakken; 18.04.2013
comment
@SveinungKvalBakken Я предполагаю, что вы имеете в виду внутреннее распространение Enterprise. Я также думаю, что это можно рассматривать как распространение в App Store, если вы не хотите предлагать специальные условия лицензии для внутреннего распространения. - person tc.; 22.04.2013
comment
Спасибо за это! Я объединил его в категорию в надежде, что это избавит кого-то от работы в будущем: github .com/blindsightcorp/BSMobileProvision - person Kaolin Fire; 26.06.2013

openssl asn1parse -inform DEM -in *Mobile_Provision_File* -strparse 54 — это самый простой способ получить доступ к данным, которые я нашел.

РЕДАКТИРОВАТЬ:

security cms -D -i *Mobile_Provision_File* на самом деле проще. Команда openssl оставляет на выходе некоторый мусор.

person Brian King    schedule 26.03.2012
comment
Блестящий. Это то, что я искал очень долго. - person Chaitanya Gupta; 11.07.2012

Я извлек файл embedded.mobileprovision и вставил его в онлайн-средство просмотра ASN.1 (например, http://www.geocities.co.jp/SiliconValley-SanJose/3377/asn1JS.html), и вот что получилось:

SEQUENCE {
   OBJECTIDENTIFIER 1.2.840.113549.1.7.2 (signedData)
   [0] {
      SEQUENCE {
         INTEGER 1
         SET {
            SEQUENCE {
               OBJECTIDENTIFIER 1.3.14.3.2.26
               NULL 
            }
         }
         SEQUENCE {
            OBJECTIDENTIFIER 1.2.840.113549.1.7.1 (data)
            [0] {
               OCTETSTRING 3c3f786d6c20766 ... 6c6973743e0a
            }
         }
         [0] {
            SEQUENCE {
               SEQUENCE {
                  [0] {
                     INTEGER 2
                  }
 ... [much more]

С этим и некоторыми знаниями ASN.1 ваше объяснение имеет смысл.

Интересной частью является строка октетов, начинающаяся с 3c3f786d6c. Это часть XML в формате списка свойств Apple, которая содержит все ответы о типе распространения (разработчик, специальный, App Store).

person Codo    schedule 09.08.2010

#if (DEBUG)
#define SERVER @"aaaa.com/dev"
#else
#define SERVER @"aaa.com/pro"
#endif

так я различаю режим отладки и выпуска,

но я понятия не имею для adhoc или производства, если не использую имя профиля предоставления

person chings228    schedule 23.03.2014

Я создаю gist для обнаружения сборки Ad Hoc
См.: https://gist.github.com/iShawnWang/d904934efded271d83b36288562df410

Обнаружение AdHoc со следующими двумя условиями:

1.embedded.mobileprovision содержит поле ProvisionedDevices (Debug и Ad Hoc Build содержат это поле, Release нет)

2. это не DEBUG Build, мы можем использовать #ifdef DEBUG, чтобы решить это

NS_INLINE BOOL isAdHoc(){
    BOOL isAdHoc = NO;
    BOOL isDebug;

#ifdef DEBUG
    isDebug=YES;
#else
    isDebug=NO;
#endif

    NSData *data=[NSData dataWithContentsOfURL:[[NSBundle mainBundle]URLForResource:@"embedded" withExtension:@"mobileprovision"]];
    NSString *str=[[NSString alloc]initWithData:data encoding:NSISOLatin1StringEncoding];
    NSRange rangeOfDevicesUDIDs = [str rangeOfString:@"ProvisionedDevices"];

    isAdHoc = rangeOfDevicesUDIDs.location!=NSNotFound && !isDebug;
    return isAdHoc;
}
person Shawn Wang    schedule 14.10.2016