Domanda

C'è un modo per determinare a livello di codice se l'applicazione in esecuzione è stato costruito e firmato per lo sviluppo solo o se è stato costruito per la distribuzione? E si può determinare se è stato costruito per app store o la distribuzione ad hoc?

E 'per esempio possibilmente di accedere al codice di firma e ottenere le informazioni da lì? O ci sono alcuni file presenti in una delle varianti che non esistono negli altri? Fa parte del fascio informazioni? O può essere derivato dal file eseguibile?

Tutti i suggerimenti sono apprezzati.


Sembra che il file è in formato embedded.mobileprovision ASN.1.

È stato utile?

Soluzione

Il modo più semplice per verificare è quello di guardare embedded.mobileprovision ([[NSBundle mainBundle] pathForResource:@"embedded.mobileprovision" ofType:nil]):

  • E 'un po' di dolore per analizzare in quanto si tratta di un plist firmato (PKCS # 7 Dati firmato, secondo openssl asn1parse -inform der), ma un cattivo hack è a solo sguardo per <plist e </plist>.
  • Sviluppo contiene UDID e <key>get-task-allow</key><true/>
  • Ad Hoc di distribuzione contiene UDID (e ottenere-task-consentire = false)
  • distribuzione App Store non contiene UDID.

L'altra cosa che puoi controllare sono i diritti incorporati nel file eseguibile (liste otool -l come LC_CODE_SIGNATURE). L'analisi di questo è ancora più noiosa (è necessario analizzare i comandi Mach-O di intestazione e di carico, e per i binari "universali" che ora sono l'impostazione predefinita, è necessario controllare l'architettura attualmente caricata o tutte le architetture).

  • Sviluppo costruisce contenere <key>get-task-allow</key><true/>
  • Ad Hoc e App Store costruisce contenere <key>get-task-allow</key><false/>

Non credo che i diritti distinguono tra Ad Hoc e App Store costruisce.

A parte quelli e il certificato è firmato con, non c'è alcuna differenza tra lo sviluppo / ad hoc / apps App Store (ci sono alcune altre cose nei diritti / profilo di provisioning, ma niente di più affidabile che mi viene in mente).

Le considerazioni sulla sicurezza

Nessuno di questi sono poi così difficile da aggirare. Per il primo metodo, l'applicazione poteva solo -[NSBundle pathForResource:ofType:] "swizzle". Il secondo metodo è un po 'più difficile a seconda di ciò API si utilizza per leggere il file.

Altri suggerimenti

openssl asn1parse -inform DEM -in *Mobile_Provision_File* -strparse 54 è il modo più semplice per accedere ai dati che ho trovato.

EDIT:

security cms -D -i *Mobile_Provision_File* in realtà è più facile. Le foglie di comando OpenSSL certa spazzatura in uscita.

Ho estratto un file embedded.mobileprovision e incollato in un visualizzatore ASN.1 online (ad esempio http://www.geocities.co.jp/SiliconValley-SanJose/3377/asn1JS.html ), e questo è ciò che un ottenuto:

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]

Con questo e qualche conoscenza ASN.1, la tua spiegazione ha perfettamente senso.

La parte interessante è la stringa di ottetto partenza 3c3f786d6c. Questa è la parte XML in formato elenco delle proprietà di Apple che contiene tutte le risposte circa il tipo di distribuzione (sviluppatore, ad-hoc, App Store).

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

questo è il mio modo di distinguere la modalità di debug e il rilascio,

, ma non ho idea di adhoc o di produzione a meno che l'uso del nome del profilo disposizione

creo un succo di rilevare Ad Hoc costruzione
Vedere: https://gist.github.com/iShawnWang/d904934efded271d83b36288562df410

AdHoc rilevare con i seguenti 2 condizioni:

1.embedded.mobileprovision contiene campo ProvisionedDevices (debug e Ad Hoc build contiene questo campo, release)

2.it non è debug, possiamo usare #ifdef DEBUG decidere che

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top