iOS 判断手机是否越狱

作者: 慕_風 | 来源:发表于2017-07-03 15:06 被阅读2400次

苹果安全支付机制

苹果是非常重视安全性的,所以给用户设计了一套复杂的安全机制。但是很多用户喜好自由或者是被一些商家恶意的,对手机进行了越狱。这严重的破坏了手机的安全性能,给一些恶意的应用打开了方便之门。

而在苹果支付中,苹果为了保护用户的隐私,支付凭证中不包含任何用户的Apple ID信息,所以我们的服务器在验证这个凭证的时候无法得知是谁的凭证,只能验证这个凭证的真伪。就像一些商家发行的不记名购物卡,只要卡是真的就可以使用,而不管你是否是这个卡的真正主人。

苹果的这种支付机制保护了用户的隐私,但也为不良的黑客提供了作案的机会。黑客可以对越狱的手机添加一种恶意软件,软件会窃取你支付过程中的支付凭证,然后伪造一份假的凭证,让你的支付验证在商家的服务器上失败,但你的钱却已经支付,黑客再使用你真正的支付凭证在其他的账号中验证支付,而商家的服务器验证该支付凭证是真的,商家则认为是黑客的账号购买了商品。这样黑客就盗取了用户的资金。

所以,为了保护用户的安全性,应该对越狱的手机,取消其支付功能。

那么,如何判断手机是否越狱呢?

1.通过越狱后增加的越狱文件判断

一般来说,手机越狱后会增加以下文件

/Applications/Cydia.app

/Library/MobileSubstrate/MobileSubstrate.dylib

/bin/bash

/usr/sbin/sshd

/etc/apt

判断这些文件是否存在,只要有存在的,就可以认为手机已经越狱了。

NSArray *jailbreak_tool_paths = @[
    @"/Applications/Cydia.app",
    @"/Library/MobileSubstrate/MobileSubstrate.dylib",
    @"/bin/bash", 
    @"/usr/sbin/sshd",
    @"/etc/apt"
];

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

2.根据是否能打开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.根据是否能获取所有应用的名称判断
没有越狱的设备是没有读取所有应用名称的权限的。

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

4.根据使用stat方法来判断cydia是否存在来判断
这个方法的思路还是通过判定cydia应用,但方法是使用stat函数,同时会判断是否有注入动态库。

int checkInject() {
    int ret;
    Dl_info dylib_info;
    int (*func_stat)(const char*, struct stat*) = stat;
    char *dylib_name = "/usr/lib/system/libsystem_kernel.dylib";
    if ((ret = dladdr(func_stat, &dylib_info)) && strncmp(dylib_info.dli_fname, dylib_name, strlen(dylib_name))) {
        return 0;
    }
    return 1;
}

int checkCydia() {
    struct stat stat_info;
    if (!checkInject()) {
        if (0 == stat("/Applications/Cydia.app", &stat_info)) {
            return 1;
        }
    } else {
        return 1;
    }
    return 0;
}

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;
}

以上5种方法均可以判断设置是否越狱,但为了保证判断的准确性,通常会多种方法联合使用。

总之,判断越狱的基本思想是根据越狱前和越狱后的一些权限改变或者增加的文件来判断的。虽然越狱会增加一定的便捷性,但是更多的是带来不安全因素,尤其是在现在各种移动支付已成为我们生活的一部分的时候,尤其要注意越狱对移动支付的影响。因此,本人强烈推荐不要越狱。

相关文章

  • iOS开发判断手机是否越狱

    iOS判断手机是否越狱,代码如下: 我曾执笔雕刻时光 奈何良辰难书过往

  • ios越狱检测

    目前所用越狱检测判断 判断手机越狱的几种方式: 通过手机越狱后增加的越狱文件判断 根据是否能打开cydia判断 3...

  • iOS 越狱代码检测

    判断手机越狱的几种方式: 1. 通过手机越狱后增加的越狱文件判断 2. 根据是否能打开cydia判断 3.根据是否...

  • 第一章

    如何判断手机是否越狱

  • IOS判断手机是否越狱

    苹果安全支付机制 苹果是非常重视安全性的,所以给用户设计了一套复杂的安全机制。但是很多用户喜好自由或者是被一些商家...

  • iOS 判断手机是否越狱

    苹果安全支付机制 苹果是非常重视安全性的,所以给用户设计了一套复杂的安全机制。但是很多用户喜好自由或者是被一些商家...

  • iOS判断手机是否越狱

    在进行模拟器测试时,由于电脑内存在第二个以及第三个常见越狱文件,一直判断已越狱。 判断是否越狱的常用几中判断方式

  • iOS 判断手机是否越狱

  • iOS 判断手机是否越狱

    判断手机是否越狱,只需要调用以下方法(包含三种方式,三选一即可)

  • iOS 判断是否越狱

    OC Swift

网友评论

  • 豪冷:strncmp(dylib_info.dli_fname, dylib_name, strlen(dylib_name)

    strncmp比较结果,相等返回 0

    如果结果不是 /usr/lib/system/libsystem_kernel.dylib 的话,那就100%被攻击了。
    (https://blog.csdn.net/yiyaaixuexi/article/details/20286929)

    所以,判断前面要 取反
  • 豪冷:第 4 种判断,有问题!手机没越狱,判断错了!
  • 5e592a492104:第一种方法在模拟器(iphone8 plus/XCode9.2)上运行显示是被越狱的。。。
    慕_風:首先谢谢你的反馈,因为第一种方法中的第二、第三文件已经存在于电脑上,所以第一种方法没法判断模拟器,因此以上方法只能应用在真机判读上。
  • 请叫我作家:根据使用stat方法来判断cydia是否存在来判断:dylib_name需要引用什么头文件?还是代表什么意思呢
    慕_風:dylib_name = "/usr/lib/system/libsystem_kernel.dylib"

本文标题:iOS 判断手机是否越狱

本文链接:https://www.haomeiwen.com/subject/yopacxtx.html