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

Réponses:

90

Cela dépend de ce que vous entendez par jailbreak. Dans le cas simple, vous devriez pouvoir voir si Cydia est installé et passer par là - quelque chose comme

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

Pour les noyaux piratés, c'est un peu (beaucoup) plus compliqué.

sagequark
la source
17
Ne serait-il pas suffisant de rechercher un fichier / répertoire en dehors de votre bac à sable? Comme / etc?
Rhythmic Fistman
58
Notez que tous les utilisateurs n'ont pas installé Cydia - ce n'est pas une bonne vérification, et vous devriez plutôt vérifier quelque chose comme / bin / bash que / all / users / will / have.
Grant Paul
2
Où est-ce qu'apt stocke ses informations? Ou pourrais-je simplement appeler une commande system () et le découvrir. Je veux savoir s'ils ont certaines applications, et s'ils les ont, alors restreindre l'application
Conradev
2
@RazorSharp À ce stade, presque tous les utilisateurs ont Cydia. Il suffit probablement de vérifier cela maintenant. Cependant, si vous voulez une vérification fiable à 100%, vous voudrez utiliser une vérification basée sur le noyau comme ci-dessous.
Grant Paul
1
FWIW, les vérifications de fichiers sont faciles à contourner. On peut utiliser le support mobile pour accrocher fileExistsAtPath:et le faire revenir NOpour le chemin spécifique que vous vérifiez.
toasted_flakes
56

C'est un code qui combine quelques réponses que j'ai trouvées pour ce besoin, et vous donnera un taux de réussite beaucoup plus élevé:

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;
}
Yossi
la source
1
@Porizm, ce n'est qu'une combinaison de quelques réponses que j'ai trouvées. Certains d'entre eux n'ont pas fonctionné pour moi, mais ont fonctionné pour d'autres .. donc avec ce code, vous ne prenez pas de risques. Si vous l'utilisez, vous pouvez être sûr à 99%. En ce qui concerne les performances, vous ne pouvez l'exécuter qu'une seule fois à chaque exécution et enregistrer la réponse quelque part, vous n'avez pas à l'exécuter à chaque fois ..
Yossi
3
@yossi et porizm apple ont approuvé votre application contenant le code ci-dessus? Veuillez répondre
karthikPrabhu Alagu
4
Cette méthode doit être une fonction C intégrée, et non Objective-C. Il est trop facile de découvrir et de contourner les méthodes Objective-C, surtout si vous l'appelezisJailbroken
progrmr
2
@Yossi couvre-t-il les appareils jailbreakés avec Taig?
Lakshay
3
@Lakshay je ne sais pas .. Vous êtes plus qu'invité à vérifier et à ajouter ici une réponse :)
Yossi
54
+(BOOL)isJailbroken {
    NSURL* url = [NSURL URLWithString:@"cydia://package/com.example.package"];
    return [[UIApplication sharedApplication] canOpenURL:url];
}

La vérification du chemin du fichier /Applications/Cydia.appn'est pas autorisée sur un téléphone normal? Je n'ai jamais entendu parler d'Apple détectant cela et rejetant une application pour cela, mais Apple est imprévisible. Cydia a un schéma d'URL cydia: // qui peut être vérifié légalement avec UIApplicationcanOpenURL:

Mark Johnson
la source
1
C'est un excellent moyen de vérifier, et cela ne sort pas de votre bac à sable. Bien sûr, si le jailbreaker n'a pas installé Cydia, il retournera NON, mais je pense que la plupart des Jailbreaks installent Cydia.
Wim Haanstra
cette chaîne ne peut-elle pas être modifiée lorsque l'application est fissurée?
NSRover
8
Pour iOS9.0 +, vous devez également ajouter la clé LSApplicationQueriesSchemes dans app plist. Sinon, canOpenURL retournera toujours false.
David V
1
Cela fournira un faux positif si l'utilisateur a installé une application conforme au schéma cydia: // comme InstantTV.
thattyson
@thattyson merci! Je cherchais à vérifier pourquoi je
recevais des
52

Vérifier si le noyau est cassé n'est pas tellement plus compliqué.

Le jailbreaking fait que la vérification de la signature du noyau du code signé signale toujours que le code est signé correctement, les téléphones ininterrompus ne peuvent pas exécuter de code avec une mauvaise signature.

Donc, incluez un exécutable séparé dans l'application avec une mauvaise signature. Ce pourrait être juste un programme de 3 lignes qui a main () et une valeur de retour. Compilez l'exécutable sans signature de code (désactivez-le dans Paramètres du projet-> Construire) et signez-le avec une clé différente à l'aide de l'utilitaire de ligne de commande "codesign".

Demandez à votre application d'exécuter l'exécutable séparé. Si votre programme ne peut pas obtenir la valeur de retour lors de l'exécution de l'exécutable séparé avec le mauvais sig, il est définitivement emprisonné. Si l'exécutable séparé renvoie A-OK, le téléphone est définitivement jailbreaké.

GregH
la source
13
Pouvez-vous obtenir un (sous-) exécutable dont la signature n'est pas valide comme ça via l'App Store?
fbrereto
34
Peut-être que les choses ont changé, mais l'exécution d'un exécutable séparé ne vous empêcherait-elle pas d'être approuvé dans l'App Store?
Peter Zich le
4
Quelqu'un peut-il répondre aux commentaires précédents? Ce sont des questions importantes.
Petr
Personne ne va vraiment vous empêcher d'écrire un Mach-O sur un disque avec une signature invalide. Cependant, je ne suis pas d'accord avec la réponse selon laquelle vérifier que le noyau est cassé n'est pas impliqué ou qu'il s'agit d'une vérification définitive par tous les moyens.
saagarjha le
20
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
}
Richard J. Ross III
la source
C'est une bonne solution, mais xCon et d'autres outils comme celui-ci peuvent facilement contourner cette vérification. Alors, je cherche une meilleure solution.
Alexei Robsky
7
@AlexeiRobsky il n'y a pas de solution parfaite. Il y aura toujours quelqu'un qui trouvera un moyen de contourner votre protection, c'est juste un fait.
Richard J.Ross III
14

Vous pouvez détecter si un appareil est JailBroken ou non en vérifiant les éléments suivants:

  • Cydia est installé
  • Vérifiez certains des chemins du système
  • Effectuer une vérification de l'intégrité du bac à sable
  • Effectuer la vérification du lien symbolique
  • Vérifiez si vous créez et écrivez des fichiers en dehors de votre sandbox

Il existe une bibliothèque open source que j'ai créée à partir de divers articles et livres. Essayez-le sur GitHub !

user3088680
la source
14

J'ai retravaillé dans Swift 2.3 la solution fournie par @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
}
Alex Peda
la source
6

La méthode la plus sophistiquée que je connaisse utilise la objc_copyImageNames()fonction. Il renvoie une liste des bibliothèques actuellement chargées et comme la plupart des gens ont MobileSubstrate sur des appareils jailbreakés et que la plupart des outils de crack iAP en dépendent, au moins certaines bibliothèques MobileSubstrate apparaîtront.

Maxthon Chan
la source
Avez-vous des liens sur ce à quoi ressemblent les bibliothèques MobileSubstrate / CydiaSubstrate? Je n'ai pas de téléphone jailbreaké avec lequel jouer, alors je conduis "à l'aveugle" et les recherches Google aboutissent essentiellement à votre commentaire ci-dessus.
chadbag
@chadbag Je n'en ai pas non plus, mais vous pouvez chercher le debfichier de MobileSubstrate, le décompresser et la liste noire (presque) tout .dylibest emballé.
Maxthon Chan
Merci, j'ai trouvé du code et je pourrais ajouter d'autres choses en fonction de votre commentaire. Merci beaucoup!
chadbag
4

Je n'ai connaissance d'aucune "API" qui existe pour cela. S'il y en avait, alors un produit de masquage de jailbreak les couvrirait rapidement.

Comme beaucoup de gens le soulignent, c'est un jeu du chat et de la souris. Et une fois que les deux joueurs sont devenus des experts, tout dépend de qui obtient le premier coup. (Personne tenant l'appareil.)

J'ai trouvé de nombreuses bonnes suggestions pour détecter le jailbreak dans le nouveau livre de Zdziarski "Hacking and Securing iOS Apps". (Personnellement, j'ai payé plus cher le livre électronique O'Reilly car ils permettent le copier-coller.)

Non, je ne suis pas affilié aux éditeurs. Mais j'ai trouvé que c'était un bon livre. Je n'aime pas simplement publier les erreurs des hackers pour qu'ils puissent les corriger, alors j'ai pensé que je voudrais pointer vers le livre.

Vendeurs Walt
la source
4

Essayez d'exécuter du code non signé via votre application.

Un appareil jailbreaké a généralement les caractéristiques suivantes:

  • exécuter du code non signé
  • a installé Cydia
  • a des fichiers jailbreak
  • accès r / w complet à tout le système de fichiers
  • certains fichiers système auront été modifiés (le contenu et donc sha1 ne correspondent pas aux fichiers d'origine)
  • collé à une version spécifique (version jailbreakable)

Le simple fait de vérifier l'existence d'un fichier pour la détection de jailbreak est voué à l'échec. Ces contrôles sont faciles à contourner.

Kurapix
la source
3
Essayer d'exécuter du code non signé entraînerait le rejet de votre application de l'Appstore
Frederic Yesid Peña Sánchez
4

Quelques fichiers courants à vérifier: /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 plupart vérifient les fichiers liés à Cydia.

DevC
la source
3

Je suggère de rechercher des fichiers qui ne sont pas présents sur un iPhone «vanilla». Tous les kits de jailbreak que j'ai vus installent ssh. Cela pourrait être un bon indicateur d'un téléphone jailbreaké.

Gordon Wilson
la source
18
ssh n'est jamais installé automatiquement, les utilisateurs doivent l'installer eux-mêmes.
Grant Paul
1
Je n'ai pas vraiment suivi la scène du jailbreak. Mais si je me souviens bien, quand j'ai écrit ceci (janvier 09), Ziphone et d'autres ont installé ssh et le sous-système bsd par défaut. Ce n'est peut-être plus vrai.
Gordon Wilson
12
croyez-moi quand je dis que chpwn a suivi la scène du jailbreak.
Winfield Trail le
3

Ce que nous avons fait, c'est que nous avons déjà un flux RSS pour communiquer avec nos utilisateurs ( Stocks Live ), nous mettons une actualité qui énonce quelque chose comme ceci:

Certains appareils jailbreakés ont des problèmes bla bla bla, nous avons fait un hack pour résoudre ces problèmes, mais nous devons savoir s'il s'agit d'un appareil jailbreaké ou non, appuyez ici pour que l'application corrige le problème. Si jamais vous revenez à la normale, c'est-à-dire supprimez le jailbreak, appuyez ici.

Ensuite, vous traitez l'interaction de l'utilisateur et faites ce qui est approprié, comme un comportement différent, etc.

Ilam
la source
3

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

- (BOOL)jailbroken
{
    NSFileManager * fileManager = [NSFileManager defaultManager];
    return [fileManager fileExistsAtPath:@"/private/var/lib/apt/"];
}
Karim
la source
2
Apple a approuvé votre application contenant le code ci-dessus?
karthikPrabhu Alagu
3

Veuillez utiliser le code suivant pour Swift 4 et supérieur: Ajoutez le code suivant dans l'appdelegate:

private func getJailbrokenStatus() -> Bool {
    if TARGET_IPHONE_SIMULATOR != 1 {
        // Check 1 : existence of files that are common for jailbroken devices
        if FileManager.default.fileExists(atPath: "/Applications/Cydia.app")
            || FileManager.default.fileExists(atPath: "/Library/MobileSubstrate/MobileSubstrate.dylib")
            || FileManager.default.fileExists(atPath: "/bin/bash")
            || FileManager.default.fileExists(atPath: "/usr/sbin/sshd")
            || FileManager.default.fileExists(atPath: "/etc/apt")
            || FileManager.default.fileExists(atPath: "/private/var/lib/apt/")
            || UIApplication.shared.canOpenURL(URL(string:"cydia://package/com.example.package")!) {
            return true
        }
        // Check 2 : Reading and writing in system directories (sandbox violation)
        let stringToWrite = "Jailbreak Test"
        do {
            try stringToWrite.write(toFile:"/private/JailbreakTest.txt", atomically:true, encoding:String.Encoding.utf8)
            //Device is jailbroken
            return true
        } catch {
            return false
        }
    }
    else {
        return false
    }
}

func applicationDidBecomeActive (_ application: UIApplication) {

    if getJailbrokenStatus() {
        let alert = UIAlertController(title: LocalizedKeys.Errors.jailbreakError, message: LocalizedKeys.Errors.jailbreakErrorMessage, preferredStyle: UIAlertController.Style.alert)
        let jailBrokenView = UIViewController()

        jailBrokenView.view.frame = UIScreen.main.bounds
        jailBrokenView.view.backgroundColor = .white
        self.window?.rootViewController = jailBrokenView
        jailBrokenView.present(alert, animated: true, completion: nil)
    }

    if #available(iOS 11.0, *) {
        if !UIScreen.main.isCaptured {
            DispatchQueue.main.async {
                self.blockImageView.removeFromSuperview()
            }
        }
    }
}
Paritosh Pawar
la source
1

Voici mes solutions: Étape 1

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

Étape 2: Appelez-le à l' viewDidLoad()intérieur de votre contrôleur de vue d'écran de lancement (ou quel que soit le VC que vous appelez pour la première fois):

       // show a blank screen or some other view controller
       let viewController = UIDevice.current.isJailBroken() ? JailBrokenViewController() : NextViewController()
       self.navigationController?.present(viewController, animated: true, completion:nil)
Sanjeevcn
la source
-2

Essayez d'accéder à /Application/Preferences.app/General.plist Vous devriez pouvoir le faire sur un iPhone jailbreaké Sur un téléphone non Jb, vous ne pourrez pas y accéder

aker
la source
3
Cette réponse serait plus intéressante avec le code source. IMHO: Cela vous rapporterait un vote positif.
Johan Karlsson
5
-1 = Les appareils non bloqués peuvent également ouvrir et lire ce fichier. (Testé)
frankish
@JohanKarlsson Je suppose que les lecteurs ici peuvent écrire leur propre code source. S'ils ne peuvent pas - que font-ils ici?
gnasher729