web-dev-qa-db-fra.com

Comment détecter que l'application est en cours d'exécution sur un appareil jailbreaké?

Je viens de publier mon application pour iOS, mais je ne suis pas sûr de savoir comment protéger mon application des jailbrakers. 

Puis-je faire quelque chose pour empêcher mon application de fonctionner sur des appareils jailbreakés?

47
R. Dewi

Vous pouvez détecter via le code que si l'application est exécutée sur un périphérique jail cassé ou non. De cette façon, vous pouvez afficher une alerte et fermer l'application. Vous pouvez faire ce que vous voulez faire. Voici un tutoriel pour cela:

http://thwart-ipa-cracks.blogspot.com/2008/11/detection.html

et voici un post Stack Overflow:

Comment détecter une application iOS en cours d'exécution sur un téléphone jailbreaké?

De plus, si vous voulez une solution complète, vous pouvez voir dans le code de Tapjoy SDK. Ils détectent un iPhone jailbreaké. Voici tapjoy URL https://www.tapjoy.com/

46
Rahul Vyas

Vérifiez ces chemins

+ (BOOL)isJailBroken {
#ifdef TARGET_IPHONE_SIMULATOR
    return NO;
#endif

    NSArray *paths = @[@"/bin/bash",
                       @"/usr/sbin/sshd",
                       @"/etc/apt",
                       @"/private/var/lib/apt/",
                       @"/Applications/Cydia.app",
                       ];

    for (NSString *path in paths) {
        if ([self fileExistsAtPath:path]) {
            return YES;
        }
    }

    return NO;
}


+ (BOOL)fileExistsAtPath:(NSString *)path {
    FILE *pFile;
    pFile = fopen([path cStringUsingEncoding:[NSString defaultCStringEncoding]], "r");
    if (pFile == NULL) {
        return NO;
    }
    else
        fclose(pFile);
    return YES;
}

En outre, vous pouvez consulter https://github.com/OneSignal/OneSignal-iOS-SDK/blob/master/iOS_SDK/OneSignalJailbreakDettection/OneSignalJailbreakDetection.m

6
onmyway133

Essayez de trouver un fichier créé par cydia ou un périphérique jailbreaké. Ou essayez d'écrire dans un fichier en dehors de la boîte noire de l'application. Si vous réussissez à faire cela, l'appareil est compromis/jailbreaké :)

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

Basé sur la réponse de @ karim, voici une version légèrement modifiée de Swift:

func hasJailbreak() -> Bool {
    #if Arch(i386) || Arch(x86_64)
        println("Simulator")
        return false    
    #else
        var fileManager = NSFileManager.defaultManager()
        if(fileManager.fileExistsAtPath("/private/var/lib/apt")) {
            println("Jailbroken Device")
            return true
        } else {
            println("Clean Device")
            return false
        }
    #endif
}
4
inVINCEable
-(BOOL) isJailbroken
{
#if TARGET_IPHONE_SIMULATOR
return NO;
#else
FILE *f = fopen("/bin/bash", "r");
if (errno == ENOENT)
{
    // device is NOT jailbroken
    fclose(f);
    NSLog(@"no");
    return NO;
}
else {
    // device IS jailbroken
    fclose(f);
    NSLog(@"yes");
    return YES;

}
#endif
}
4
sinh99

Vous pouvez détecter si un périphérique est jailBroken ou non en vérifiant les points suivants:

  1. Cydia est installé
  2. Vérifier certains des chemins du système
  3. Peut effectuer un contrôle d'intégrité du bac à sable
  4. Effectuer la vérification des liens symboliques
  5. Vérifiez si vous créez et écrivez des fichiers en dehors de votre bac à sable

Il y a une bibliothèque open source J'ai créé à partir de divers articles et livres, essayez-le. 

3
user3088680

Même si votre appareil est jailbreaké, les applications ipa peuvent uniquement accéder à leurs propres bacs à sable, donc Si l'appareil est jailbreaké ou non, votre méthode retournera NO:) Recherchez une autre méthode Aussi, si vous essayez accéder quelque part, mais votre application de publication sandbox sur l'Appstore risque de poser des problèmes

2
user1846654
/**
     Detect that the app is running on a jailbroken device or not

     - returns: bool value for jailbroken device or not
     */
    public class func isDeviceJailbroken() -> Bool {
        #if Arch(i386) || Arch(x86_64)
            return false
        #else
            let fileManager = FileManager.default

            if (fileManager.fileExists(atPath: "/bin/bash") ||
                fileManager.fileExists(atPath: "/usr/sbin/sshd") ||
                fileManager.fileExists(atPath: "/etc/apt")) ||
                fileManager.fileExists(atPath: "/private/var/lib/apt/") ||
                fileManager.fileExists(atPath: "/Applications/Cydia.app") ||
                fileManager.fileExists(atPath: "/Library/MobileSubstrate/MobileSubstrate.dylib") {
                return true
            } else {
                return false
            }
        #endif
    }
1
CrazyPro007

Il existe de nombreuses façons de trouver les appareils jailbreakés. vérifier la technique de cydia ne fonctionnera pas si un pirate qualifié modifie le chemin de l’application.

Un bon moyen de vérifier cela serait de voir si nous pouvons modifier un fichier ailleurs que dans l'application.

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

Trouvez plus de techniques dans l'URL ci-dessous

http://highaltitudehacks.com/2013/12/17/ios-application-security-part-24-jailbreak-detection-and-evasion/

0
Boobalan

Il n'y a aucun moyen de détecter si le périphérique est jailbreaké.

Considérez que même s'il y en avait un, le périphérique a déjà été jailbreaké, ce qui signifie qu'une exécution de code arbitraire est possible, et le jailbreaker ne ferait que modifier la méthode de détection utilisée pour signaler que le périphérique n'a pas été jailbreaké.

référence: https://forums.developer.Apple.com/thread/43073

crédits vont au personnel Apple qui a répondu à la même question

0
igrek

Swift 3:  

func hasJailbreak() -> Bool {
        #if Arch(i386) || Arch(x86_64)
            print("Simulator")
            return false
        #else
            return FileManager.default.fileExistsAtPath("/private/var/lib/apt")
        #endif
    }
0
Maksim Kniazev