32 votes

Comment déterminer au moment de l'exécution si l'application est destinée au développement, à l'App Store ou à la distribution ad hoc?

Est-il un moyen de déterminer par programmation si l'application en cours d'exécution a été construit et signé pour le développement ou si il a été construit pour la distribution? Et peut-on déterminer si la construction de l'app store ou de distribution ad hoc?

Est-il par exemple, éventuellement, pour accéder à la signature de code et d'obtenir l'information à partir de là? Ou il y en a certains fichiers présents dans l'une des variantes qui n'existent pas dans les autres? Fait partie de l'ensemble d'informations? Ou peut-il être dérivée à partir du fichier exécutable?

Tous les conseils sont appréciés.


Il semble que l'embedded.fichier mobileprovision est dans l'ASN.1 format.

30voto

tc. Points 23958

La meilleure façon de le vérifier est de regarder embedded.mobileprovision ([[NSBundle mainBundle] pathForResource:@"embedded.mobileprovision" ofType:nil]):

  • C'est un peu une douleur à analyser car il est signé plist (PKCS#7 données signées, selon openssl asn1parse -inform der), mais un mauvais hack est de simplement regarder pour <plist et </plist>.
  • Le développement comprend avec leur udid et <key>get-task-allow</key><true/>
  • Ad Hoc de distribution contient avec leur udid (et d'obtenir la tâche allow=false)
  • App Store de distribution contient pas de avec leur udid.

L'autre chose que vous pouvez faire est de vérifier les droits incorporés dans le fichier exécutable (otool -l qu'il énumère, LC_CODE_SIGNATURE). L'analyse de ce qui est encore plus fastidieux (vous devez analyser le Mach-O-tête et de charger les commandes, et pour "universel de fichiers binaires qui sont maintenant par défaut, vous aurez besoin de vérifier les chargés d'architecture ou de toutes les architectures).

  • Le développement s'appuie contiennent <key>get-task-allow</key><true/>
  • Ad Hoc et l'App Store s'appuie contiennent <key>get-task-allow</key><false/>

Je ne pense pas que les droits de distinction entre les Ad Hoc et l'App Store construit.

En dehors de ceux-ci et le certificat est signé avec, il n'y a pas de différence entre le Développement/Ad Hoc/apps de l'App Store (il y en a quelques autres choses dans les droits/profil de configuration, mais rien de plus fiable que je peux penser).

Considérations relatives à la sécurité

Aucune de ces sont difficiles à contourner. Pour la première méthode, l'application pourrait juste "swizzle" -[NSBundle pathForResource:ofType:]. La deuxième méthode est un peu plus difficile en fonction de ce que l'API que vous utilisez pour lire le fichier.

12voto

Brian King Points 1461

openssl asn1parse -inform DEM -in *Mobile_Provision_File* -strparse 54 est le moyen le plus simple d'accéder aux données que j'ai trouvées.

ÉDITER:

security cms -D -i *Mobile_Provision_File* est en fait plus facile. La commande openssl laisse des ordures dans la sortie.

2voto

Codo Points 28685

J'ai extrait d'un intégré à.fichier mobileprovision et collé dans un site de l'ASN.1 observateur (par ex. http://www.geocities.co.jp/SiliconValley-SanJose/3377/asn1JS.html), et c'est ce que j'obtiens:

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 ce et certains ASN.1 les connaissances, votre explication tout à fait logique.

La partie intéressante est la chaîne d'octet de départ 3c3f786d6c. C'est la partie XML d'Apple dans la propriété format de liste qui contient toutes les réponses sur le type de distribution (développeur, ad-hoc, l'App Store).

0voto

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

c'est ainsi que je distingue le mode de débogage et de libération,

mais je n'ai aucune idée pour adhoc ou production à moins d'utiliser le nom du profil de provision

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X