iOS开发判断手机是否越狱

本文中主要整理介绍三种亲测好用的检测越狱的方式

1.通过越狱后增加的越狱文件判断

判断这些文件是否存在,让文件添加到数组中,遍历数组,如果存在任何一个文件,就认为是越狱了

- (BOOL)isJailBreak {
    NSArray *jailbreak_tool_paths = @[
        @"/Applications/Cydia.app",
        @"/Library/MobileSubstrate/MobileSubstrate.dylib",
        @"/bin/bash",
        @"/usr/sbin/sshd",
        @"/etc/apt"
    ];
    for (int i=0; i

2.是否能打开cydia这个协议头

- (BOOL)isJailBreak {
    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://"]]) {
        NSLog(@"The device is jail broken!");
        return YES;
    }
    NSLog(@"The device is NOT jail broken!");
    return NO;
}
IMG_6999.PNG

前两种方式检测的代码通过越狱的手机通过安装上面这个插件开启屏蔽检测就能轻松绕过,而下面第三种方法测试开启后无法绕过,所以更推荐第三种。

3.越狱后的手机是可以获取到手机内安装的所有应用程序的,如果可以获取到就说明越狱了

- (BOOL)isJailBreak {
    if ([[NSFileManager defaultManager] fileExistsAtPath:@"User/Applications/"]) {
        NSLog(@"The device is jail broken!");
        NSArray *appList = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"User/Applications/" error:nil];
        NSLog(@"appList = %@", appList);
        return YES;
    }
    NSLog(@"The device is NOT jail broken!");
    return NO;
}

真正使用的时候,为了保证判断的准确性,可以3种方法结合起来判断,只要有一个方法返回yes,就认为是越狱。然后就可以进行 exit(0); 操作。

当然了,攻击者可以直接通过替换系统的fileExistsAtPath函数,让他一直返回false,从而绕过软件路径的检测。这时候就需要一些C语言的函数去做更加精确的检测。
虽然这里用到的是C语言检测函数,但这些函数被hook的可能性也是存在的,比如fishhook。。
如果真有大佬手动hook这些函数或者直接修改二进制的话,那也没啥好防的,大佬们随便吧。。

所以也印证了那句话:没有绝对的安全,你唯一能做的就是拖延攻击者的脚步。

对于这些函数,不建议单独写方法,容易被hook掉,所以最好是写在不能被hook的函数里,比如

application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

谁TM会hook程序的初始化函数。。

另外越狱检测函数最好不要出现Jailbreak,或者canijailbreak,或者AntiJailbreak这种字段,很容易被定位到。

你可能感兴趣的:(iOS开发判断手机是否越狱)