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

有时我们的应用希望知道安装的设备是否已经越狱了,显然,苹果官方不会给出解决方案来的,那么我们怎么办呢?因为越狱后会自动安装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设备是否越狱的判断方法相关推荐

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

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

  2. css样式对IOS设备苹果手机不支持解决方法

    css样式对IOS设备苹果手机不支持解决方法 在写移动端的网页的时候发现到苹果的设备上浏览的时候按钮变成了苹果的灰色按钮. 在class文件中写入下面的代码可以解决. input[type=" ...

  3. 【iOS开发】判断iOS设备是否越狱

    原文链接:点击打开链接 苹果是非常看重产品的安全性的,所以给用户设计了一套复杂的安全机制.这让喜爱自由,崇尚一切开放的程序员们极度不爽,于是越狱就成了苹果和黑客们反复斗法的场所.总体来说,越狱可以让我 ...

  4. iOS设备一键越狱(PP助手、盘古越狱)

    进入PP助手主页:http://pro.25pp.com/?from=pp_pz 下载越狱助手的对应版本: 安装后打开如下: 点击"开始越狱"即可 如果下载到非越狱版本,也可以在P ...

  5. iOS 判断设备是否越狱

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

  6. iPhone是否越狱的检测方法

    今天项目中要用到检查iPhone是否越狱的方法. Umeng统计的Mobclick.h里面已经包含了越狱检测的代码,可以直接使用 /*方法名:* isJailbroken*介绍:* 类方法,判断设备是 ...

  7. ios wifi 定位_一种IOS设备的集中式Wifi室内定位方法

    一种IOS设备的集中式Wifi室内定位方法 [技术领域] [0001] 本发明属于无线通信室内定位技术领域,具体涉及一种IOS设备的集中式Wifi室 内定位方法. [背景技术] [0002] 近年来, ...

  8. iOS 7.X完美越狱工具放出 支持所有iOS设备

    今晚,evad3rs越狱团队放出了最新的全系列iOS设备 完美越狱工具evasi0n.支持所有的iPhone.iPod touch.iPad.和iPad mini,可实现 ios7越狱. 越狱前注意事 ...

  9. AceDeceiver成为首个可利用苹果DRM设计漏洞感染iOS设备的木马

    virustracker · 2016/03/18 14:03 from :researchcenter.paloaltonetworks.com/2016/03/ace- 0x00 简介 近日,我们 ...

最新文章

  1. 从“如何学会做一只机械表”讲如何创新,如何做好产品
  2. 使用Tape和Vue Test Utils编写快速的Vue单元测试
  3. linux下防DDOS***软件及使用方法详解
  4. 初探 Unix 操作系统
  5. secureCRT的安装及破解
  6. DB Query Analyzer 中断SQL语句的执行
  7. GUI阅读字号和触点面积设计 (可用性设计)
  8. Hexo 博客本地预览报错:Error: listen EADDRINUSE 0.0.0.0:4000
  9. 最大矩阵和 2015-05-13 21:23 8人阅读 评论(0) 收藏...
  10. python基础30个常用代码-Python基础30道测试题(字符串相关)
  11. 第129天:node.js安装方法
  12. 【Javassist官方文档翻译】第一章 读写字节码
  13. 案例分析 | 贝壳找房:自我颠覆的整合式创新引领产业数字化
  14. Excel学习1:图表配色
  15. 产品经理就业喜报:沉舟侧畔终迎万木春
  16. Java资料网盘分享
  17. 在c#中using和new这两个关键字有什么意义
  18. java枚举类型及枚举集合
  19. 2022年分布式I/O市场前景分析及研究报告
  20. python刷弹幕_每个大主播都是满屏弹幕,怎么做到的?Python实战无限刷弹幕!

热门文章

  1. jqueryvalidate(猫冬插件)+spring3.0+struts2.18(集成开发)
  2. 【分享】Quora使用到的技术
  3. 雷神MixBook Air笔记本系统故障怎么重装?
  4. go json.Marshal
  5. springboot继承组件_springboot 的组件集成
  6. C++编程思想 第2卷 第3章 深入理解字符串 对字符串进行操作 替换字符串中的字符
  7. mapbox-gl使用geojson实现三维建筑物效果
  8. java 发送企业邮箱_java 企业邮箱_java 企业邮箱群发邮件
  9. YouTube是如何吸粉
  10. vs2015 python不兼容_vs2015安装失败 缺少Python27_d.lib的解决方法