如何检测应用程序是否在越狱设备上运行?

我刚刚发布了我的应用程序的iOS,但我不知道如何使我的应用程序安全的jailbrakers使用。

我可以做些什么来阻止我的应用程序在越狱设备上工作吗?

您可以通过代码检测,如果应用程序在监狱设备上运行或没有。 通过这种方式,你可以popup一个提醒,closures应用程序。 你可以做任何你想做的事情。 这里是一个教程:

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

这里是一个堆栈溢出post:

如何检测iOS应用程序是否在越狱手机上运行?

另外,如果你想要一个完整的解决scheme,你可以在tapjoy sdk代码中看到。 他们正在检测越狱的iPhone。 这里是tapjoyurlhttps://www.tapjoy.com/

尝试find一个cydia或越狱设备创build的文件。 或者尝试在应用程序黑盒外的文件中写入。 如果你成功做到这一点,该设备是妥协/ jailbroken 🙂

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

基于@ karim的答案inheritance人一个稍作修改的迅捷版本:

 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 } 

您可以通过检查以下内容来检测设备是否被监禁

  1. Cydia被安装
  2. validation一些系统path
  3. 可以执行沙盒完整性检查
  4. 执行符号链接validation
  5. validation您是否在Sandbox之外创build和写入文件

有一个我从各种文章和书籍创build的开源库 ,试试看。

检查这些path

 + (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; } 

此外,你可以看看https://github.com/OneSignal/OneSignal-iOS-SDK/blob/master/iOS_SDK/OneSignalJailbreakDettection/OneSignalJailbreakDetection.m

即使你的设备是越狱,Ipa应用程序只能访问自己的沙盒,所以如果设备是越狱或不是你的方法将返回NO :)寻找另一种方式如果你尝试访问的地方,但沙箱出版应用程序appstore可能会遇到问题

有很多方法可以find越狱设备。 如果技术娴熟的黑客改变应用程序path,检查cydia技术将不会工作。

检查它的一个好方法是查看我们是否可以在应用程序包之外的其他位置修改文件。

 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]; } 

在下面的urlfind更多的技术

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

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 }