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

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

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

1. 判定常见的越狱文件

/Applications/Cydia.app

/Library/MobileSubstrate/MobileSubstrate.dylib

/bin/bash

/usr/sbin/sshd

/etc/apt

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

  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这个应用。

  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. 读取系统所有应用的名称

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

  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函数,同时会判定是否有注入动态库。

  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

  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设备是否越狱的判断代码的更多相关文章

  1. 借助91助手,将ibook中的pdf文件拷贝至其它的pdf阅读器中(ios设备无需越狱)

    有时候在使用ios自带的ibook阅读pdf文件的时候,会发现ibook有些功能并不是那么方便.最近我就遇到了一例,我想在ibook中放一本比较大的pdf书,页数有几百吧,pdf文件本身每一章节都是有 ...

  2. 判断iOS设备是否越狱

    - (BOOL)isJailbroken { BOOL jailbroken = NO; NSString *cydiaPath = @"/Applications/Cydia.app&qu ...

  3. iOS设备的越狱方法

    最近公司的事情很忙,在开发一个类似于微信的App,经常加班,所以也没有时间去更新微信公众账号的内容了.iOSJailbreak, 申请这个账号大概有一个多月了吧,发布的内容不多,更多是针对开发者的内容 ...

  4. 分析Tapjoy的模式—分发用于ios设备的企业级应用程序

    下面简单介绍下Tapjoy的模式,供大家参考: Tapjoy最初的合作模式:“按安装奖励”(pay-per-install) Tapjoy利用非常成功的奖励性下载模式影响了App Store的免费游戏 ...

  5. iOS 判断设备是否越狱

    我们在开发过程中,需要知道设备是否越狱,在网上查看很多资料,为此封装一些判断的方法. 上代码,不解释: .h文件 #import <Foundation/Foundation.h> @in ...

  6. iOS不越狱装收费App——注册iOS设备为开发者工具

    额,这篇教程主要是我写下来用于总结注册iOS设备和用iResign安装App的过程,想要不越狱安装App当然有办法,但是有几个前提--你是一个Apple开发者,或者你有个朋友是App的开发者.如果没有 ...

  7. Unity3D开发之“获取IOS设备所在的国家代码"

    原地址:http://dong2008hong.blog.163.com/blog/static/469688272014021025578/ 在前一段时间游戏开发中需要实现获取IOS设备所在的国家代 ...

  8. 判断浏览器环境(QQ,微信,安卓设备,IOS设备,PC微信环境,移动设备)

    判断浏览器环境(QQ,微信,安卓设备,IOS设备,PC微信环境,移动设备) // ===== 判断浏览器环境 ===== // // 判断是否是QQ环境 function isQQ() { retur ...

  9. 关于iOS设备的那些事

    首先推荐一个在用的库XYQuick 地址:https://github.com/uxyheaven/XYQuick idfa: 获取方式 [ASIdentifierManager sharedMana ...

随机推荐

  1. springmvc的@Validated/@Valid注解使用和BindingResult bindingResult

    关于@Valid和Validated的比较 @Valid是使用hibernate validation的时候使用 @Validated 是只用spring  Validator 校验机制使用 一:@V ...

  2. Android6.0------权限申请RxPermissions

    前面写了Android6.0权限介绍和权限单个,多个申请,用的是纯Java代码,本文主要说的是借助第三方库来实现权限申请. 借助第三方库 RxPermissions来申请6.0权限. RxPermis ...

  3. Android----- MD5加密(登录注册得到与IOS相同的加密值,并且解决两个平台汉字加密不相同问题)

    最近开发项目中遇到一个这样的问题,注册和登录时需要对信息MD5加密生成一个Token传给后台, 后台会对信息进行比较加密是否相同,才表示你登录或者注册成功,所以,IOS和Android两个平台的tok ...

  4. 搞懂分布式技术11:分布式session解决方案与一致性hash

    搞懂分布式技术11:分布式session解决方案与一致性hash session一致性架构设计实践 原创: 58沈剑 架构师之路 2017-05-18 一.缘起 什么是session? 服务器为每个用 ...

  5. HUST 1328 String (字符串前缀子串个数 --- KMP)

    题意 给定一个字符串S,定义子串subS[i] = S[0..i],定义C[i]为S中subS[i]的数量,求sigma(C[i])(0<=i<N). 思路 我们以子串结尾的位置来划分阶段 ...

  6. hdu4678 Mine 规律或者博弈。(博弈的sg函数不懂我是找的规律)

    链接:题意就是告诉你一个扫雷图里面每个雷的位置,有两个人,每个人都知道雷的确切位置,每个人一次可以点一部,问你谁能赢. 链接:http://acm.hdu.edu.cn/showproblem.php ...

  7. JDK的KeyTool和KeyStore等加密相关

    Keytool是一个有效的安全钥匙和证书的管理工具. Java 中的 keytool.exe (位于JDK\Bin下)可以用来创建数字证书,所有的数字证书是以一条一条(用别名区别,不区分大小)地存储在 ...

  8. 【zzuli-2259】matrix

    题目描述 在麦克雷的面前有N个数,以及一个R*C的矩阵.现在他的任务是从N个数中取出 R*C 个,并填入这个矩阵中.矩阵每一行的法值为本行最大值与最小值的差,而整个矩阵的法值为每一行的法值的最大值.现 ...

  9. lvs fullnat部署手册(一)fullnat内核编译篇

    标签:kernel rpm lvs fullnat 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://shanks.blog.51c ...

  10. core文件介绍

    原文链接:http://team.eyou.com/?p=27 如有侵犯您的版权,请联系windeal12@qq.com linux下,产生core文件,和不产生core文件的条件: 当我们的程序崩溃 ...