Как определить во время выполнения, если приложение для разработки, App Store или Ad Hoc Displation?

StackOverflow https://stackoverflow.com/questions/3426467

Вопрос

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

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

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


Кажется, что встроенный файл MobileProvision находится в формате ASN.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/>
  • Распределение специального HOC содержит UDIDS (и Get-Task-Project = false)
  • Распределение магазина приложений не содержит UDID.

Другая вещь, которую вы можете проверить, это права, встроенные в исполняемый файл (otool -l Перечисляет его как LC_CODE_SIGNATURE). Разбор на разбор.

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

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

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

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

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

Другие советы

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

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

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

Я извлек встроенный файл 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 ваше объяснение имеет смысл.

Интересная часть - это octet String, начиная с 3C3F786D6C. Это часть XML в формате списка свойств Apple, который содержит все ответы о типе распределения (разработчик, Ad-Hoc, App Store).

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

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

Но я понятия не имею в Adhoc или Production, если не используйте имя профиля

Я создаю гид для обнаружения специальной сборки
Видеть : https://gist.github.com/ishawnwang/d904934Efded271d83b36288562df410.

Adhoc определяет со следующими 2 условиями:

1.embedded.mobileprovision Содержит поле ProvisionedDevices (Отладка и специальная сборка содержит это поле, выпуск не)

2. Это не отлаживает сборку, мы можем использовать #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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top