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

60

我刚发布了我的iOS应用程序,但我不确定如何使我的应用程序免受越狱的影响。

我能做些什么来防止我的应用在越狱设备上运行?


3
应用程序没有越狱——iPhone和iPad会被越狱。 - Michael Petrotta
没有什么神奇的方法可以使应用程序免于盗版。否则,应用程序盗版就不会存在。 - zneak
感谢您的所有评论,我正在考虑让我的应用程序无法在越狱设备上运行。 - R. Dewi
45
除了糟糕的语法之外,我认为攻击他的语法或说出类似“应用程序没有越狱”和“没有神奇的方法使应用程序防盗版”的挖苦评论是不必要的。有时候,人们并不精通英语。请宽容些:\ - 2rs2ts
2
@user529758 越狱本身并不等同于盗版。但是事实上,大多数越狱都是为了进行盗版行为。 - eonil
显示剩余3条评论
11个回答

56

您可以通过代码检测应用是否在越狱设备上运行。通过这种方式,您可以弹出警报并关闭应用程序。您可以按照以下教程进行操作:

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

另外,以下是一个 Stack Overflow 帖子:

How do I detect that an iOS app is running on a jailbroken phone?

如果您想获得完整的解决方案,您可以查看 Tapjoy SDK 代码。他们正在检测越狱的 iPhone。以下是 Tapjoy 的网址:https://www.tapjoy.com/


2
只是想说谢谢你的好答案,我会把它加入书签,因为我将要进入iOS开发领域,这对我很有帮助! - 2rs2ts
谢谢@RahulVyas;这将有助于我领导我的iOS开发项目团队。 - Naved

10

检查这些路径

+ (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/OneSignalSDK/Source/OneSignalJailbreakDetection.m


1
更新的链接:https://github.com/OneSignal/OneSignal-iOS-SDK/blob/master/iOS_SDK/OneSignalSDK/Source/OneSignalJailbreakDetection.m - Deryck Lucian

5
/**
     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
    }

5

尝试查找由Cydia或越狱设备创建的文件。或者尝试在应用程序黑盒之外的文件中写入内容。如果您成功做到这一点,则设备已被破解/越狱 :)

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

4

基于@karim的回答,这是一个稍微修改过的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
}

4
请返回 fileManager.fileExistsAtPath("/private/var/lib/apt")。 - Yaroslav Dukal

4
-(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
}

什么是errno? - Amr Angry
这是Unix系统中的全局变量,您可以使用它来检查与系统调用(如打开文件等)相关的错误。如果要使用它,请包含errno.h。 - bompf

4
您可以通过以下方式检测设备是否越狱:
  1. 检查Cydia是否已安装
  2. 验证一些系统路径
  3. 进行沙盒完整性检查
  4. 执行符号链接验证
  5. 验证是否在您的沙箱外创建和写入文件
此外,您可以尝试使用我创建的开源库,该库整合了多篇文章和书籍中的技术。

2
即使您的设备越狱了,ipa应用程序也只能访问它们自己的沙盒,所以无论设备是否越狱,您的方法都将返回NO :) 找另一种方法。另外,如果您尝试访问某个地方但您的沙盒发布应用在App Store上可能会出现问题。

2

无法检测设备是否越狱。

即使有方法,设备已经越狱,意味着可以执行任意代码,而越狱者会修改您使用的任何检测方法,以信号表明设备未被越狱。

reference: https://forums.developer.apple.com/thread/43073

感谢回答这个问题的苹果员工们。


1

有许多方法可以找到越狱设备。如果技术熟练的黑客更改了应用程序路径,检查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];
 }

在下面的链接中找到更多的技术

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


9
你的else子句没有意义。如果没有错误,你需要删除文件。 - Legoless

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接