如何代码判断设备是否为越狱设备---

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

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

下面是一些判断方法:

1. 判定常见的越狱文件

/Applications/Cydia.app

/Library/MobileSubstrate/MobileSubstrate.dylib

/bin/bash

/usr/sbin/sshd

/etc/apt

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

#define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0])  

const char* jailbreak_tool_pathes[] = {
    "/Applications/Cydia.app",
    "/Library/MobileSubstrate/MobileSubstrate.dylib",
    "/bin/bash",
    "/usr/sbin/sshd",
    "/etc/apt"
};  

- (BOOL)isJailBreak
{
    for (int i=0; i<ARRAY_SIZE(jailbreak_tool_pathes); i++) {
        if ([[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithUTF8String:jailbreak_tool_pathes[i]]]) {
            NSLog(@"The device is jail broken!");
            return YES;
        }
    }
    NSLog(@"The device is NOT jail broken!");
    return NO;
} 

2. 判断cydia的URL scheme

URL scheme是可以用来在应用中呼出另一个应用,是一个资源的路径(详见《iOS中如何呼出另一个应用》),这个方法也就是在判定是否存在cydia这个应用。

- (BOOL)isJailBreak
{
    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://"]]) {
        NSLog(@"The device is jail broken!");
        return YES;
    }
    NSLog(@"The device is NOT jail broken!");
    return NO;
} 

3. 读取系统所有应用的名称

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

#define USER_APP_PATH                 @"/User/Applications/"
- (BOOL)isJailBreak
{
    if ([[NSFileManager defaultManager] fileExistsAtPath:USER_APP_PATH]) {
        NSLog(@"The device is jail broken!");
        NSArray *applist = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:USER_APP_PATH error:nil];
        NSLog(@"applist = %@", applist);
        return YES;
    }
    NSLog(@"The device is NOT jail broken!");
    return NO;
} 

4. 使用stat方法来判定cydia是否存在----关于这个方法的代码有写错误尚未解决--一直提示 “dylib_name”找不到之类的,谁解决了,告知一声,谢谢!

这个方法本身思路还是通过判定cydia应用,但方法是用的stat函数,同时会判定是否有注入动态库。

#define CYDIA_APP_PATH                "/Applications/Cydia.app"
int checkInject()
{
    int ret;
    Dl_info dylib_info;
    int (*func_stat)(const char*, struct stat*) = stat;  

    if ((ret = dladdr(func_stat, &dylib_info)) && strncmp(dylib_info.dli_fname, dylib_name, strlen(dylib_name))) {
        return 0;
    }
    return 1;
}  

int checkCydia()
{
    // first ,check whether library is inject
    struct stat stat_info;  

    if (!checkInject()) {
        if (0 == stat(CYDIA_APP_PATH, &stat_info)) {
            return 1;
        }
    } else {
        return 1;
    }
    return 0;
}  

- (BOOL)isJailBreak
{
    if (checkCydia()) {
        NSLog(@"The device is jail broken!");
        return YES;
    }
    NSLog(@"The device is NOT jail broken!");
    return NO;
}  

5. 读取环境变量

这个DYLD_INSERT_LIBRARIES环境变量,在非越狱的机器上应该是空,越狱的机器上基本都会有Library/MobileSubstrate/MobileSubstrate.dylib

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

- (BOOL)isJailBreak
{
    if (printEnv()) {
        NSLog(@"The device is jail broken!");
        return YES;
    }
    NSLog(@"The device is NOT jail broken!");
    return NO;
} 

当然,判定一个设备是否越狱时,可以多种方法并用以确保准确。这里我还想说的是越狱有完美越狱还有非完美越狱,这本身就不是官方有保证的行为,所以情况也是复杂多变。iOS7针对沙盒机制也有了改进升级,有些情况对新的版本或许是不合适的,这点还需要实际情况实际处理。另外,还有fork一个子线程,看返回值等一些方法,这里也不再一一列举。(这个实际上我不是很清楚。。。)

最后,越狱毕竟会带来不安全因素的增加,尤其是金融工具装的比较多的情况下,强烈不推荐越狱。

时间: 2024-08-01 12:58:56

如何代码判断设备是否为越狱设备---的相关文章

JS 判断ipad android 等移动设备横竖屏代码 源码--AangJava

废话不多说,直接进入正题! <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta content="text/html; charset=UTF-8" http-equiv="Content-Type"> <title> JS 判断ipad android 等移动设备横竖屏代码 源码--AangJava</

iOS安全攻防之越狱设备检测

iOS 越狱(iOS Jailbreaking),是用于获取苹果公司便携装置操作系统iOS最高权限的一种技术手段,用户使用这种技术及软件可以获取到 iOS 的最高权限,甚至可能可以进一步解开运营商对手机网络的限制.手机越狱后会面临更多的安全风险,不建议对iOS设备进行越狱.在开发中可以针对越狱设备进行安全防范. 可以尝试用 NSFileManager 判断设备是否安装了越狱插件. #define ARRAY_SIZE(a) sizeof(a)/sizeof(a[0]) const char* j

xcode5越狱设备调试

所需设备:越狱后的iPhone一台,并且安装AppSync插件 10.9Mavericks,Xcode5.0.1,iOS6.1上测试通过,可完美调试无报错 与Xcode5以下版本的区别主要是在添加脚本的地方和进入Organizer的位置 部分图片与步骤转自http://blog.csdn.net/vrix/article/details/7851377,加入了Xcode5之后的新方法 第一步:制作证书 1)打开 Finder->应用程序->实用工具-> 钥匙串访问 2)单击:"

Android使用代码消除App数据并重新启动设备

/** * 使用代码消除App数据 * 我们不寻常的清除App数据,中找到相应的App * 然后选择其清除数据.以下给出代码实现. * * 注意事项: * 1 设备须要root * 2 该演示样例中删除的是系统级应用 * 2 注意在命令的末尾须要加上换行\n * 这就相当于我们平时在Dos中输入命令后再换行一样. * 否则命令不会被运行. */ private void cleanData(String packageName){ try { System.out.println("--->

解决CATextLayer在越狱设备上字体颜色问题。

最近在做画k线的一个悬浮窗时候,用到了CATextLayer,然后在排版的时候,越狱设备字体颜色一直为全黑,于是stackoverflow了一下,发现相似问题决解办法是这样的 然后还是没效果,我就猜测是否是因为颜色值根本没设上.在使用NSAttributedString的属性设置有问题.最开始设置文字颜色用的这个属性:NSForegroundColorAttributeName,然后尝试使用更底层的API: 完美解决!

在非越狱设备上使用 LLDB 调试第三方 App

说明 这个方法是在 iOS 8 刚发布的时候想到的,当时主要用来在非越狱的 iOS 8 设备上调试分析第三方已经支持 iOS 8 的 App,比如:UC 浏览器,下面也会使用 UCWEB 为例来说明一些命令. 原理 谈不上原理,主要就是利用 xcode 的工具链,当然如果对证书.签名.Entitlements 比较熟悉,可能会很自然的想到这个方法.当时想到方法后,就在 github 上搜索了一下发现已经有人写了相关的工具,下面跟大家说下具体如何操作. 工具 ios-deploy:https://

判断用户是在什么设备打开的页面

1.首先判断pc端还是移动端. function IsPC() { var userAgentInfo = navigator.userAgent; var Agents = ["Android", "iPhone", "SymbianOS", "Windows Phone", "iPad", "iPod"]; var flag = true; for (var v = 0; v <

shell判断USB接口是否有设备插入

#/bin/sh usb_num=$(cat /proc/scsi/scsi | grep "Vendor" | wc -l)if [ $usb_num = 2 ];then    echo "test usb success"else    echo "test usb failed"fi判断USB接口是否有设备插入,usb_num为检查到的USB设备个数. 原文地址:https://www.cnblogs.com/codeking100/p/

深入浅出~Linux设备驱动之字符设备驱动

一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面向流的设备,常见的字符设备有鼠标.键盘.串口.控制台和LED设备等. 块设备:是指可以从设备的任意位置读取一定长度数据的设备.块设备包括硬盘.磁盘.U盘和SD卡等. 每一个字符设备或块设备都在/dev目录下对应一个设备文件.linux用户程序通过设备文件(或称设备节点)来使用驱动程序操作字符设备和块设备