iphone - licencia - ¿Cómo determinar en tiempo de ejecución si la aplicación es para desarrollo, tienda de aplicaciones o distribución ad hoc?
licencia de desarrollo ios (5)
He extraído un archivo embedded.mobileprovision y pegado en un visor ASN.1 en línea (por ejemplo, http://www.geocities.co.jp/SiliconValley-SanJose/3377/asn1JS.html ), y eso es lo que tengo:
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 algunos conocimientos de ASN.1, su explicación tiene mucho sentido.
La parte interesante es la cadena de octetos que comienza con 3c3f786d6c. Esa es la parte XML en el formato de lista de propiedades de Apple que contiene todas las respuestas sobre el tipo de distribución (desarrollador, ad-hoc, App Store).
¿Hay una manera de determinar mediante programación si la aplicación que se ejecuta actualmente se creó y firmó solo para el desarrollo o si se creó para su distribución? ¿Y se puede determinar si se compiló para la tienda de aplicaciones o la distribución ad hoc?
¿Es posible, por ejemplo, acceder a la firma del código y obtener la información desde allí? ¿O hay ciertos archivos presentes en una de las variantes que no existen en los otros? ¿Es parte de la información del paquete? ¿O puede derivarse del archivo ejecutable?
Cualquier consejo es apreciado.
Parece que el archivo embedded.mobileprovision está en formato ASN.1.
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.
EDITAR:
security cms -D -i *Mobile_Provision_File*
es realmente más fácil. El comando openssl deja algo de basura en la salida.
Creo una esencia para detectar Ad Hoc build
Consulte: https://gist.github.com/iShawnWang/d904934efded271d83b36288562df410
AdHoc detecta con las siguientes 2 condiciones:
1. embedded.mobileprovision
contiene el campo ProvisionedDevices
(Debug y Ad Hoc Build contiene este campo, versión no)
2. no es DEBUG Build, 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;
}
La forma más fácil de verificar es mirar embedded.mobileprovision
( [[NSBundle mainBundle] pathForResource:@"embedded.mobileprovision" ofType:nil]
):
- Es un poco molesto analizarlo, ya que es un plist firmado (datos firmados de PKCS # 7, según
openssl asn1parse -inform der
), pero un mal truco es simplemente buscar<plist
y</plist>
. - El desarrollo contiene UDID y
<key>get-task-allow</key><true/>
- La distribución ad hoc contiene UDID (y get-task-allow = false)
- La distribución de la App Store no contiene UDID.
La otra cosa que puede verificar es los derechos incrustados en el ejecutable ( otool -l
muestra como LC_CODE_SIGNATURE
). Analizar esto es aún más tedioso (necesita analizar el encabezado de Mach-O y los comandos de carga, y para los binarios "universales" que ahora son los predeterminados, deberá verificar la arquitectura cargada actualmente o todas las arquitecturas).
- Las compilaciones de desarrollo contienen
<key>get-task-allow</key><true/>
- Las compilaciones Ad Hoc y App Store contienen
<key>get-task-allow</key><false/>
No creo que los derechos distingan entre las compilaciones Ad Hoc y App Store.
Aparte de esos y el certificado con el que está firmado, no hay diferencia entre las aplicaciones de Desarrollo / Ad Hoc / App Store (hay algunas otras cosas en el perfil de derechos / aprovisionamiento, pero no hay nada más confiable que pueda pensar).
Consideraciones de Seguridad
Ninguno de estos es tan difícil de eludir. Para el primer método, la aplicación podría simplemente "swizzle" -[NSBundle pathForResource:ofType:]
. El segundo método es un poco más difícil según la API que utilice para leer el archivo.
#if (DEBUG)
#define SERVER @"aaaa.com/dev"
#else
#define SERVER @"aaa.com/pro"
#endif
Esa es la forma en que distingo el modo de depuración y liberación,
pero no tengo idea para adhoc o producción a menos que use el nombre del perfil de provisión