Как определить во время выполнения, если приложение для разработки, App Store или Ad Hoc Displation?
-
26-09-2019 - |
Вопрос
Есть ли способ программно определить, если в настоящее время запущенное приложение было построено и подписано только для разработки или было ли он построен для распространения? И можно определить, было ли построить для 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;
}