Comment déterminer à exécution si l'application est pour le développement, app store ou la distribution ad hoc?

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

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.

Était-ce utile?

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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top