Cómo determinar en tiempo de ejecución si la aplicación es para el desarrollo, la tienda de aplicaciones o distribución especial?

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

Pregunta

¿Hay una manera de determinar mediante programación si la aplicación se está ejecutando actualmente fue construido y firmó para el desarrollo sólo o si fue construido para la distribución? Y se puede determinar si fue construido para la tienda de aplicaciones o distribución especial?

Es, por ejemplo, posiblemente para acceder a la firma de código y obtener la información a partir de ahí? O hay presentan ciertos archivos en una de las variantes que no existen en los demás? Es parte de la información de paquete? O puede ser derivada a partir del archivo ejecutable?

Cualquier consejos son apreciadas.


Parece que el archivo está en formato embedded.mobileprovision ASN.1.

¿Fue útil?

Solución

La forma más sencilla de comprobarlo es mirar a embedded.mobileprovision ([[NSBundle mainBundle] pathForResource:@"embedded.mobileprovision" ofType:nil]):

  • Es un poco de dolor de analizar ya que es un plist firmado (PKCS # 7 datos firmados, según openssl asn1parse -inform der), pero un mal truco es mirar sólo para <plist y </plist>.
  • Desarrollo contiene UDID y <key>get-task-allow</key><true/>
  • Ad Hoc de distribución contiene UDID (y conseguir-tarea permitirá = false)
  • distribución App Store no contiene UDID.

La otra cosa se puede comprobar son los derechos incorporados en los ejecutables (listas otool -l como LC_CODE_SIGNATURE). Análisis sintáctico esto es incluso más tedioso (es necesario analizar los comandos de cabecera Mach-O y de carga, y para binarios "universales" que son ahora la predeterminada, tendrá que comprobar la arquitectura actualmente cargado o todas las arquitecturas).

  • Las versiones en desarrollo contener <key>get-task-allow</key><true/>
  • Ad Hoc y la App Store se basa contener <key>get-task-allow</key><false/>

No creo que los derechos distinguen entre Ad Hoc y la App Store construye.

Además de esos y el certificado está firmado con, no hay diferencia entre el Desarrollo / Ad Hoc / aplicaciones de la App Store (hay algunas otras cosas en los derechos / archivo de suministro, pero nada más fiable que se me ocurre).

Las consideraciones de seguridad

Ninguno de estos son tan difíciles de eludir. Para el primer método, la aplicación podría simplemente -[NSBundle pathForResource:ofType:] "Swizzle". El segundo método es un poco más difícil dependiendo de qué API se utiliza para leer el archivo.

Otros consejos

openssl asn1parse -inform DEM -in *Mobile_Provision_File* -strparse 54 es la forma más fácil de acceder a los datos que he encontrado.

EDIT:

security cms -D -i *Mobile_Provision_File* es realmente más fácil. Las hojas de comando openssl un poco de basura en la salida.

he extraído un archivo embedded.mobileprovision y pegar en un visor de ASN.1 en línea (por ejemplo, http://www.geocities.co.jp/SiliconValley-SanJose/3377/asn1JS.html ), y eso es lo que tiene:

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 esto y un poco de conocimiento ASN.1, su explicación tiene mucho sentido.

La parte interesante es la cadena de octetos a partir 3c3f786d6c. Esa es la parte XML en formato de lista propiedad de Apple que contiene todas las respuestas sobre el tipo de distribución (desarrollador, ad-hoc, App Store).

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

que es la manera que distinguir el modo de depuración y liberación,

pero no tengo ni idea de adhoc o producción menos que el uso del nombre del perfil prestación

puedo crear una esencia para detectar Ad Hoc creación
Ver: https://gist.github.com/iShawnWang/d904934efded271d83b36288562df410

AdHoc detectar con los siguientes 2 condiciones:

1.embedded.mobileprovision contiene ProvisionedDevices campo (depuración y Ad Hoc generación contiene este campo, lanzamiento no)

2.it no es generación de depuración, podemos usar #ifdef DEBUG para decidirlo

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;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top