2009-01-05 303 views

回答

77

这取决于你的越狱意味着什么。在简单情况下,你应该能够看到是否安装Cydia的和由去 - 有点像

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

对于黑客攻击的内核,这是一个有点(很多)更多地参与。

+14

在沙箱外寻找_any_文件/目录不够吗?像/ etc一样? – 2009-08-01 04:53:02

+50

请注意,并非所有用户都安装了Cydia - 这不是一个很好的检查,而应该检查/ bin/bash/all/users /将会拥有的东西。 – 2010-02-21 07:03:21

+0

apt在哪里存储它的信息?或者我可以只调用一个system()命令并找出答案。我想知道他们是否有特定的应用程序,如果他们有这些应用程序,那么应该限制应用程序 – conradev 2010-03-06 20:16:31

3

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

+16

ssh永远不会自动安装,用户必须自行安装。 – 2010-02-21 07:03:50

+1

我没有真正跟上越狱现场。但是据我记得,当我写这个(2009年1月)时,Ziphone和其他人默认安装了ssh和bsd子系统。也许这不再是事实。 – 2010-03-04 06:06:01

+12

相信我,当我说chpwn跟上了越狱现场。 – 2011-07-14 00:45:02

48

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

越狱使内核对已签名代码的签名检查始终报告代码已正确签名,未中断的手机无法运行具有错误签名的代码。

因此,在应用程序中包含一个单独的可执行文件,签名不正确。它可能只是一个具有main()和返回值的3行程序。在没有代码签名的情况下编译可执行文件(在Project Settings-> Build中将其关闭),并使用“codesign”命令行工具使用不同的密钥对其进行签名。

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

18
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 
} 
2

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

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

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

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

-2

尝试访问/Application/Preferences.app/General.plist 你应该能够在越狱iPhone 在非JB电话做,你将无法访问它

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

在普通电话上不允许检查文件路径/Applications/Cydia.app?我从来没有听说过苹果检测到这一点,并拒绝为它的应用程序,但苹果是不可预知的。苹果蠹具有a URL scheme cydia://可与UIApplication的canOpenURL:

2

在法律上查了一下,我们所做的是,我们已经有一个RSS feed与我们的用户(Stocks Live)进行交流,我们把,指出这样的一条新闻:

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

然后你处理用户交互,做什么是适当的,喜欢表现不同等...

3

试图找到其中的Cydia越狱或设备创建一个文件。或者尝试在应用程序黑盒外的文件中写入。如果你成功做到这一点,该设备是妥协/越狱:)

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

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

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

  • 运行未签名代码
  • 有Cydia中安装
  • 有越狱文件
  • 全R/W访问整个文件系统
  • 一些系统文件将被修改(内容,所以sha1与原始文件不匹配)
  • 卡住sp (越狱版)

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

5

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

12

您可以检测设备是否越狱或不通过检查以下内容:

  • Cydia中安装
  • 验证系统的一些路径
  • 执行沙箱完整性检查
  • 执行符号链接验证
  • 验证您是否在Sandbox外部创建和写入文件

我从各种文章和书籍中创建了一个开源库。 Try it out on GitHub

44

这是结合了一些答案,我发现了这个话题的代码,并给你更高的成功率:

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

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

苹果蠹相关的文件大多数检查。

8

我在Swift 2.3中重做了@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 
} 
相关问题