Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何检测应用程序正在越狱设备上运行?_Ios_Iphone_Ipad_Jailbreak - Fatal编程技术网

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

Ios 如何检测应用程序正在越狱设备上运行?,ios,iphone,ipad,jailbreak,Ios,Iphone,Ipad,Jailbreak,我刚刚发布了我的iOS应用程序,但我不知道如何确保我的应用程序不被越狱者使用 我可以采取措施防止我的应用程序在越狱设备上运行吗?你可以通过代码检测应用程序是否在越狱设备上运行。通过这种方式,您可以弹出警报并关闭应用程序。你可以做你想做的任何事。以下是有关它的教程: 这是一个堆栈溢出帖子: 另外,如果您想要一个完整的解决方案,您可以在tapjoy sdk代码中看到。他们正在检测越狱的iPhone。这里是tapjoy URL,请尝试查找cydia或越狱设备创建的文件。或者尝试在应用程序黑盒外的文

我刚刚发布了我的iOS应用程序,但我不知道如何确保我的应用程序不被越狱者使用


我可以采取措施防止我的应用程序在越狱设备上运行吗?

你可以通过代码检测应用程序是否在越狱设备上运行。通过这种方式,您可以弹出警报并关闭应用程序。你可以做你想做的任何事。以下是有关它的教程:

这是一个堆栈溢出帖子:


另外,如果您想要一个完整的解决方案,您可以在tapjoy sdk代码中看到。他们正在检测越狱的iPhone。这里是tapjoy URL,请尝试查找cydia或越狱设备创建的文件。或者尝试在应用程序黑盒外的文件中写入。如果您成功地做到了这一点,则设备已被破坏/越狱:)


即使您的设备被越狱,ipa应用程序也只能访问自己的沙盒,所以 如果设备已越狱或未越狱,您的方法将返回否:) 另寻出路
此外,如果您试图访问某个地方,但appstore上的沙盒发布应用程序可能会出现问题

,您可以通过检查以下内容来检测设备是否被越狱

  • Cydia已安装
  • 验证某些系统路径
  • 可以执行沙盒完整性检查
  • 执行符号链接验证
  • 验证是否在沙盒外部创建和写入文件

  • 这里是我从各种文章和书籍中创建的,请尝试一下

    找到越狱设备的方法有很多。如果熟练的黑客更改应用程序路径,检查cydia technic将不起作用

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

    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];
     }
    
    在下面的url中找到更多技术

    检查这些路径

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

    此外,您还可以根据@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
    }
    

    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
        }
    

    无法检测设备是否越狱

    考虑到即使有,设备已经被越狱,这意味着任意代码执行是可能的,越狱者只会修改任何检测方法,你会用它来表示设备没有被越狱

    参考:


    感谢回答同样问题的苹果员工

    应用程序不是越狱的——iPhone和iPad是。没有神奇的方法让应用程序成为盗版的证据。一方面,这个问题的标题在语法上做得很糟糕,所以我不知道你在问什么。我是否可以建议将其改为“如何防止我的应用程序在越狱设备上运行?”?关于这个问题,拉胡尔·维亚斯的回答很好。你可能还想找到一种方法,每次在越狱设备上打开你的应用程序时都能联系苹果。除了糟糕的语法之外,我不认为攻击他的语法或说“应用程序不是越狱的”和“没有神奇的方法让应用程序防盗版”之类的尖刻评论。有时,人们不太懂英语。放手吧:\@user529758越狱本身不是盗版。无论如何,大多数越狱都是针对盗版的,这也是事实。我只是想对你的回答表示感谢,我将把它作为书签,因为我将进入iOS开发,很高兴知道这一点@user691859谢谢你的书签。谢谢@RahulVyas;这将有助于我领导ios开发项目团队。你的else条款毫无意义。如果没有错误,则需要删除该文件。errnoIt是Unix系统中的一个全局变量,可用于检查与系统调用(如打开文件等)相关的错误。如果要使用它,请包含errno.h。只需返回fileManager.fileExistsAtPath(“/private/var/lib/apt”)更新的链接:
    /**
         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
        }
    
    func hasJailbreak() -> Bool {
            #if arch(i386) || arch(x86_64)
                print("Simulator")
                return false
            #else
                return FileManager.default.fileExistsAtPath("/private/var/lib/apt")
            #endif
        }
    
    /**
         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
        }