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?
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/
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
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/"];
}
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
}
-(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
}
Vous pouvez détecter si un périphérique est jailBroken ou non en vérifiant les points suivants:
Il y a une bibliothèque open source J'ai créé à partir de divers articles et livres, essayez-le.
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
/**
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
}
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
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
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
}