iOS调试检测及越狱检测
if ([self isJailBreak] || [self isJailBreak2] || [self isJailBreak3]) {
[SVProgressHUD showInfoWithStatus:@"该设备已越狱,请谨慎使用!"];
[self performSelector:@selector(dismiss) withObject:nil afterDelay:1.5f];
}
[self checkDebuggerAction];
[NSTimer scheduledTimerWithTimeInterval:60 target:self selector:@selector(checkDebuggerAction) userInfo:nil repeats:YES];
/*******************************************越狱检测防范****************************************/
-(void)checkDebuggerAction{
if (checkDebugger()) {
exit(0);
}
}
bool checkDebugger(){
//控制码
int name[4];//放字节码-查询信息
name[0] = CTL_KERN;//内核查看
name[1] = KERN_PROC;//查询进程
name[2] = KERN_PROC_PID; //通过进程id查进程
name[3] = getpid();//拿到自己进程的id
//查询结果
struct kinfo_proc info;//进程查询信息结果
size_t info_size = sizeof(info);//结构体大小
int error = sysctl(name, sizeof(name)/sizeof(*name), &info, &info_size, 0, 0);
assert(error == 0);//0就是没有错误
//结果解析 p_flag的第12位为1就是有调试
//p_flag 与 P_TRACED =0 就是有调试
return ((info.kp_proc.p_flag & P_TRACED) !=0);
}
- (BOOL)isJailBreak
{
for (int i=0; i<ARRAY_SIZE(jailbreak_tool_pathes); i++) {
if ([[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithUTF8String:jailbreak_tool_pathes[i]]]) {
NSLog(@"The device is jail broken!");
return YES;
}
}
NSLog(@"The device is NOT jail broken!");
return NO;
}
- (BOOL)isJailBreak2
{
if ([[NSFileManager defaultManager] fileExistsAtPath:USER_APP_PATH]) {
NSLog(@"The device is jail broken!");
NSArray *applist = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:USER_APP_PATH error:nil];
NSLog(@"applist = %@", applist);
return YES;
}
NSLog(@"The device is NOT jail broken!");
return NO;
}
- (BOOL)isJailBreak3
{
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://"]]) {
NSLog(@"The device is jail broken!");
return YES;
}
NSLog(@"The device is NOT jail broken!");
return NO;
}