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

有时我们的应用希望知道安装的设备是否已经越狱了,显然,苹果官方不会给出解决方案来的,那么我们怎么办呢?因为越狱后会自动安装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. tp5---auth权限搭建2

    1.auth权限 composer auth库 下载完成之后 根据auth.php中所提及怎样创建表,就怎样建表 2.安利一个简单的建表操作 根据composer下载里的文件注释的代码,将其直接放到s ...

  2. Java循环语句之 do...while

    do...while 循环与 while 循环语法有些类似,但执行过程差别比较大. 语法: 执行过程: <1>. 先执行一遍循环操作,然后判断循环条件是否成立 <2>. 如果条 ...

  3. Mysql解压版配置环境等

    背景故事:安装版的mysql和我的本本有仇,最后一步老卡死 1.首先先把下载好的压缩包解压,如下图:

  4. linux禁止ping

    1.临时禁止PING操作的命令为:#echo 1>/proc/sys/net/ipv4/icmp_echo_ignore_all 2.永久禁止PING配置方法 /etc/sysctl.conf  ...

  5. 关于BFS和dijkstra(2019.04.20)

    我的BFS板子 struct node{/*略*/};//表示一个状态 std::map<node,bool>vis;//判断每个状态是否已访问过 std::queue<node&g ...

  6. C++实现矩阵压缩

    C++实现矩阵压缩 转置运算时一种最简单的矩阵运算.对于一个m*n的矩阵M,他的转置矩阵T是一个n*m的矩阵,且T(i,j) = M(j,i). 一个稀疏矩阵的转置矩阵仍然是稀疏矩阵. 矩阵转置 方案 ...

  7. 19.并发容器之BlockingQueue

    1. BlockingQueue简介 在实际编程中,会经常使用到JDK中Collection集合框架中的各种容器类如实现List,Map,Queue接口的容器类,但是这些容器类基本上不是线程安全的,除 ...

  8. HDU-5695-拓扑排序+优先队列

    Gym Class Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  9. HDU 4099 大数+Trie

    Revenge of Fibonacci Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 204800/204800 K (Java/ ...

  10. IOS-Quartz2D(Paths元素)

    Paths中的几个重要元素 Points void CGContextMoveToPoint (    CGContextRef c,    CGFloat x,    CGFloat y ); 指定 ...