Подтвердить что ты не робот

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

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

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

Любые подсказки оценены.


Кажется, что файл embedded.mobileprovision находится в формате ASN.1.

4b9b3361

Ответ 1

Самый простой способ проверить - посмотреть 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.

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

Вопросы безопасности

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

Ответ 2

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

EDIT:

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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

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

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

2.it не 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;
}