IOS越狱和Android Root检测

IOS越狱和Android Root在原理是一样的。IOS和Android的底层是类Unix和类Linux系统。使用过Unix或者Linux的用户可以发现,Uinx或这Linux系统切换root用户需要用到su命令。但是IOS和Android系统不想让我们获得root权限,所以在IOS和Android系统下可能都没有su程序。所以只要想办法把编译好的su文件拷贝到IOS和Android系统目录,然后执行su,理论上就可以完成越狱或者root了。但在实际操作中,需要找到IOS或者Androdi系统的漏洞,才可以执行su,也不是一个简答的事情。

我们在IOS或者Android开发一些应用的时候,出于安全考虑,一般不希望App在已经越狱的手机系统运行,特别是金融领域的移动应用,对系统的安全性要求越高。

本文总结了常用的一些IOS越狱和Android root检测的方法,并不是自己研究的成果,均是基于朋友的帮助和网络上的分享。

但不要庆幸,任何的检测方式都不能保证完全的有效,毕竟越狱和root的方法还在不断更新(码农何必为难码农)。

IOS越狱检测

#define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0])static const char* jailbreakToolPaths[] = {"/Applications/Cydia.app","/Library/MobileSubstrate/MobileSubstrate.dylib","/bin/bash","/usr/sbin/sshd","/etc/apt","/private/var/lib/apt/"
};static long gx_strcmp(const char *src,const char *dst)
{if(!src || !dst)return src-dst;while(*src && (*src == *dst)){src++;dst++;}return *src - *dst;
}// 检测dylib(动态链接库)
static BOOL checkDylibs()
{uint32_t count = _dyld_image_count();for (uint32_t i = 0 ; i < count; ++i) {const char *imageName = _dyld_get_image_name(i);if (!gx_strcmp(imageName, jailbreak_tool_pathes[1])) {return YES;}}return NO;
}// 检测stat hook
static BOOL checkInject()
{int ret ;Dl_info dylib_info;int (*func_stat)(const char *, struct stat *) = stat;if ((ret = dladdr(func_stat, &dylib_info))) {if (!gx_strcmp(dylib_info.dli_fname, "/usr/lib/system/libsystem_kernel.dylib")) {return NO;}}return YES;
}// 检测环境变量
static BOOL checkJailbrokenM1()
{if (!checkDylibs()) {char *env = getenv("DYLD_INSERT_LIBRARIES");if (env) {return YES;} else {return NO;}} else {return YES;}
}// 检测Cydia
static BOOL checkJailbrokenM2()
{if([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://package/com.example.package"]]){return YES;}return NO;
}static BOOL checkJailbrokenM3()
{struct stat stat_info;if (!checkInject()) {if (0 == stat("/Applications/Cydia.app", &stat_info)) {return YES;} else {return NO;}} else {return YES;}
}// 检测是否存在常用的越狱工具
static BOOL checkJailbrokenM4()
{for (int i=0; i<ARRAY_SIZE(jailbreakToolPaths); i++) {if ([[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithUTF8String:jailbreakToolPaths[i]]]) {return YES;}}return NO;
}static BOOL checkJailbrokenM5()
{for (int i=0; i<ARRAY_SIZE(jailbreakToolPaths); i++) {FILE *f = fopen(jailbreakToolPaths[i], "r");if (f != NULL) {fclose(f);return YES;}}return NO;
}// 访问安装应用目录
static BOOL checkJailbrokenM6()
{if ([[NSFileManager defaultManager] fileExistsAtPath:@"/User/Applications/"]) {return YES;}return NO;
}

Android root检测

public class ROOT
{public static final String[] rootFilePaths = {"/system/xbin/daemonsu","/system/etc/init.d/99SuperSUDaemon","/data/data/com.topjohnwu.magisk","/sdcard/MagiskManager"};public static final String[] exeFilePaths = {"/sbin/su","/system/bin/su","/system/sbin/su","/system/xbin/su","/data/local/xbin/su","/data/local/bin/su","/data/local/su","/su/bin/su"};public static boolean checkRootM1(){File file = new File("/system/app/Superuser.apk");boolean find1 = file.exists();File file1 = new File("/system/bin/sh");boolean find2 = file1.exists();if( find1 || find2 )return true;elsereturn false;}public static boolean checkRootM2(){ArrayList<String> paths = new ArrayList<String>(Arrays.asList(rootFilePaths));for (String path:paths){File filePath = new File(path);if (filePath.exists()){return true;}}return false;}public static boolean checkRootM3() {String buildTags = android.os.Build.TAGS;if (buildTags != null && buildTags.contains("test-keys")||rootTestKeyDetection()) {return true;}return false;}public static boolean checkRootM4(){ArrayList<String> paths = new ArrayList<String>(Arrays.asList(exeFilePaths));for (String path:paths){File filePath = new File(path);if (filePath.exists() && isExecutable(path)){return true;}}return false;}public static boolean checkRootM5() {String filePath = "/data/SafeEdit.txt";try {File file1 = new File(filePath);if (!file1.exists()) {file1.createNewFile();}if (file1.exists()) {return true;}} catch (Exception e) {e.printStackTrace();}return false;}public static boolean checkRootM6() {File file1 = new File("/root");File[] files = file1.listFiles();if (files == null){return false;} else {return true;}}public static boolean checkRootM7(){String binPath = "/system/bin/busybox";String xBinPath = "/system/xbin/busybox";String shPath = "/system/sbin/busybox";if (new File(binPath).exists()) {return true;}if (new File(xBinPath).exists()) {return true;}if (new File(shPath).exists()) {return true;}return false;}private static boolean checkRootM8(){String[] props = {"ro.debuggable","ro.secure","ro.adb.secure"};String[] lines = propsReader("getprop");if (lines == null){return false;}for (String line:lines){if (line.indexOf(props[0]) != -1){if (line.indexOf("1") != -1)return true;}if (line.indexOf(props[1]) != -1){if (line.indexOf("0") != -1)return true;}if (line.indexOf(props[2]) != -1){if (line.indexOf("0") != -1)return true;}}return false;}private static boolean isExecutable(String filePath) {Process p = null;BufferedReader in = null;try {p = Runtime.getRuntime().exec("ls -l " + filePath);in = new BufferedReader(new InputStreamReader(p.getInputStream()));String str = in.readLine();if (str != null && str.length() >= 4) {char flag = str.charAt(3);if (flag == 's' || flag == 'x') {return true;}}} catch (IOException e) {e.printStackTrace();} finally {if(in != null){try {in.close();} catch (IOException e) {e.printStackTrace();}}p.destroy();}return false;}private static boolean rootTestKeyDetection(){String[] lines = propsReader("getprop");if (lines == null){return false;}for (String line:lines){if (line.indexOf("build.fingerprint") != -1){if (line.indexOf("test-keys") != -1){return true;}}}return false;}private static String[] propsReader(String cmd) {InputStream inputstream = null;try {inputstream = Runtime.getRuntime().exec(cmd).getInputStream();if (inputstream == null) return null;String propVal = new Scanner(inputstream).useDelimiter("\\A").next();return propVal.split("\n");} catch (Exception e) {e.printStackTrace();return null;}finally {try {if (inputstream != null)inputstream.close();} catch (IOException e) {e.printStackTrace();}}}
}

IOS越狱和Android Root检测相关推荐

  1. Android root检测方法小结

    出于安全原因,我们的应用程序不建议在已经root的设备上运行,所以需要检测是否设备已经root,以提示用户若继续使用会存在风险. 那么root了会有什么风险呢,为什么不root就没有风险,又怎么来检查 ...

  2. Android root检测方法总结

    一 为什么要进行root检测? 出于安全原因,我们的应用程序不建议在已经root的设备上运行,所以需要检测是否设备已经root,以提示用户若继续使用会存在风险. 二 root了会有什么风险? 在Lin ...

  3. android 绕过root检测,公主连结怎么绕过root检测 绕过root检测方法一览

    公主连结刷初始怎么绕过root检测呢?很多小伙伴想刷初始可是经常被root检测,有没有什么办法才能绕过检测呢? 实机可以用magisk自带的hide功能,xposed框架可以选择rootcloak,A ...

  4. Android设备Root检测方法

    app发布后,一些root用户可能会修改我们应用的一些信息,如传感器获得的数据,那么这些用户的数据就不再具有参考价值,应该被单独列出, 以方便数据的分析,所以就有了本文. 下面是检测Android设备 ...

  5. Android Root及提供商:一把双刃剑

    摘要 Android Root 是一个自愿.合法获取设备最高权限和完全用户控制设备的过程,为了满足大众需求,一个独一无二的Android Root生态系统已经形成,也促使各种各样的Root提供商提供R ...

  6. iOS 越狱-砸壳工具的使用

    1.越狱概述 1.1 通过iOS系统安全启动链漏洞,从而禁止掉信任链中负责验证的组件.拿到iOS系统最大权限ROOT权限. 1.2 当启动一台iOS设备时,系统首先会从只读的ROM中读取初始化指令,也 ...

  7. iOS 越狱的Tweak开发

    iOS 越狱的Tweak开发 原文链接在我的博客 https://yohunl.com/ios-yue-yu-de-tweakkai-fa/ 上,如果有更新,以博客为准 iOS越狱开发中,各种破解补丁 ...

  8. android root权限破解分析

    破解android的root权限的本质是:在系统中加入一个任何用户都可能用于登陆的su命令.或者说替换掉系统中的su程序,因为系统中的默认su程序需要验证实际用户权限,只有root和 shell用户才 ...

  9. 移动安全之Android安全检测工具大全

    原文地址:https://github.com/tanprathan/MobileApp-Pentest-Cheatsheet 补充[1]http://www.black-eleven.com/?p= ...

  10. 手把手教你制作一款iOS越狱App,伪装微信位置

    说明 缘由 严重声明 概念 越狱的原理 iOS 目录层级结构 iOS 程序类型 准备工作 硬件设备 辅助软件 Mac 需要的工具 iOS 需要使用的辅助开发工具 逆向过程 静态分析 给App砸壳 使用 ...

最新文章

  1. 【目标检测】(6) YOLOV2 目标检测在V1基础上的改进
  2. 计划程序:拒绝重复工作,让效率翻倍!
  3. 大咖说:React Native 全埋点实现原理(内附赠书)
  4. [激励机制]浅谈内部竞争——如何让你的员工玩命干活?
  5. 使用 Source Generator 代替 T4 动态生成代码
  6. java中整数如何表示,在Java中如何在位级别上内部表示整数?
  7. bmon:一个强大的网络带宽监视和调试工具
  8. 个人博客网站 Welcome All
  9. scala 字符串转换数组_如何在Scala中将字节数组转换为字符串?
  10. 通达信缠论买卖点公式_缠论买卖点阐述及选股思路
  11. [0716] Jsoi B Isbn
  12. 平面设计师,请问你的灵感在哪里充电
  13. ngnix集群产生的问题
  14. JavaScript中的事件循环
  15. § 1.3 简 单 的 Java程 序
  16. 方舟服务器伤害怎么显示,方舟单机模式下怎么显示伤害数值啊 | 手游网游页游攻略大全...
  17. H3C交换机IPv6无状态地址自动配置
  18. 高并发编程之ThreadPool 线程池
  19. linux窗口按钮,在KDE Linux中配置窗口装饰按钮 | MOS86
  20. Snapman设计中的思考

热门文章

  1. timestamp类型增加天、月、年后的时间
  2. 医院计算机应用,解读计算机应用技术对医院信息化的影响
  3. php怎么创建以太坊钱包地址,php如何调用以太坊JSON-RPC接口创建钱包
  4. 嵌入式-stm32学习:使用固件库点亮LED
  5. vue实现lodop打印功能
  6. 个性化不和谐帐户的8种方法
  7. 电子技术基础(三)__第5章 之逻辑函数的卡诺图化简方法
  8. 卡诺图化简及逻辑函数的规范范式:SOP与POS形式
  9. 按颜色分类:蓝色系(Blue)
  10. RT-Thread : STM32 系列外设驱动添加指南