iOS逆向攻防实战( 五 )


6.1.防御手段一:代码混淆
iOS程序可以通过class-dump、、IDA等获取类名、方法名、以及分析程序的执行逻辑 。如果很容易被别人看到类名、方法名是干嘛用的,就很容易被人破解 。所以进行代码混淆,将加大别人的分析难度 。
在iOS中,代码混淆主要还是对源码进行混淆,比如类名、方法名、协议名、属性名 。通过宏定义混淆,例如把这个类的名字混淆成abcd:
abcd
如果直接将类名、方法名改成abcd什么的,确实可以混淆,但是自己维护也很麻烦 。
注意点:
● 不能用宏定义混淆系统方法
● 不能混淆init开头的方法
● 如果xib、用到的内容,需要修改一下,比如说控制器名用到了混淆,那么xib、中用到名称需要手动去修改一下,因为系统是不会帮你换的(使用某些工具可以自动化替换)
● 不要什么都去混淆,因为混淆代码太多上架会被拒,只混淆关键代码
● 可以考虑将需要混淆的代码就加个前缀,这样就跟正常代码好区分
6.2.防御手段二:反调试-
是一种对运行中的进程进行跟踪和控制的手段,通过,一个可以动态地读写另一个进程的内存和寄存器,包括指令空间、数据空间、堆栈以及所有的寄存器 。同时,还提供了一个非常很有用的参数,用来告诉系统阻止调试器附加,所以,最常用的反调试就是通过调用来实现 。
参数1:要做的事情
参数2:要控制的进程ID
参数3:地址
参数4:数据
参数3和参数4都由参数1决定要传递的地址和数据 。
参数1的列表
调用方式:
效果:
当我们尝试使用动态调试时,会直接报 fault:11错误 。
6.3.防御手段三:反注入
当自己编写的dylib无法加载到目标应用的时候,就表明此应用做了反注入保护 。我们可以通过Build->->改为YES,或者来设置 。这样在的时候,会检查注入库的签名与ipa的签名是否一致,签名不一致就无法注入 。
以下链接是官方给出的解决方案:
6.4.防御手段四:Hook检测
iOS上的Hook方式主要就两种,和 Hook 。
的原理是替换IMP,所以可以通过得到IMP地址所在的模块信息进行判断,示例如下:
Hook的原理是通过修改函数的前N字节内存,使程序跳转到自己编写的函数,我们要做的就是检测函数头部若干字节是不是被修改 。
6.5.防御手段五:越狱检测
很多应用为了确保安全性需要对越狱环境进行检测,如果机器越狱了则不启用某些敏感功能(比如微信的指纹支付功能,在越狱状态下就会自动关闭) 。
具体方案:
6.5.1.检测越狱商店及其附属文件
越狱环境几乎都安装了Cydia、Sileo及其附属文件,可以用下列代码检测:
6.5.2.尝试读取系统应用列表
如果设备已经越狱,就可以读取到系统应用列表的内容,以此来作为检测依据,可以用下列代码检测:
6.5.3.检测是否有效
是苹果公司提供的用来跳转到系统应用或跳转到其他应用的一种机制 。
这种机制提供了一种检测越狱的思路:
如果能打开Cydia或其他非官方应用,则说明已经越狱,利用“- (BOOL):(NSURL *)url”方法来测试相应应用的是否有效就能判定 。
6.6.防御手段六:完整性检测
完整性检测可以确认目标文件是否被脱壳、是否被静态注入、内容是否被修改、是否被重签名等 。常见的方式有:
6.6.1.加载命令检测
为了使未越狱的设备也能顺利使用插件,通常会在(加载命令)中增加一个或者的方式来指向自己的动态库路径,从而实现注入功能,这种方式通常也被称为“静态注入” 。