Comment déterminer à exécution si l'application est pour le développement, app store ou la distribution ad hoc?
-
26-09-2019 - |
Question
Y at-il un moyen de déterminer si programme a été construit et a signé l'application en cours d'exécution pour le développement uniquement ou si elle a été construite pour la distribution? Et peut-on déterminer si a été construit pour le magasin d'applications ou de distribution ad hoc?
est-il par exemple peut-être pour accéder à la signature de code et obtenir les informations à partir de là? Ou y at-il certains fichiers présents dans l'une des variantes qui n'existent pas dans les autres? Fait partie de l'info paquet? Ou peut-il être dérivé du fichier exécutable?
Les conseils sont appréciés.
Il semble que le fichier embedded.mobileprovision est au format ASN.1.
La solution
La meilleure façon de vérifier est de regarder embedded.mobileprovision
([[NSBundle mainBundle] pathForResource:@"embedded.mobileprovision" ofType:nil]
):
- Il est un peu une douleur à analyser, car il est un plist signé (PKCS # 7 des données signées, selon
openssl asn1parse -inform der
), mais un mauvais hack est de regarder juste pour<plist
et</plist>
. - Développement contient UDID et
<key>get-task-allow</key><true/>
- la distribution ad hoc contient UDID (et get-tâche allow = false)
- Distribution App Store ne contient pas UDID.
L'autre chose que vous pouvez vérifier est les droits intégrés dans les exécutables (listes de otool -l
comme LC_CODE_SIGNATURE
). Parsing cela est encore plus fastidieux (vous devez analyser les commandes d'en-tête et charge Mach-O, et pour les binaires « universels » qui sont maintenant la valeur par défaut, vous devez vérifier l'architecture actuellement chargée ou toutes les architectures).
- Développement construit contient
<key>get-task-allow</key><true/>
- Ad Hoc et App Store construit contiennent
<key>get-task-allow</key><false/>
Je ne pense pas que les droits établissent une distinction entre Ad Hoc et App Store builds.
En dehors de ceux-ci et le certificat qu'il a signé avec, il n'y a pas de différence entre les applications / développement / Ad Hoc App Store (il y a quelques autres choses dans les droits / profil d'approvisionnement, mais rien de plus fiable que je peux penser).
Considérations de sécurité
Aucun de ceux-ci sont si difficiles à contourner. Pour la première méthode, l'application pourrait juste -[NSBundle pathForResource:ofType:]
« swizzle ». La deuxième méthode est un peu plus difficile en fonction de ce que l'API que vous utilisez pour lire le fichier.
Autres conseils
openssl asn1parse -inform DEM -in *Mobile_Provision_File* -strparse 54
est la meilleure façon d'accéder aux données que j'ai trouvé.
EDIT:
security cms -D -i *Mobile_Provision_File*
est plus facile. Les feuilles de commande OpenSSL certains des ordures dans la sortie.
Je l'ai extrait un fichier embedded.mobileprovision et collé dans une visionneuse d'ASN.1 en ligne (par exemple http://www.geocities.co.jp/SiliconValley-SanJose/3377/asn1JS.html ), et ce qui est infiniment obtenu:
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]
Avec cela et quelques connaissances ASN.1, votre explication prend tout son sens.
La partie intéressante est la chaîne d'octets à partir 3c3f786d6c. C'est la partie XML au format de liste de propriétés d'Apple qui contient toutes les réponses sur le type de distribution (développeur, ad hoc, App Store).
#if (DEBUG)
#define SERVER @"aaaa.com/dev"
#else
#define SERVER @"aaa.com/pro"
#endif
qui est la façon dont je distinguais le mode de mise au point et la libération,
mais je ne sais pas pour adhoc ou à la production, à moins utiliser le nom du profil de provision
créer un point essentiel pour détecter la construction ad hoc Voir: https://gist.github.com/iShawnWang/d904934efded271d83b36288562df410
AdHoc détecter avec 2 suivant les conditions:
1.embedded.mobileprovision
contient ProvisionedDevices
champ (spécial Debug et Ad build contient ce champ, libère pas)
2.it n'est pas DEBUG Construire, nous pouvons utiliser #ifdef DEBUG
de le décider
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;
}