Determinar si un iPhone tiene la cárcel rota mediante programación

79

¿Cómo se determina (mediante programación) si un iPhone / iPod es:

  1. Cárcel rota
  2. Ejecutando una copia pirateada de su software

Pinch Media puede detectar si un teléfono está roto o si el software que se está ejecutando está roto, ¿alguien sabe cómo lo hacen? ¿Hay bibliotecas?

Richard Stelling
fuente
1
Apple sabe cómo determinar eso: p
JoshJordan
2
Ver también: stackoverflow.com/questions/413242/…
e.James
2
Si está interesado en esta pregunta, ¿por qué no respalda la propuesta del Área 51 para un sitio de intercambio de pilas para romper la cárcel?
Richard Stelling

Respuestas:

39

Esta es una de las formas de detectar si su aplicación fue descifrada.

En resumen: el craqueo generalmente requiere cambiar el Info.plist. Dado que es un archivo normal al que tiene acceso, es bastante fácil determinar dichos cambios.

zakovyrya
fuente
1
Desafortunadamente, existe una solución que rompe este mecanismo de detección. Una vez que la aplicación está instalada, la clave SignerIdentity ya no es necesaria, por lo que el cracker puede simplemente ingresar a su teléfono con jailbreak y editar el plist para eliminarlo.
Lily Ballard
@KevinBallard, ¿tiene alguna recomendación para detectar fugas de la cárcel comunes en 2017?
Cœur
@ Cœur No, no he investigado esto desde que escribí ese comentario.
Lily Ballard
25

Detectar un teléfono con jailbreak es tan fácil como verificar la presencia de una /private/var/lib/apt/carpeta. Aunque esto no detecta a los usuarios de solo instalador, la mayoría ya ha instalado Cydia, Icy o RockYourPhone (todos los cuales usan apt)

Para detectar usuarios pirateados, la forma más sencilla es comprobar la presencia de una SignerIdentityclave en el archivo de su aplicación Info.plist. Dado que los crackers avanzados pueden encontrar fácilmente las [[[NSBundle mainBundle] infoDictionary] objectForKey: @"SignerIdentity"]comprobaciones estándar , es mejor ocultar estas llamadas utilizando el tiempo de ejecución de Objective C disponible a través de #import <objc/runtime.h>o utilizar equivalentes alternativos.

rpetrich
fuente
10

Solo para ampliar la respuesta de zakovyrya, puede usar el siguiente código:

if ([[[NSBundle mainBundle] infoDictionary] objectForKey: @"SignerIdentity"] != nil) {
  // Jailbroken
}

SIN EMBARGO, la persona que hace jailbreak a su aplicación puede editar su programa en hexadecimal y, como tal, podría editar la cadena @ "SignerIdentity" para que lea @ "siNGeridentity" o cualquier otra cosa que devuelva nil, y así pasar.

Entonces, si usa esto (o cualquiera de las otras sugerencias de http://thwart-ipa-cracks.blogspot.com/2008/11/detection.html ):

  • No esperes que funcione para siempre
  • No use esta información para romper / obstaculizar su aplicación de ninguna manera (de lo contrario, tendrán motivos para editarla, por lo que su aplicación no sabrá que tiene jailbreak)
  • Probablemente sea prudente ofuscar esta parte del código. Por ejemplo, puede poner la cadena invertida codificada en base64 en su código y luego decodificarla en la aplicación invirtiendo el proceso.
  • Valide su validación más adelante en su código (por ejemplo, cuando dije SignerIdentity, ¿realmente decía SignerIdentity o siNGeridentity?)
  • No le digas a la gente en un sitio web público como stackoverflow cómo lo haces
  • Tenga en cuenta que es solo una guía y no es infalible (¡ni infalible!). Un gran poder conlleva una gran responsabilidad.
Benjie
fuente
Entonces, esto verifica SignerIdentity en su paquete de aplicaciones, pero ¿qué pasa con el caso de que la aplicación no haya sido pirateada o algo más que el dispositivo sea JailBroken? ¿Cómo detectaría eso?
Edward Ashak
Hágalo como una pregunta en SO y alguien responderá :)
Benjie
5

Para ampliar los comentarios de Yonel y Benjie anteriores:

1) El método de Landon Fuller que se basa en la verificación de cifrado, vinculado anteriormente por yonel, parece ser el único que aún no ha sido derrotado por herramientas de craqueo automatizadas. No me preocuparía demasiado que Apple cambie el estado del encabezado LC_ENCRYPTION_INFO en el corto plazo. Parece tener algunos efectos impredecibles en iphones con jailbreak (incluso cuando el usuario ha comprado una copia ...)

En cualquier caso, no tomaría ninguna acción precipitada contra un usuario basado en ese código ...

2) Para complementar el comentario de Benjie re. ofuscación (una necesidad absoluta cuando se trata de cualquier valor de cadena en su código antipiratería): una forma similar, pero quizás incluso más fácil, es verificar siempre una versión hash con sal del valor que está buscando. Por ejemplo (aunque esa comprobación ya no sea eficaz), comprobaría el nombre de la clave de cada MainBundle como md5 (keyName + "some secret salt") con la constante apropiada ... Bastante básica, pero seguro que anula cualquier intento de localizar cuerda.

Por supuesto, esto requiere que pueda consultar indirectamente el valor que desea comparar (por ejemplo, revisando una matriz que lo contiene). Pero este es el caso más frecuente.


fuente
¿El método Landon Fuller todavía funciona hoy en día, con iOS 7?
Basil Bourque