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

问题描述 投票:48回答:11

这个问题在这里已有答案:

我刚刚发布了我的iOS应用程序,但我不确定如何让我的应用程序安全不被jailbrakers使用。

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

ios iphone ipad jailbreak
11个回答
48
投票

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

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/


0
投票

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
    }

0
投票

没有办法检测设备是否已越狱。

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

参考:https://forums.developer.apple.com/thread/43073

学分回到Apple员工那里回答了同样的问题


6
投票

检查这些路径

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


5
投票

尝试找到cydia或越狱设备创建的文件。或者尝试在应用程序的黑盒子外写一个文件。如果你成功了,那么该设备会遭到入侵/越狱:)

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

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
}

4
投票

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

  1. Cydia已安装
  2. 验证一些系统路径
  3. 可以执行沙箱完整性检查
  4. 执行符号链接验证
  5. 验证您是否在沙箱外创建和写入文件

我从各种文章和书籍中创建了an open source library,试一试。


4
投票

基于@ karim的回答继承了一个稍微修改过的快速版本:

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
}

2
投票

即使你的设备被越狱,ipa应用程序也只能访问他们自己的沙盒,所以如果设备要么越狱,你的方法将返回NO :)寻找另一种方式另外如果你尝试访问某个地方,但你的沙盒发布应用程序appstore可能会遇到问题


2
投票
/**
     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
    }

0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.