越狱检测的攻与防

在应用开发过程中,我们希望知道设备是否越狱,正以什么权限运行程序,好对应采取一些防御和安全提示措施。

iOS7相比之前版本的系统而言,升级了沙盒机制,封锁了几乎全部应用沙盒可以共享数据的入口。即使在越狱情况下,限制也非常多,大大增加了应用层攻击难度。比如,在iOS7之前,我们可以尝试往沙盒外写文件判断是否越狱,但iOS7越狱后也无该权限,还使用老方法检测会导致误判。

那么,到底应该如何检测越狱呢?攻击者又会如果攻破检测呢?本文就着重讨论一下越狱检测的攻与防。

 

首先,你可以尝试使用NSFileManager判断设备是否安装了如下越狱常用工具:
/Applications/Cydia.app
/Library/MobileSubstrate/MobileSubstrate.dylib
/bin/bash
/usr/sbin/sshd
/etc/apt

但是不要写成BOOL开关方法,给攻击者直接锁定目标hook绕过的机会

+(BOOL)isJailbroken{if ([[NSFileManager defaultManager] fileExistsAtPath:@"/Applications/Cydia.app"]){return YES;}// ...
}

攻击者可能会改变这些工具的安装路径,躲过你的判断。

那么,你可以尝试打开cydia应用注册的URL scheme:

if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://package/com.example.package"]]){NSLog(@"Device is jailbroken");
}

但是不是所有的工具都会注册URL scheme,而且攻击者可以修改任何应用的URL scheme。

那么,你可以尝试读取下应用列表,看看有无权限获取:

if ([[NSFileManager defaultManager] fileExistsAtPath:@"/User/Applications/"]){NSLog(@"Device is jailbroken");NSArray *applist = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"/User/Applications/"error:nil];NSLog(@"applist = %@",applist);
}

越了狱的设备是可以获取到的:

攻击者可能会hook NSFileManager 的方法,让你的想法不能如愿。

那么,你可以回避 NSFileManager,使用stat系列函数检测Cydia等工具:

#import <sys/stat.h>void checkCydia(void)
{struct stat stat_info;if (0 == stat("/Applications/Cydia.app", &stat_info)) {NSLog(@"Device is jailbroken");}
}

攻击者可能会利用 Fishhook原理 hook了stat。

那么,你可以看看stat是不是出自系统库,有没有被攻击者换掉:

#import <dlfcn.h>void checkInject(void)
{int ret ;Dl_info dylib_info;int    (*func_stat)(const char *, struct stat *) = stat;if ((ret = dladdr(func_stat, &dylib_info))) {NSLog(@"lib :%s", dylib_info.dli_fname);}
}

如果结果不是 /usr/lib/system/libsystem_kernel.dylib 的话,那就100%被攻击了。
如果 libsystem_kernel.dylib 都是被攻击者替换掉的……

那也没什么可防的大哥你随便吧……

那么,你可能会想,我该检索一下自己的应用程序是否被链接了异常动态库。

列出所有已链接的动态库:

#import <mach-o/dyld.h>void checkDylibs(void)
{uint32_t count = _dyld_image_count();for (uint32_t i = 0 ; i < count; ++i) {NSString *name = [[NSString alloc]initWithUTF8String:_dyld_get_image_name(i)];NSLog(@"--%@", name);}
}

通常情况下,会包含越狱机的输出结果会包含字符串: Library/MobileSubstrate/MobileSubstrate.dylib 。

攻击者可能会给MobileSubstrate改名,但是原理都是通过DYLD_INSERT_LIBRARIES注入动态库。

那么,你可以通过检测当前程序运行的环境变量:

void printEnv(void)
{char *env = getenv("DYLD_INSERT_LIBRARIES");NSLog(@"%s", env);
}

未越狱设备返回结果是null,越狱设备就各有各的精彩了,尤其是老一点的iOS版本越狱环境。

iOS安全攻防(二十):越狱检测的攻与防相关推荐

  1. iOS安全攻防越狱检测的攻与防

    越狱检测的攻与防 在应用开发过程中,我们希望知道设备是否越狱,正以什么权限运行程序,好对应采取一些防御和安全提示措施. iOS7相比之前版本的系统而言,升级了沙盒机制,封锁了几乎全部应用沙盒可以共享数 ...

  2. 【iOS逆向】某App越狱检测

    1.目标 此篇文本为入门文章,大家莫抱过多期望.此文章的目的是教大家如何从UI入手,去定位自己想要的东西. 2.操作环境 mac系统 frida-ios-dump:砸壳 已越狱iOS设备:脱壳及fri ...

  3. iOS入门(二十)字典

    字典 用于保存具有映射关系的数据(key -- value对) 字典是存储key--value对的容器. 字典考key存取数据 不可变字典 : NSNictionary. NSMutableDicti ...

  4. IOS学习笔记二十NSSet和NSMutableSet

    1.NSSet.NSMutableSet NSSet元素无序.不能重复 NSMutableSet元素无序.不能重复,有一些向集合中增加元素的功能.删除元素....... 2.测试Demo int ma ...

  5. iOS安全攻防(十九):基于脚本实现动态库注入

    基于脚本实现动态库注入 MobileSubstrate可以帮助我们加载自己的动态库,于是开发者们谨慎的采取了对MobileSubstrate的检索和防御措施. 那么,除了依靠MobileSubstra ...

  6. 处理veh调试器检测_越狱检测抖音逻辑???

    对于应用安全甲方一般会在这三个方面做防御.按逻辑分类的话应该应该分为这几类, 但如果从实现原理的话, 应该分为两类, 用API实现的 和 不用API实现的(这说的不用 API 实现, 不是指换成 in ...

  7. 越狱检测/越狱检测绕过

    越狱检测/越狱检测绕过--xCon 一直忽略了越狱检测与越狱检测绕过的问题,因为我认为在app争抢装机率的环境下,是不会在乎对方的设备越狱与否的.但很显然,我忽略了一个问题,app在设计的时候或许会依 ...

  8. 越狱检测/越狱检测绕过—xCon

    http://www.freebuf.com/articles/wireless/6318.html 一直忽略了越狱检测与越狱检测绕过的问题,因为我认为在app争抢装机率的环境下,是不会在乎对方的设备 ...

  9. 越狱检测/越狱检测绕过——xCon

    原文http://blog.csdn.net/zkdemon/article/details/8242064 越狱检测/越狱检测绕过--xCon 一直忽略了越狱检测与越狱检测绕过的问题,因为我认为在a ...

最新文章

  1. hdu 4417 Super Mario(可持久化线段树)
  2. 用聪明的方式学习Vim,不再死记硬背,复杂命令一学就会 | GitHub 2200星
  3. 2021 高考 成绩查询,精准预测!2021全国大学录取分数线表查询
  4. [CQOI2017] 老C的键盘(树形dp + 组合数)
  5. 天津工业大学c语言题库,天津工业大学it1创新2届c语言期末复习.ppt
  6. git 分支查看与切换
  7. ktor HTTP API 练习
  8. hadoop入门学习--WordCount
  9. java工作流activity_activity 工作流学习(一)
  10. Modelica中Stream变量
  11. java 数学库_数学库
  12. 小码哥《恋上数据结构与算法》笔记(十五):哈希表(Hash Table)
  13. 计算机音乐创作心得,理结与悠的作曲入门讲座(心得篇 3-4)
  14. 电脑dns服务器未响应啥意思,电脑诊断出DNS服务器未响应是什么意思
  15. R、RStudio下载与安装方法
  16. Java开发微信公众号初体验
  17. execute,executeQuery,executeUpdate三个方法有什么区别呢?
  18. Qt开源作品33-图片开关控件
  19. linux系统getopt函数详解
  20. python-科研绘图系列(3)-雷达图

热门文章

  1. 严重: The web application [] appears to have started a thread named [Thread-
  2. OpenCV | 直线拟合fitline函数
  3. 2-11 CAD基础 镜像(mirror)
  4. 【二叉树:3】线索二叉树
  5. 交通安全管理毕业论文范文
  6. 英语一点都不懂怎么学,怎么快速学好英语?
  7. jQuery(一):概述、选择器、操作(元素本身、属性、内容、样式)、元素遍历、事件
  8. Revit链接CAD
  9. pandas支持读取哪些类型文件_Pandas教程: 读取Excel文件
  10. C++的学习心得和知识总结(十八)|基于EasyX实现 2048游戏 项目(C/C++版)