iOS安全防护---越狱检测、二次打包检测、反调试

引用自https://blog.csdn.net/u013602835/article/details/86545106

最近在调研越狱设备的检测、防止APP被二次打包、防止反调试以及逆向工程,调研期间做了大量的测试来验证方案的可行性,花费了很多时间。所以,在此将调研结果总结一下,供大家参考。


一、越狱环境下,提高App破解难度的方案:

1、检测是否被注入,阻止Cycript等的动态库注入。

2、在 Xcode 编译选项中 other linker flags 中添加 -Wl,- sectcreate,__RESTRICT,__restrict,/dev/null 标识。(注:这个方案只适合iOS10.0以下系统,而且个别系统打出来的包还会发生Crash,和Swift混编的项目时候可能会出问题,所以现在不建议用这种方式)

3、在关键业务上进行越狱检测,如果是越狱手机则进行提示或者直接退出程序,保证业务安全。


二、防止IPA包被二次打包的方案:

1、检测plist文件中是否有SignerIdentity值,SignerIdentity值只有ipa包被反编译后篡改二进制文件再次打包,才会有此值。(注:如果替换资源文件,比如图片、plist文件等是没有SignerIdentity这个值的。猜测只有改了二进制文件才会有此值(待验证) )

2、检测 cryptid 的值来检测二进制文件是否被篡改。网上说这也是一种解决方案,但是cryptid这个值好像在Mach-o中才有,目前还不知道如何获取该值。

3、IPA包上传到TestFlight或者App Store后,计算安装包中重要文件的MD5 值,服务器记录,在应用运行前首先将本地计算的 MD5 值和服务器记录的 MD5 值 进行对比,如不同,则退出应用。(注:该方案已经通过验证,项目已上线)


关于embedded.mobileprovision文件的探索:

      如果二次打包的话,一般篡改者都会更换一下IPA包里的embedded.mobileprovision文件,我想可不可以从这个文件入手来解决问题,通过验证这个文件的MD5值来做验证(CodeResources文件中已经有该文件对应的MD5值了)。经过测试发现,正常用Xcode打出来的包是有这个文件的,但是,IPA包上传到App Store被苹果处理之后,就没有这个文件了,所以,该方案不可行。

更新:      

     看了iOS App签名的原理之后,再对embedded.mobileprovision文件做一下详细说明。为什么IPA包上传到App Store被苹果处理之后就没有这个文件了呢?因为embedded.mobileprovision文件里边存储的是证书相关的公钥私钥信息,苹果会用自己的私钥验证这里边的内容,如果验证通过则说明该APP是安全的合法的,之后就会将该文件删除,因为,App Store的APP苹果会用自己的公钥私钥进行重签名(也就是加壳),这样该文件就失去它的意义了,所以被删除了。这也就是为啥证书过期之后,从App Store上已经下载过的APP还可以继续使用的原因。

     而通过企业证书分发的APP,IPA包里边还是有这个文件的,这时候苹果做安全校验的时候就是通过这个文件去做的,所以,如果企业证书过期了,这时候企业分发的APP就立马不能安装使用了,并且已经下载安装的APP也不能使用。

总结embedded.mobileprovision文件存在的情况:

   不存在该文件:App Store下载的IPA、Cydia商店(越狱手机上的)下载的IPA。

   存在该文件:Xcode打出来的IPA、企业证书分发的IPA、越狱手机上自己二次打包的IPA。


在此,着重对防止 二次打包方案3 做MD5校验的方案做一下总结,因为这里做了太多的尝试:

    这种方案的突破点是找到相关文件计算MD5值,但是具体用哪些文件来进行MD5验证呢?

    通过查看IPA包中的文件,我们会发现有一个CodeResources 文 件,打开这个文件可以看到是一个类似plist的文件,里边记录的是IPA包里各个文件的文件名和hash值。那么我们是不是可以直接对比这个文件来判断是否被二次打包呢?

    经过测试发现,Xcode打出来的包通过这个文件来验证是没有问题的,每次打出来的包这个文件都是一样的。但是,IPA包上传到App Store被苹果处理之后,这个文件就会发生变化,而且不同机型上还会存在不一样的情况,所以,该方案不可行。

   后来,我想要不就自己遍历所有的文件,自己对文件内容做MD5。最后,发现有些文件每次打包之后都会发生变化或者在不同机型上计算出来的MD5值不同,比如:Assets.car、.nib文件、二进制文件等。所以,该方案不可行。其实上边CodeResources文件不一致就是因为个别文件不一致导致的,因为CodeResources文件存储的就是所有文件的MD5值。

解决方案:

   最后,通过多次打包试验,我们采取的是将那些每次打包上传App Store,MD5值都会发生变化的文件过滤掉,这样计算出来的MD5值就是最终用来做验证的MD5值了。

(建议:为了保证线上App运行稳定,最好通过接口来做验证,做一个开关,这样如果线上发生问题的话可以让后台将开关关闭)


下面是几个方法,大家可以直接使用:

1、判断设备是否越狱。(其实越狱的判断有多种判断方式)

//是否越狱

+ (BOOL)isPrisonBreak

{

    if ([self isSimulator]) return NO;


    bool pb = NO;


    // 常见越狱文件

    NSArray *pathArray = @[

        @"/Applications/Cydia.app",

        @"/Library/MobileSubstrate/MobileSubstrate.dylib",

        @"/bin/bash",

        @"/usr/sbin/sshd",

        @"/etc/apt"

    ];

    for (int i = 0; i < pathArray.count; i++) {

        NSString *path = pathArray[i];

        if ([[NSFileManager defaultManager] fileExistsAtPath:path]) {

            pb = YES;

        }

    }

    // 读取系统所有的应用名称

    if ([[NSFileManager defaultManager] fileExistsAtPath:@"/User/Applications/"]){

        pb = YES;

    }


    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://"]]) {

        pb = YES;

    }


    struct stat stat_info;

    //使用stat系列函数检测Cydia等工具

    if (0 == stat("/Applications/Cydia.app", &stat_info)) {

        pb = YES;

    }


    // 读取环境变量

    char *checkInsertLib = getenv("DYLD_INSERT_LIBRARIES");

    if (checkInsertLib) {

        pb = YES;

    }


    return pb;

}

+ (BOOL)isSimulator {

#if TARGET_OS_SIMULATOR

    return YES;

#else

    return NO;

#endif

}

2、除了上文所说的采用计算文件MD5值的方式来判断是否被二次打包,也可以通过判断包中是否存在embedded.mobileprovision文件来做校验(因为正常上传到App Store的包中是不存在该文件的)。

+ (BOOL)isSecondIPA{

    //线上的包如果存在embedded文件,则认为是被二次打包了

    if ([[NSBundle mainBundle] pathForResource:@"embedded" ofType:@"mobileprovision"]) {

        return YES;

    } else {

        NSBundle *bundle = [NSBundle mainBundle];

        NSDictionary *info = [bundle infoDictionary];

        if ([info objectForKey: @"SignerIdentity"] != nil) {

            return YES;

        } else {

            return NO;

        }

    }

}

3、判断APP是否被反调试、是否被gcd\lldb进行动态调试。

      注意:该方法可能会被hook掉,比如使用fishhook来hook此方法。

      增强方案:1、调用syscall(26, 31, 0, 0, 0)。2、调用sysctl。3、直接编写汇编代码,利用svc 去触发CPU的中断命令。

// 阻止 gdb/lldb 调试

// 调用 ptrace 设置参数 PT_DENY_ATTACH,如果有调试器依附,则会产生错误并退出

#import <dlfcn.h>

#import <sys/types.h>

typedef int (*ptrace_ptr_t)(int _request, pid_t _pid, caddr_t _addr, int _data);

#if !defined(PT_DENY_ATTACH)

#define PT_DENY_ATTACH 31

#endif

void anti_gdb_debug() {

    void *handle = dlopen(0, RTLD_GLOBAL | RTLD_NOW);

    ptrace_ptr_t ptrace_ptr = dlsym(handle, "ptrace");

    ptrace_ptr(PT_DENY_ATTACH, 0, 0, 0);

    dlclose(handle);

}

int main(int argc, char * argv[]) {

#ifndef DEBUG

    // 非 DEBUG 模式下禁止调试

    anti_gdb_debug();

#endif

    @autoreleasepool {

        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));

    }

}


参考:

逆向开发

iOS App 签名的原理


iOS防护----反调试

iOS 逆向 -- 反调试 和 反反调试


iOS安全攻与防(总篇)

对 iOS app 进行安全加固

重组 IPA (打包再签名) - 窥打包签名流程

【腾讯Bugly干货分享】iOS 黑客技术大揭秘

iOS如何判断手机是否已越狱

'-Wl,-sectcreate,__RESTRICT,__restrict,/dev/null' 误区


iOS应用安全 - 完整性检测

设备是否越狱检测、ipa文件是否被篡改检测

越狱开发4-越狱开发防护与破解

————————————————

版权声明:本文为CSDN博主「大飞哥666」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/u013602835/java/article/details/86545106

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容