Как определить во время выполнения, предназначено ли приложение для разработки, магазина приложений или специального распространения? - PullRequest
30 голосов
/ 06 августа 2010

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

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

Любые советы приветствуются.


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

Ответы [ 5 ]

29 голосов
/ 06 августа 2010

Самый простой способ проверить это посмотреть на 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/>
  • Специальная рассылка содержит 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.

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

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

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

12 голосов
/ 26 марта 2012

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

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

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

2 голосов
/ 09 августа 2010

Я распаковал внедренный файл.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, в которой содержатся ответы на все вопросы о типе распространения (разработчик, ad-hoc, App Store).

0 голосов
/ 14 октября 2016

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

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

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

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;
}
0 голосов
/ 23 марта 2014
#if (DEBUG)
#define SERVER @"aaaa.com/dev"
#else
#define SERVER @"aaa.com/pro"
#endif

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

, но я понятия не имею, adhoc или production, если не использую имя профиля обеспечения

...