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é.
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é:
@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 :)
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:
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é.
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_SIMULATORreturn 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}
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 !
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.
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.
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é.
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.
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é :)
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 devicesifFileManager.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")!){returntrue}// 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 jailbrokenreturntrue}catch{returnfalse}}else{returnfalse}}
É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 controllerlet viewController =UIDevice.current.isJailBroken()?JailBrokenViewController():NextViewController()self.navigationController?.present(viewController, animated:true, completion:nil)
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
Réponses:
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
Pour les noyaux piratés, c'est un peu (beaucoup) plus compliqué.
la source
fileExistsAtPath:
et le faire revenirNO
pour le chemin spécifique que vous vérifiez.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é:
la source
isJailbroken
La vérification du chemin du fichier
/Applications/Cydia.app
n'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:
la source
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é.
la source
la source
Vous pouvez détecter si un appareil est JailBroken ou non en vérifiant les éléments suivants:
Il existe une bibliothèque open source que j'ai créée à partir de divers articles et livres. Essayez-le sur GitHub !
la source
J'ai retravaillé dans Swift 2.3 la solution fournie par @Yossi
la source
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.la source
deb
fichier de MobileSubstrate, le décompresser et la liste noire (presque) tout.dylib
est emballé.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.
la source
Essayez d'exécuter du code non signé via votre application.
Un appareil jailbreaké a généralement les caractéristiques suivantes:
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.
la source
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.
la source
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é.
la source
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:
Ensuite, vous traitez l'interaction de l'utilisateur et faites ce qui est approprié, comme un comportement différent, etc.
la source
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é :)
la source
Veuillez utiliser le code suivant pour Swift 4 et supérieur: Ajoutez le code suivant dans l'appdelegate:
func applicationDidBecomeActive (_ application: UIApplication) {
la source
Voici mes solutions: Étape 1
É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):la source
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
la source