本文中主要整理介绍三种亲测好用的检测越狱的方式
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<jailbreak_tool_paths.count; i++) {
if ([[NSFileManager defaultManager] fileExistsAtPath:jailbreak_tool_paths[i]]) {
NSLog(@"The device is jail broken!");
return YES;
}
}
NSLog(@"The device is NOT jail broken!");
return NO;
}
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;
}
前两种方式检测的代码通过越狱的手机通过安装上面👆这个插件开启屏蔽检测就能轻松绕过,而下面👇第三种方法测试开启后无法绕过,所以更推荐第三种。
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这种字段,很容易被定位到。