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

2016-02-19 10:58 114 1 收藏

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

【 tulaoshi.com - 编程语言 】

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

首先,你可以尝试使用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 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版本越狱环境。

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

detectDevice.h

@interface
 UIDevice (Helper) 

-(BOOL)isJailbroken;

@end
detectDevice.m

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

@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

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

jailbroken; 

}

@end

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

来源:http://www.tulaoshi.com/n/20160219/1596223.html

延伸阅读
标签: 怀孕
怎么检测是否怀孕 正确验孕 一般验孕笔会标示准确率,例如95%、98%等,若无标示,并不表示准确率百分之百,因为有某些因素会造成验孕笔失效。 验孕笔可能失效 验孕笔失效可以两种型态表示: 1 已怀孕,但验出来显示没有怀孕,即验孕笔不够敏感:可能的原因包括验孕笔过期、药剂已失效;另一种原因是厂商使用的药剂有问题。 2 未怀孕,但...
iPhone如何检测设备已被感染   对于使用苹果iPhone、iPad等用户来说,有相当一部分人都喜欢通过越狱获取更多权限,不过目前传出消息,目前有部分越狱的iOS设备中已经被一款可以窃取用户账号和密码的病毒感染。 据德国手机安全商SektionEins称,这一病毒经常试图将窃取到的苹果账号和密码以明文形式不断向一个中国IP23.88.10.4(不...
让谷歌搜索成为iOS设备默认应用的方法 NowNow并没设有主屏幕图标,用户必须通过设置选定激活方法,开发者建议最好使用短暂按住 Home 键激活。 开发者表示这款插件对那些旧款的设备尤其实用。只要使用提前设定的激活方法就能通过 NowNow 启动谷歌搜索应用。
太极iOS8.1.1越狱失败解决方法   1.1001设备断开 提示此代码时,表示在越狱过程中设备与电脑之间的联系断开了。在越狱过程中不要对设备进行任何操作,确保设备处于连接状态。建议使用原装苹果数据线,防止山寨数据线因质量问题而出现断开问题。 2.1002设备有密码保护 提示此代码时,表示越狱的iPhone/iPad的密码锁...
标签: 怀孕 孕期 孕妇
1、孕妇感知变化 通常计算孕周和预产期是从末次月经推算出来的,而怀孕期间各种妊娠反应都会预兆着到了某一个孕期阶段,只要把推算出来的孕周和实际变化对应的孕周作对比,再参考产检出来的各项数据,就可以得知胎儿发育是否成熟。通过孕妇感知变化来得知胎儿发育是否成熟,是一种比较简单的检查方法。 2、X射线检测 X...

经验教程

492

收藏

94
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部