检测iOS设备是否越狱的方法

cccccccc丶活宝

cccccccc丶活宝

2016-02-19 10:58

今天给大家分享的是由图老师小编精心为您推荐的检测iOS设备是否越狱的方法,喜欢的朋友可以分享一下,也算是给小编一份支持,大家都不容易啊!

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

首先,你可以尝试使用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。

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

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

#import dlfcn.h 
 
void checkInject(void) 

    int ret ; 
    Dl_info dylib_info; 
    int (*func_stat)(const charchar *, 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) 

    charchar *env = getenv("DYLD_INSERT_LIBRARIES"); 
    NSLog(@"%s", env); 


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

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

其实,最简单的方法就是查看你设备上是否多了越狱的目录,来看一个完整点的例子:
代码如下:

detectDevice.h

@interface
 UIDevice (Helper) 

-(BOOL)isJailbroken;

@end
detectDevice.m

@implementation
 UIDevice (Helper) 

-(BOOL)isJailbroken
 { 

    BOOL
 jailbroken = NO; 

    NSString
 *cydiaPath = @"/Applications/Cydia.app";

    NSString
 *aptPath = @"/private/var/lib/apt/";

    if

([[NSFileManager defaultManager] fileExistsAtPath:cydiaPath]) { 

        jailbroken
 = YES; 

    }

    if

([[NSFileManager defaultManager] fileExistsAtPath:aptPath]) { 

        jailbroken
 = YES; 

    }

    return

jailbroken; 

}

@end

然后在你代码中调用[UIDevice currentDevice] isJailbroken], 如果返回YES说明被破解了,为NO,则没被破解。

展开更多 50%)
分享

猜你喜欢

检测iOS设备是否越狱的方法

编程语言 网络编程
检测iOS设备是否越狱的方法

IOS检测指定路径的文件是否存在

编程语言 网络编程
IOS检测指定路径的文件是否存在

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

android 检测耳机是否插入方法

编程语言 网络编程
android 检测耳机是否插入方法

iOS设备刷机教程 iOS设备刷机技巧

iphone 手机软件
iOS设备刷机教程 iOS设备刷机技巧

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

检测Mac是否感染Flashback木马的方法

电脑入门
检测Mac是否感染Flashback木马的方法

iOS9越狱设备修改成iPhone6s型号教程

iphone iPhone 5s iPhone 6 iphone刷机
iOS9越狱设备修改成iPhone6s型号教程

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

iOS开发中对文件目录的访问及管理的基本方法小结

iOS开发中对文件目录的访问及管理的基本方法小结

JScript面向事件驱动的编程

JScript面向事件驱动的编程
下拉加载更多内容 ↓