最近在调研越狱设备的检测、防止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_SIMULATORreturn YES;
#elsereturn 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
#endifvoid 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-越狱开发防护与破解

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

  1. 反调试方法---0xCC检测--检验API断点实现反调试

    反调试 0xCC检测 软件断点的原理:调试器在对应设置断点的位置上修改该地址的字节为0xCC.若是关键位置检测到该指令,可以判断进程处于调试状态. 0xCC既可以是INT 3指令,也可以是其他指令的操 ...

  2. [系统安全] 二十四.逆向分析之OllyDbg调试INT3断点、反调试、硬件断点与内存断点

    您可能之前看到过我写的类似文章,为什么还要重复撰写呢?只是想更好地帮助初学者了解病毒逆向分析和系统安全,更加成体系且不破坏之前的系列.因此,我重新开设了这个专栏,准备系统整理和深入学习系统安全.逆向分 ...

  3. Android安全防护之旅---Android应用反调试操作的几种方案解析

    一.前言 在之前介绍了很多破解相关的文章,在这个过程中我们难免会遇到一些反调试策略,当时只是简单的介绍了如何去解决反调试,其实在去年我已经介绍了一篇关于Android中的安全逆向防护之战的文章:And ...

  4. 和 iOS 开发聊聊越狱

    Python实战社群 Java实战社群 长按识别下方二维码,按需求添加 扫码关注添加客服 进Python社群▲ 扫码关注添加客服 进Java社群▲ 作者 | Peter Steinberger  来源 ...

  5. Android 应用防止被二次打包指南

    前言 "Android APP二次打包"则是盗版正规Android APP,破解后植入恶意代码重新打包.不管从性能.用户体验.外观它都跟正规APP一模一样但是背后它确悄悄运行着可怕 ...

  6. EasyClick iOS脚本免越狱免硬件实现方案_可云控大量部署

    iOS脚本免越狱免硬件实现方案 硬件实现 电脑中控方案 免越狱无硬件方案 硬件实现 一般实现都是采用外加一个硬件的方案,采用使用易语言编程. 这样的方案缺点: 1.硬件板子不稳定,没有经过严格的质量检 ...

  7. (翻译)开始iOS 7中自动布局教程(二)

     (翻译)开始iOS 7中自动布局教程(二) 这篇教程的前半部分被翻译出来很久了,我也是通过这个教程学会的IOS自动布局.但是后半部分(即本篇)一直未有翻译,正好最近跳坑翻译,就寻来这篇教程,进行 ...

  8. Jetson Nano 从入门到实战(转载)(案例:Opencv配置、人脸检测、二维码检测)

    目录 1. Jetson Nano简介 2. Jetson Nano环境配置 2.1 开箱配件介绍 2.2 烧录系统 2.3 开机和基本设置 2.4 开发环境配置 2.4.1 更新源和软件 2.4.2 ...

  9. ios代码中的内存泄露,内存检测工具leaks 检测不出来

    iphone开发过程中,代码中的内存泄露我们很容易用内存检测工具leaks 检测出来,并一一改之,但有些是因为ios 的缺陷和用法上的错误,leaks 检测工具并不能检测出来,你只会看到大量的内存被使 ...

最新文章

  1. String.format()【演示具体的例子来说明】
  2. 邮件服务器 之 基于FreeBSD和Postfix的邮件系统与邮件列表的web mail安装
  3. 专访:经历了时间检验的不仅是论文,还有唐杰自己 | SIGKDD 2020时间检验奖
  4. 人工智能中对机器学非常简要的介绍
  5. pandas 分组统计的三个函数 pivot table crosstab groupby
  6. systematic literature review how to write it?
  7. 棋盘代码_【案例】 绘制国际象棋棋盘?(turtle 登场)
  8. 1bit和1byte_1byte等于( )bit_学小易找答案
  9. OSI七层模型及应用
  10. lt;九度 OJgt;题目1545:奇怪的连通图
  11. 林锐:5 C++/C程序的基本概念
  12. 计算机无法识别 手机,手机连接电脑无法识别usb设备的解决教程
  13. python因子分析_python中的因子分析简介
  14. epic注册什么服务器最好,epic国内有服务器吗(epic服务器在哪)
  15. 超实用后台UI模板有这些就够了!(二)
  16. 电脑计算机u盘启动不了桌面图标,电脑开机后没有桌面图标
  17. 浅谈关于申请CCC认证以后的好处
  18. wzoi基础题库7:竖式计算
  19. go hive skynet_hive,skynet以及go语言
  20. Mesos Architecture

热门文章

  1. python之flappy bird(飞扬的小鸟)小游戏分享,内附源码哦~
  2. InterviewQuestion
  3. Javascript 入门级 编写简单的音乐播放器
  4. Robomaster视觉组成长之路
  5. Matlab视频处理
  6. 华为p40会不会有鸿蒙系统,华为p40是不是鸿蒙系统
  7. fastadmin需要php,fastadmin修改后台入口提示 模块不存在:admin.php
  8. python统计单词个数算法_python 统计单词个数和频次
  9. SAP-MM知识精解-计划协议-01
  10. 安卓app32位升级64位框架