¿Cómo detecto que una aplicación de iOS se ejecuta en un teléfono con jailbreak?

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

  •  03-07-2019
  •  | 
  •  

Pregunta

Si quiero que mi aplicación se comporte de manera diferente en un iPhone con jailbreak, ¿cómo podría determinar esto?

¿Fue útil?

Solución

Depende de lo que quieras decir con jailbreak. En el caso simple, debería poder ver si Cydia está instalado y seguirlo, algo así como

NSString *filePath = @"/Applications/Cydia.app";
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath])
{
   // do something useful
}

Para los núcleos pirateados, es un poco (mucho) más complicado.

Otros consejos

+(BOOL)isJailbroken {
    NSURL* url = [NSURL URLWithString:@"cydia://package/com.example.package"];
    return [[UIApplication sharedApplication] canOpenURL:url];
}

Comprobar la ruta del archivo /Applications/Cydia.app no está permitido en un teléfono normal? Nunca he oído que Apple detecte esto y rechace una aplicación, pero Apple es impredecible. Cydia tiene un esquema de URL cydia: // que se puede verificar legalmente con UIApplication canOpenURL:

Este es un código que combina algunas respuestas que encontré para esta necesidad, y le dará una tasa de éxito mucho mayor:

BOOL isJailbroken()
{
#if !(TARGET_IPHONE_SIMULATOR)

   if ([[NSFileManager defaultManager] fileExistsAtPath:@"/Applications/Cydia.app"] ||
       [[NSFileManager defaultManager] fileExistsAtPath:@"/Library/MobileSubstrate/MobileSubstrate.dylib"] ||
       [[NSFileManager defaultManager] fileExistsAtPath:@"/bin/bash"] ||
       [[NSFileManager defaultManager] fileExistsAtPath:@"/usr/sbin/sshd"] ||
       [[NSFileManager defaultManager] fileExistsAtPath:@"/etc/apt"] ||
       [[NSFileManager defaultManager] fileExistsAtPath:@"/private/var/lib/apt/"] ||
       [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://package/com.example.package"]])  {
         return YES;
   }

   FILE *f = NULL ;
   if ((f = fopen("/bin/bash", "r")) ||
      (f = fopen("/Applications/Cydia.app", "r")) ||
      (f = fopen("/Library/MobileSubstrate/MobileSubstrate.dylib", "r")) ||
      (f = fopen("/usr/sbin/sshd", "r")) ||
      (f = fopen("/etc/apt", "r")))  {
         fclose(f);
         return YES;
   }
   fclose(f);

   NSError *error;
   NSString *stringToBeWritten = @"This is a test.";
   [stringToBeWritten writeToFile:@"/private/jailbreak.txt" atomically:YES encoding:NSUTF8StringEncoding error:&error];
   [[NSFileManager defaultManager] removeItemAtPath:@"/private/jailbreak.txt" error:nil];
   if(error == nil)
   {
      return YES;
   }

#endif

   return NO;
}

Comprobar si el núcleo está roto no es mucho más complicado.

Jailbreak hace que la verificación de la firma del núcleo del código firmado siempre informe que el código está firmado correctamente, los teléfonos ininterrumpidos no pueden ejecutar código con una firma incorrecta.

Entonces, incluya un ejecutable separado en la aplicación con una firma incorrecta. Podría ser un programa de 3 líneas que tiene main () y un valor de retorno. Compile el ejecutable sin firmar el código (desactívelo en Configuración del proyecto- > Build) y fíjelo con una clave diferente usando el " codeign " utilidad de línea de comandos.

Haga que su aplicación ejecute el ejecutable separado. Si su programa no puede obtener el valor de retorno cuando ejecuta el ejecutable separado con el signo incorrecto, definitivamente está encarcelado. Si el ejecutable separado devuelve A-OK, el teléfono está definitivamente liberado.

BOOL isJailbroken()
{
#if TARGET_IPHONE_SIMULATOR
    return NO;
#else
    FILE *f = fopen("/bin/bash", "r");

    if (errno == ENOENT)
    {
        // device is NOT jailbroken
        fclose(f);
        return NO;
    }
    else {
        // device IS jailbroken
        fclose(f);
        return YES;
    }
#endif
}

Puede detectar si un dispositivo tiene JailBroken o no al verificar lo siguiente:

  • Cydia está instalado
  • Verificar algunas de las rutas del sistema
  • Realizar una verificación de integridad de sandbox
  • Realizar verificación de enlace simbólico
  • Verifique si crea y escribe archivos fuera de su Sandbox

Hay una biblioteca de código abierto que creé a partir de varios artículos y libros. Pruébelo en GitHub !

Reformé en Swift 2.3 la solución provista por @Yossi

public static func jailbroken(application: UIApplication) -> Bool {
    guard let cydiaUrlScheme = NSURL(string: "cydia://package/com.example.package") else { return isJailbroken() }
    return application.canOpenURL(cydiaUrlScheme) || isJailbroken()
}


static func isJailbroken() -> Bool {

    if isSimulator {
        return false
    }

    let fileManager = NSFileManager.defaultManager()
    if fileManager.fileExistsAtPath("/Applications/Cydia.app") ||
        fileManager.fileExistsAtPath("/Library/MobileSubstrate/MobileSubstrate.dylib") ||
        fileManager.fileExistsAtPath("/bin/bash") ||
        fileManager.fileExistsAtPath("/usr/sbin/sshd") ||
        fileManager.fileExistsAtPath("/etc/apt") ||
        fileManager.fileExistsAtPath("/usr/bin/ssh") {
        return true
    }

    if canOpen("/Applications/Cydia.app") ||
        canOpen("/Library/MobileSubstrate/MobileSubstrate.dylib") ||
        canOpen("/bin/bash") ||
        canOpen("/usr/sbin/sshd") ||
        canOpen("/etc/apt") ||
        canOpen("/usr/bin/ssh") {
        return true
    }

    let path = "/private/" + NSUUID().UUIDString
    do {
        try "anyString".writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding)
        try fileManager.removeItemAtPath(path)
        return true
    } catch {
        return false
    }
}

static func canOpen(path: String) -> Bool {
    let file = fopen(path, "r")
    guard file != nil else { return false }
    fclose(file)
    return true
}

El método más sofisticado que conozco es usar la función objc_copyImageNames () . Devuelve una lista de las bibliotecas cargadas actualmente y, dado que la mayoría de las personas tienen MobileSubstrate en dispositivos con jailbreak y la mayoría de las herramientas de crack de iAP dependen de él, al menos aparecerán algunas bibliotecas de MobileSubstrate.

No conozco ninguna '' API '' que existen para esto Si lo hubiera, un producto para enmascarar jailbreak los cubriría rápidamente.

Como mucha gente señala, es un juego de gato y ratón. Y después de que ambos jugadores se vuelvan expertos, todo se reduce a quién obtiene el primer movimiento. (Persona que tiene el dispositivo)

Encontré muchas buenas sugerencias para detectar jailbreak en el nuevo libro de Zdziarski "Hacking and Securing iOS Apps". (Personalmente, pagué más por el libro electrónico O'Reilly porque permiten copiar y pegar).

No, no estoy afiliado a los editores. Pero lo encontré un buen libro. No me gusta publicar solo los errores de los hackers para que puedan solucionarlos, así que pensé en señalar el libro.

Intente ejecutar código sin firmar a través de su aplicación.

Un dispositivo con jailbreak generalmente tiene las siguientes características:

  • ejecutar código sin firmar
  • tiene instalado Cydia
  • tiene archivos de jailbreak
  • acceso completo r / w a todo el sistema de archivos
  • algunos archivos del sistema se habrán modificado (contenido, por lo que sha1 no coincide con los archivos originales)
  • pegado a una versión específica (versión jailbreakable)

Solo verificar la existencia de archivos para detectar jailbreak está condenado al fracaso. Estas comprobaciones son fáciles de omitir.

Algunos archivos comunes para verificar: /Library/MobileSubstrate/MobileSubstrate.dylib

/Applications/Cydia.app

/var/cache/apt

/var/lib/apt

/var/lib/cydia

/var/log/syslog

/var/tmp/cydia.log

/bin/bash

/bin/sh

/usr/sbin/sshd

/usr/libexec/ssh-keysign

/etc/ssh/sshd_config

/etc/apt

La mayoría busca archivos relacionados con Cydia.

Sugeriría buscar archivos que no están presentes en un " vanilla " iPhone Todos los kits de jailbreak que he visto instalan ssh. Ese podría ser un buen indicador de un teléfono con jailbreak.

Lo que hicimos es que ya tenemos una fuente RSS para comunicarnos con nuestros usuarios ( Stocks Live ), ponemos una noticia que dice algo como esto:

  

Algunos dispositivos con jailbreak tienen problemas bla bla bla, hicimos un truco para resolver esos problemas, pero necesitamos saber si es un dispositivo con jailbreak o no, presione aquí para que la aplicación solucione el problema. Si alguna vez vuelve a la normalidad, es decir, eliminó el jailbreak, presione aquí.

Luego procesas la interacción del usuario y haces lo que es apropiado, como comportarte diferente, etc. ...

Intenta encontrar un archivo creado por Cydia o un dispositivo con jailbreak. O intente escribir en un archivo fuera de la caja negra de la aplicación. Si logra hacerlo, el dispositivo está comprometido / con jailbreak :)

- (BOOL)jailbroken
{
    NSFileManager * fileManager = [NSFileManager defaultManager];
    return [fileManager fileExistsAtPath:@"/private/var/lib/apt/"];
}

Vas a seguir un objetivo en movimiento, pero puedes intentar seguir el progreso de estos recursos para ver qué tan efectiva es tu técnica:

Aquí están mis soluciones:

extension UIDevice {
    func isJailBroken() -> Bool {
        var jailBroken = false
        let cydiaPath = "/Applications/Cydia.app"
        let aptPath = "/private/var/lib/apt/"
        if FileManager.default.fileExists(atPath: cydiaPath) {
            jailBroken = true
        }
        if FileManager.default.fileExists(atPath: aptPath) {
            jailBroken = true
        }
        return jailBroken
    }
}

y llámelo dentro de viewDidLoad () dentro de su controlador de vista de pantalla de inicio (o cualquier VC que esté llamando por primera vez):

    if UIDevice.current.isJailBroken() {
       // show a blank screen or some other view controller
       let jailbreakVC = JailBrokenViewController()
       self.navigationController?.present(jailbreakVC, animated: true, completion:nil)
    } else {
     // continue executing your next View controller
     let nextVC = NextViewController()
     self.navigationController?.present(nextVC, animated: true, completion:nil)
    }

Intenta acceder a /Application/Preferences.app/General.plist Deberías poder hacerlo en un iPhone con jailbreak En un teléfono que no sea Jb, no podrás acceder a él

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top