Как определить во время выполнения, если приложение предназначено для разработки, хранения приложений или специального распространения?
Есть ли способ определить программно, если созданное в настоящее время приложение было построено и подписано только для разработки или было ли оно создано для распространения? И можно ли определить, была ли сборка для магазина приложений или специального распределения?
Это, например, возможно, получить доступ к кодовой сигнатуре и получить информацию оттуда? Или есть определенные файлы, присутствующие в одном из вариантов, которых нет в других? Является частью информации о пакете? Или он может быть получен из исполняемого файла?
Любые подсказки оценены.
Кажется, что файл embedded.mobileprovision находится в формате ASN.1.
Ответы
Ответ 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;
}