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

如果我希望我的应用程序在越狱的iPhone上performance不同,那么我将如何去确定这一点?

这取决于你的越狱意味着什么。 在简单的情况下,你应该能够看到是否安装了Cydia,并按照这种方式进行操作

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

对于被黑客入侵的内核来说,这个过程有点(很多)。

检查内核是否被破坏并不是那么重要。

越狱使签名代码的内核签名检查始终报告代码签名正确,未中断的电话不能运行具有不良签名的代码。

所以,在应用程序中包含一个单独的可执行文件,签名不好。 它可能只是一个具有main()和一个返回值的三行程序。 在没有代码签名的情况下编译可执行文件(在“项目设置” – >“生成”中将其closures),并使用“codesign”命令行实用程序使用不同的密钥对其进行签名。

让您的应用程序执行独立的可执行文 如果你的程序在运行带有坏信号的独立可执行文件的时候无法获得返回值,那肯定会被监禁。 如果单独的可执行文件返回A – 确定,手机肯定是越狱。

 +(BOOL)isJailbroken { NSURL* url = [NSURL URLWithString:@"cydia://package/com.example.package"]; return [[UIApplication sharedApplication] canOpenURL:url]; } 

在普通电话上不允许检查文件path/Applications/Cydia.app ? 我从来没有听说过苹果检测到这一点,并拒绝一个应用程序,但苹果是不可预知的。 Cydia有一个URLschemecydia://可以用UIApplication canOpenURL:合法地检查canOpenURL:

这是一个代码,结合了我为这个主题find的一些答案,并会给你更高的成功率:

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

您可以通过检查以下内容来检测设备是否为JailBroken:

  • Cydia被安装
  • validation一些系统path
  • 执行沙箱完整性检查
  • 执行符号链接validation
  • validation您是否在Sandbox之外创build和写入文件

有一个我从各种文章和书籍创build的开源库。 在GitHub上试试吧 !

我在Swift 2.3中修改了@Yossi提供的解决scheme

 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 } 

我知道的最复杂的方法是使用objc_copyImageNames()函数。 它返回一个当前加载的库列表,由于大多数人在越狱设备上都有MobileSubstrate,大多数iAP破解工具都依赖于它,所以至less会出现一些MobileSubstrate库。

我build议寻找“香草”iPhone上不存在的文件。 我见过的所有越狱工具包安装ssh。 这可能是越狱手机的一个很好的指标。

我们所做的是,我们已经有一个RSS源与我们的用户进行交stream( Stocks Live ),我们把一个新闻项目这样说:

一些越狱设备有问题,我们做了一个黑客解决这些问题,但我们需要知道,如果这是一个越狱设备,按这里,所以应用程序修复这个问题。 如果你恢复正常,即删除越狱,请按这里。

然后你处理用户交互,并做适当的行为,如performance不同等…

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

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

尝试通过应用程序执行未签名的代码。

越狱设备通常具有以下特征:

  • 运行未签名的代码
  • 已经安装了Cydia
  • 有越狱文件
  • 完整的r / w访问整个文件系统
  • 一些系统文件将被修改(内容,所以sha1与原始文件不匹配)
  • 坚持特定版本(越狱版)

只是检查文件的存在越狱检测注定要失败。 这些检查很容易绕过。

我不知道有任何“API”存在。 如果有的话,那么一个越狱屏蔽产品会很快覆盖它们。

很多人指出,这是一个猫捉老鼠的游戏。 在双方都成为专家之后,这一切都归结为谁是第一步。 (拿着设备的人)

我在Zdziarski的新书“Hacking and Securing iOS Apps”中发现了许多关于检测越狱的好build议。 (就我个人而言,我为O'Reilly电子书支付更多,因为它们允许复制和粘贴。)

不,我不隶属于出版商。 但我确实发现它是一本好书。 我不喜欢只发布黑客的错误,所以他们可以修复它们,所以我想我会指向这本书。

一些常见的文件来检查: /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

大多数检查Cydia相关的文件。

你将会追随一个不断变化的目标,但是你可以试着追踪这些资源的进展,看看你的技术是如何有效的:

尝试访问/Application/Preferences.app/General.plist你应该能够在越狱的iPhone上这样做在非Jb手机上,你将无法访问它