苹果是非常看重产品的安全性的,所以给用户设计了一套复杂的安全机制。这让喜爱自由,崇尚一切开放的程序员们极度不爽,于是越狱就成了苹果和黑客们反复斗法的场所。总体来说,越狱可以让我们随意安装、共享应用,但确实也降低了设备的安全性,会给一些恶意应用提供方便之门。

有时我们的应用希望知道安装的设备是否已经越狱了,显然,苹果官方不会给出解决方案来的,那么我们怎么办呢?因为越狱后会自动安装cydia,所以我们可以从这方面入手;也可以借助权限问题,去读取应用的列表;还可以去读环境变量,不越狱的机器应该是读取不到任何内容的。

下面我们一个一个方法来讲:

1. 判定常见的越狱文件

/Applications/Cydia.app

/Library/MobileSubstrate/MobileSubstrate.dylib

/bin/bash

/usr/sbin/sshd

/etc/apt

这个表可以尽可能的列出来,然后判定是否存在,只要有存在的就可以认为机器是越狱了。

[objc]  view plain copy
  1. #define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0])
  2. const char* jailbreak_tool_pathes[] = {
  3. "/Applications/Cydia.app",
  4. "/Library/MobileSubstrate/MobileSubstrate.dylib",
  5. "/bin/bash",
  6. "/usr/sbin/sshd",
  7. "/etc/apt"
  8. };
  9. - (BOOL)isJailBreak
  10. {
  11. for (int i=0; i<ARRAY_SIZE(jailbreak_tool_pathes); i++) {
  12. if ([[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithUTF8String:jailbreak_tool_pathes[i]]]) {
  13. NSLog(@"The device is jail broken!");
  14. return YES;
  15. }
  16. }
  17. NSLog(@"The device is NOT jail broken!");
  18. return NO;
  19. }

2. 判断cydia的URL scheme

URL scheme是可以用来在应用中呼出另一个应用,是一个资源的路径(详见《iOS中如何呼出另一个应用》),这个方法也就是在判定是否存在cydia这个应用。

[objc]  view plain copy
  1. - (BOOL)isJailBreak
  2. {
  3. if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://"]]) {
  4. NSLog(@"The device is jail broken!");
  5. return YES;
  6. }
  7. NSLog(@"The device is NOT jail broken!");
  8. return NO;
  9. }

3. 读取系统所有应用的名称

这个是利用不越狱的机器没有这个权限来判定的。

[objc]  view plain copy
  1. #define USER_APP_PATH                 @"/User/Applications/"
  2. - (BOOL)isJailBreak
  3. {
  4. if ([[NSFileManager defaultManager] fileExistsAtPath:USER_APP_PATH]) {
  5. NSLog(@"The device is jail broken!");
  6. NSArray *applist = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:USER_APP_PATH error:nil];
  7. NSLog(@"applist = %@", applist);
  8. return YES;
  9. }
  10. NSLog(@"The device is NOT jail broken!");
  11. return NO;
  12. }

4. 使用stat方法来判定cydia是否存在

这个方法本身思路还是通过判定cydia应用,但方法是用的stat函数,同时会判定是否有注入动态库。

[objc]  view plain copy
  1. #define CYDIA_APP_PATH                "/Applications/Cydia.app"
  2. int checkInject()
  3. {
  4. int ret;
  5. Dl_info dylib_info;
  6. int (*func_stat)(const char*, struct stat*) = stat;
  7. if ((ret = dladdr(func_stat, &dylib_info)) && strncmp(dylib_info.dli_fname, dylib_name, strlen(dylib_name))) {
  8. return 0;
  9. }
  10. return 1;
  11. }
  12. int checkCydia()
  13. {
  14. // first ,check whether library is inject
  15. struct stat stat_info;
  16. if (!checkInject()) {
  17. if (0 == stat(CYDIA_APP_PATH, &stat_info)) {
  18. return 1;
  19. }
  20. } else {
  21. return 1;
  22. }
  23. return 0;
  24. }
  25. - (BOOL)isJailBreak
  26. {
  27. if (checkCydia()) {
  28. NSLog(@"The device is jail broken!");
  29. return YES;
  30. }
  31. NSLog(@"The device is NOT jail broken!");
  32. return NO;
  33. }

5. 读取环境变量

这个DYLD_INSERT_LIBRARIES环境变量,在非越狱的机器上应该是空,越狱的机器上基本都会有Library/MobileSubstrate/MobileSubstrate.dylib

[objc]  view plain copy
  1. char* printEnv(void)
  2. {
  3. charchar *env = getenv("DYLD_INSERT_LIBRARIES");
  4. NSLog(@"%s", env);
  5. return env;
  6. }
  7. - (BOOL)isJailBreak
  8. {
  9. if (printEnv()) {
  10. NSLog(@"The device is jail broken!");
  11. return YES;
  12. }
  13. NSLog(@"The device is NOT jail broken!");
  14. return NO;
  15. }

当然,判定一个设备是否越狱时,可以多种方法并用以确保准确。这里我还想说的是越狱有完美越狱还有非完美越狱,这本身就不是官方有保证的行为,所以情况也是复杂多变。iOS7针对沙盒机制也有了改进升级,有些情况对新的版本或许是不合适的,这点还需要实际情况实际处理。另外,还有fork一个子线程,看返回值等一些方法,这里也不再一一列举。

最后,越狱毕竟会带来不安全因素的增加,尤其是金融工具装的比较多的情况下,强烈不推荐越狱。

iOS判断iPhone是否越狱相关推荐

  1. iOS 判断设备是否越狱

    想做一个付费下载应用,又担心越狱用户下载,白费心思了,故而想起在应用内判断设备是否越狱,网上找到这片关于越狱判断的文章,觉得写得特别好,所以转了下来,添加一些自己的心得. -------------- ...

  2. IOS 判断iPhone刘海屏

    现在Apple市场上,越来越流行刘海屏手机(与Android市场一样,往刘海屏手机方向发展趋势). 在iPhone手机角度上看,刘海屏出现在机型较新的手机上(相对较旧/老的iPhone上还没出现). ...

  3. ios 判断iPhone、iPad硬件型号

    方法1: #include <sys/sysctl.h> - (NSString *) platform {       size_t size;       sysctlbyname(& ...

  4. iOS 判断设备是否越狱(两种方式结合判断)

    越狱测试仅限真机 + (BOOL)JailBreak{BOOL status1 = NO;BOOL status2 = NO;//根据是否能打开cydia判断status1 = [[UIApplica ...

  5. iOS判断是ipad还是iphone

    原文地址:iOS判断是ipad还是iphone 作者:酷云 - (BOOL)application:(UIApplication *)application didFinishLaunchingWit ...

  6. iOS 判断手机型号(已更新至iPhone 14 Pro Max)

    iOS 判断手机型号(已更新至iPhone 14 Pro Max) 判断手机型号代码如下: #import <sys/utsname.h> #pragma mark -- 判断手机型号 + ...

  7. 如何给未越狱的ios下载历史版本的app?未越狱IOS系统安装历史版本软件的方法,iPhone未越狱的手机如何安装旧版本APP?

    如何给未越狱的ios下载历史版本的app?未越狱IOS系统安装历史版本软件的方法,iPhone未越狱的手机如何安装旧版本APP? IOS由于系统机制问题不支持版本回退 某些更新可能导致闪退 卡顿等未知 ...

  8. iOS内购-防越狱破解刷单

    ---------------------------2018.10.16更新--------------------------- 最近我们公司丢单率上涨,尤其是10月份比9月份来说丢单率翻了3倍, ...

  9. iOS 8.1.2 越狱过程详解及相关漏洞分析

    360NirvanTeam · 2016/01/10 12:35 Author:[email protected] 0x00 简介 本文主要介绍了: 自己对越狱的理解 iOS 8.1.2 越狱工具的工 ...

最新文章

  1. python import io_详解Python IO编程
  2. Docker registry V2
  3. latex文档的优点和使用小tips
  4. java cookie 加密_java cookie encodeBase64加密
  5. javascript 定义类(转载)
  6. Ribbon-饥饿加载
  7. 将组策略编辑器添加到控制面板
  8. Mybatis判断int类型是否为空
  9. mac硬盘挂载不显示(exfat格式)
  10. AI为癌细胞杀手“染色”,辅助医生选择治疗方案 | 附论文
  11. AGC018C Coins (set)
  12. 用给出的Cramer规则解线性方程组
  13. 他是发明声呐的物理天才,被妻子家暴后出轨守寡的师母,爱因斯坦却公开支持.........
  14. 【OpenCV入门】一些基本的图像处理
  15. 解决vnc客户端不能拷贝粘贴
  16. Matlab数学建模(八):评价型模型
  17. HEX文件格式解析(转)
  18. Vbs-Js_Vir
  19. AI4DB:openGauss人工智能参数调优之X-Tuner
  20. 2021年9月电子学会Python等级考试试卷(一级)考题解析

热门文章

  1. 大数据离线集群数据迁移实战项目
  2. 腾讯云ubuntu 开放3306端口
  3. pycharm安装教程(2022)与使用
  4. bp配置 sap_客户主数据的合作伙伴配置
  5. Meterprete端口转发
  6. linux内核版本5.3,Linux 5.3-rc1内核kernel-ppa已经推出,用户可用deb安装5.3内核版本...
  7. Docker基础及简单部署
  8. AJAX应用服务器端:面向服务与WCF
  9. mysql服务器双网卡冗余的配置
  10. 电磁兼容EMC问题汇总?这里有30个常见为什么