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

    iOS 越狱(iOS Jailbreaking),是用于获取苹果公司便携装置操作系统iOS最高权限的一种技术手段,用户使用这种技术及软件可以获取到 iOS 的最高权限,甚至可能可以进一步解开运营商对手机网络的限制。手机越狱后会面临更多的安全风险,不建议对iOS设备进行越狱。在开发中可以针对越狱设备进行安全防范。

  可以尝试用 NSFileManager 判断设备是否安装了越狱插件。

#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"
};
#pragma mark - 判断设备是否被越狱
+ (BOOL)isJailBreak
{
    for (int i=0; i<ARRAY_SIZE(jailbreak_tool_pathes); i++) {
        if ([[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithUTF8String:jailbreak_tool_pathes[i]]]) {
            XSDLog(@"The device is jail broken!");
            return YES;
        }
    }
    XSDLog(@"The device is NOT jail broken!");
    return NO;
}

  可以通过尝试读取应用列表,看有无权限:  

if ([[NSFileManager defaultManager] fileExistsAtPath:@"/User/Applications/"]){
        NSLog(@"Device is jailbroken");
        NSArray *applist = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:@"/User/Applications/"
                                                                               error:nil];
        NSLog(@"applist = %@",applist);
    }

  未越狱设备是无法读取数据的,越狱设备是可以获得一个列表。

  使用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");
    }
}

  

  可以看看stat是不是出自系统库,有没有被攻击者换掉:

#import <dlfcn.h>  

void checkInject(void)
{
    int ret ;
    Dl_info dylib_info;
    int (*func_stat)(const char *, 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 。

  结果:

  

  通过检测程序当前运行的环境:

#include <stdlib.h>

void printEnv(void)
{
    char *env = getenv("DYLD_INSERT_LIBRARIES");
    NSLog(@"===%s", env);
}
结果:
2017-05-23 15:02:30.232140+0800 TestSecurityAdvance[16888:919836] ===(null)
  未越狱设备返回的是 null。

  参见:念茜的博客。

时间: 2024-08-29 14:38:52

iOS安全攻防之越狱设备检测的相关文章

iOS安全攻防之使用 Frida 绕过越狱设备检测

Frida 是 一款有趣的手机应用安全分析工具. 文章参考:Bypass Jailbreak Detection with Frida in iOS applications

xcode5越狱设备调试

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

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

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

Framework7学习笔记之 设备检测库

一:设备检测库 F7提供了API,用于检测app所运行的设备平台的相关信息.[注意:不是调用设备原生功能!] myApp.device.os string. 包含"android" (对于Android), "ios" (对于iOS), undefined (对于任意其他操作系统/平台) myApp.device.osVersion string. 包含操作系统版本号,只在Android和iOS设备上可用.例如,如果是iOS设备,且其版本为7.1,则会显示"

IOS系统之蓝牙外接设备

Ios系统对于蓝牙外接设备在iphone4以前都是蓝牙2.0的时候,需要通过苹果的审核,据统计通过率仅有2%左右,现在蓝牙2.0基本上处于淘汰状态,所以在这里就不考虑了. 现在iphone4s以后的设备(包括iphone4s.iPhone5.iphone5s.iphone6.iphone6s)的设备中都使用的是蓝牙4.0,所以我们讲一下蓝牙4.0的外接设备的使用. 蓝牙4.0的设备在使用的时候,不需要通过苹果公司外接设备的审核,所以使用起来会相对容易一些! 在使用的时候我们需要导入CoreBlu

如何使用谷歌模拟手机设备与设备检测

一.模拟手机设备 要求是在谷歌版本在32以上. .  二.设备检测 如新浪网有两种版本,一种是pc版,存放在www.sina.com.cn这个服务器上:另外一种是手机版,存放在www.sina.cn这个服务器上 原理是当用户输入网址www.sina.com.cn的时候,检测用户的设备,如果用户用的是pc,那么留在原地,如果检测用户的设备是手机访问的就跳转到www.sina.cn这个网址去(这样做是因为用户不可能记得住一个网站的那么多网址) 那么怎么检测设备呢? 就要用到device.js库,这是

HTML5 移动开发(移动设备检测及对HTML5的支持)

1.如何选择要使用的特性以及所面向的浏览器 2.哪些浏览器支持HTML5 3.如何检测是否支持HTML5 4.如何开发贷容错性的Web应用程序 5.CSS3媒体查询如何增强检测脚本 使用HTML5这类前沿预言时,可能会选择以下两种方案 一. 尽可能地靠拢新标准,忽略那些不支持的平台 二.不使用任何新技术,知道改标准被浏览器系统广泛支持. 现在我们要使用的是第三种方法:就是对新技术理智的取舍,并慎重处理兼容性问题,这样就能开发出对大多数用户都可靠且实用的Web应用程序. 有4种检测HTML5功能的

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

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

iOS安全攻防(二十三):Objective-C代码混淆

iOS安全攻防(二十三):Objective-C代码混淆 class-dump可以很方便的导出程序头文件,不仅让攻击者了解了程序结构方便逆向,还让着急赶进度时写出的欠完善的程序给同行留下笑柄. 所以,我们迫切的希望混淆自己的代码. 混淆的常规思路 混淆分许多思路,比如: 1)花代码花指令,即随意往程序中加入迷惑人的代码指令 2)易读字符替换 等等 防止class-dump出可读信息的有效办法是易读字符替换. Objective-C的方法名混淆 混淆的时机 我们希望在开发时一直保留清晰可读的程序代