iOS App的加固保护原理

苹果系统的封闭性致使iOS APP安全性比较高,可是实际上iOS应用自己被破解的难度并不高,一旦在越狱设备上,ipa被分析就会变得很容易,本文经过讲解iOS APP的破解分析过程来引出咱们要如何的保护咱们的应用。通过保护,iOS APP的安全性会得到很大的加强,大大提升了破解者破解的难度。对于iOS开发者来讲,有必要了解这些措施,特别是针对一些金融、游戏类APP的开发。

1、iOS的安全问题

世所公认,iOS系统安全性很是高,不多出现漏洞,几乎不会中毒的状况。然而随着各类iOS安全隐患的频频出现,人们逐渐认识到,iOS跟Android同样也面临严重的安全问题。苹果宣称全部的iPhone都很安全,不会被恶意软件攻击,其实这只不过苹果封闭式的系统管理可以及时处理漏洞罢了,这也正是苹果不敢开放的缘由。css

咱们已经习惯,每一个新的iOS系统出来没多久,就会有大牛找到越狱的方法。比较有名的越狱团队如iH8Sn0w、Geohot、Comex等,以及国内的盘古团队。就像最新iOS 10.1.1版本,刚出来一个星期,安全研究员Luca Todesco就在推特上晒图自曝越狱成功,iH8Sn0w和盘古团队也取得了不错的进展。只要越狱了,iPhone手机就处于彻底裸奔状态,不少平时不能作的事情就能够作了,好比破解分析APP、大范围泄露用户隐私数据等。nginx

其中,跟咱们iOS开发者息息相关的问题,主要就是被破解、分析。APP被破解分析进而刷单做弊,或者APP被山寨以次充好等。APP一直以来存在的“山寨”现象,引发愈来愈多开发者的不满,山寨泛滥的后果将是劣币驱逐良币,打击创新者的积极性,形成恶性循环。sass

下面举几个例子:安全

山寨APP

1l.jpg

好比上面的《神庙逃亡》应用,左边是合法的,右边是山寨的,山寨的APP就把图标的背景色以及局部作了一些修改,看起来和正品是如此的类似。服务器

微信多开

微信破解.png

这类APP在淘宝上都有销售。正常状况,一个手机只能有一个微信帐号在线,可是微信分身版让用户能够在同一个手机上同时登陆多个微信号,这样能够知足一些用户的不一样需求,好比进行公众号营销、用不一样的微信号联系不一样的人等。同时这些破解后的微信还有一键转发小视频、一键评论、一键点赞等强大的功能。微信

自动抢红包

下面是一款红包神器的运行页面:网络

自动抢红包.png

打开这款神器后再登陆微信,若是微信群里有人发出红包,它就会第一时间帮你抢到红包了,今后“发家致富,迎娶白富美,走上人生巅峰”,哈哈!ide

那么,看起来如此高级的东东又是怎么实现的呢?下面咱们作简要的介绍,只有在了解了它们的实现原理后,咱们才能更好地保护咱们的APP不被分析、破解。函数

2、iOS分析方法

懂得如何攻击才会懂得如何防护,一切都是为了以后的防护做准备。这里总结一下为hack而作的准备工做。工具

2.1经常使用的命令和工具

表格.png

(1)otool可查看可执行程序都连接了哪些库。

代码1-2.png

(2)nm能够显示程序符号表。

 

nm -g DeviceInfo

 

代码2-1.png

(3)ldid:iPhoneOS.platform提供的签名工具。

咱们本身编译的程序须要签上名才能跑在iPhone/iPad上。

2.2 class-dump-z

它一般是和Clutch一块儿使用的,由于APP Store上的APP都是加密过的,须要先解密。Clutch解密后,就能够获得APP的源码结构,包括资源文件、二进制文件等,下面以XX新闻APP为例:

3-2.png

“class-dump NewsBoard”,就能够获得应用的类信息,包括函数名,下面是该APP的一个登录页面的头文件:

4-2.png

2.3 IDA等静态分析工具

静态分析iOS APP的工具除了IDA,还有一款强大的工具– Hopper Disassembler,在某些方面,它比IDA更强大。

5-1.png

上图显示,从IDA工具就能够看到该APP使用的一些类名和方法名,进而就能够分析到方法里面的实现逻辑了。

2.4实例

咱们在开发一款SDK的时候,想了解下公司外部竞品SDK的使用状况,到底有多少APP在集成他们的SDK。那么,这到底该怎么作呢?

去竞品那里打听?好像不太现实,惟一的办法就是“自动动手,丰衣足食”。咱们从XX助手上获取必定数量的APP,通常是拉取榜单的数据,比较有意义,而后分析拉到的APP里包含了哪些SDK。固然这得基于几率统计学的原理,获取足够多的样本,好比一万、十万都是能够的。那么又如何从XX助手服务器拉取这些数据呢?

你们可能都会想到,那就是分析XX助手的网络协议,而后经过代码模拟网络协议,请求数据,获取APP,再分析APP的符号。分析网络协议,最简单的就是网络抓包,可是估计如今很难再有裸奔的网络包了,XX助手确实也没有明文的网络包,因此只有逆向分析了。值得庆幸的是,它的APP没有作加固、保护,分析起来就简单多了。、

2.4.1界面分析

咱们首先从界面分析程序的大致逻辑结构。

来到XX助手的榜单页面,使用cycript打印界面布局:

 

[[UIAppkeyWindow]recursiveDescription].toString()

 

找到每个下载控件,这里随便找一个:

6-1.png

经过UITableViewCellContentView这个控件,找它的包含关系。

使用[#0x15baf520nextResponder]往上找,能够获得:TRTableMultipleViewCell。

TRTableMultipleViewCell分为3列,每一列包含一个TRAppListSubCell,而每一个TRAppListSubCell对应一个TRAppInfo对象,猜想这个TRAppInfo就是下载后的数据对象,Hook这个类的方法能够看到:

7.png

TRAppInfo对应一个App的相关信息,包括下载地址,为了得知这些信息是怎么初始化的。在-[TRAppInfosetAdsite:]下断点: b-[TRAppInfosetAdsite:],而后查看调用堆栈:

8.png

其中的一个类TRApiServices很像是网络请求的接口。Hook该类的调用输出,点击榜单,并有了如下log输出:

9.png

至此,咱们基本肯定了咱们须要的函数名了。

2.4.2逆向分析

接下来,就是逆向分析getChartsAppListForCountryId和parseGetChartsAppListData这两个函数了。

使用IDA工具打开XX助手APP,定位到getChartsAppListForCountryId这个函数:

10.png

再进一步去分析”writeBodyHeader”方法以及”getBody”等方法,就能够知道网络请求的发送格式了;要想知道网络数据返回的格式,还得去分析” parseGetChartsAppListData:error”这个方法,一切准备稳当后,就能够下载了。

3、iOS加固保护原理

从上面的分析来看,咱们能够从如下几个方面来保护咱们的APP:

1.字符串混淆

对应用程序中使用到的字符串进行加密,保证源码被逆向后不能看出字符串的直观含义。

2.类名、方法名混淆

对应用程序的方法名和方法体进行混淆,保证源码被逆向后很难明白它的真正功能。

3.程序结构混淆加密

对应用程序逻辑结构进行打乱混排,保证源码可读性降到最低。

4.反调试、反注入等一些主动保护策略

这是一些主动保护策略,增大破解者调试、分析APP的门槛。

3.1字符串加密

字符串会暴露APP的不少关键信息,攻击者能够根据界面显示的字符串,快速找到相关逻辑的处理函数,从而进行分析破解。加密字符串能够增长攻击者阅读代码的难度以及根据字符串静态搜索的难度。

好比一个APP中有以下的一些字符串定义在代码文件中:

12.png

通过加密后,代码文件变成以下的形式:

13.png

里面已经没有明文的字符串了,全是用byte的形式保存的,打包生成APP后,他们也就没法直观的看出实际内容了,这对破解者会形成巨大的难度:

15.png

3.2符号混淆

符号混淆的中心思想是将类名、方法名、变量名替换为无心义符号,提升应用安全性;防止敏感符号被class-dump工具提取,防止IDA Pro等工具反编译后分析业务代码。

好比一款混淆后的APP,用IDA等工具打开,以下图所示:

18.png

“Labels”栏里,显示的这些符号,无论是类名仍是方法名,谁也看不出来到底什么意思,这个函数究竟是什么功能,就有点丈二和尚摸不着头脑的感受,这就大大增长了破解者分析APP的难度。

3.3代码逻辑混淆

代码逻辑混淆有如下几个方面的含义:

对方法体进行混淆,保证源码被逆向后该部分的代码有很大的迷惑性,由于有一些垃圾代码的存在;

对应用程序逻辑结构进行打乱混排,保证源码可读性降到最低,这很容易把破解者带到沟里去;

它拥有和原始的代码同样的功能,这是最最关键的。

混淆先后的对好比下(左边是原始结构,右边是混淆后的结构):

16.jpg

下面以iOS APP中的main函数为例:

17.jpg

它就只有一行有效代码,包含两个关键函数,已经算最简单的函数体了,混淆前的汇编代码以下:

18.png

这里主要包含两个API的符号: NSStringFromClass、UIApplicationMain。其他就是一些消息发送以及内存管理的相关符号,但若是进行必定的代码逻辑混淆后,这个结构就会变得大不同了。

20-1.png

19.png

NSStringFromClass、UIApplicationMain这两个函数,逻辑结构已经变得很是复杂了,若是一个函数中,包含更多的代码的话,那这个结构将更加复杂,对破解者来讲将是一个很耗时间、精力的过程,通常早早就会放弃分析了。

3.4URL编码加密

对程序中出现的URL进行编码加密,防止URL被静态分析。

3.5网络传输数据加密

对客户端传输数据提供加密方案,防止经过网络接口的拦截获取数据。

3.6主动保护策略

除了上面的一些被动保护方法,咱们还能够加入一些主动的防御机制,好比反调试等。

iOS平台下的Anti-Debug方法通常有如下一些:

检查进程的状态是否为 P_TRACED。

调用ptrace请求来检查进程是否被调试。因为可能被攻击者绕过该方法的调用,在应用的多处增长ptrace函数会提升应用的安全性。

经过sysctl查看信息进程里的标记,判断本身是否正在被调试。sysctl是用以查询内核状态的接口,并容许具有相应权限的进程设置内核状态。

iOS下的这些方法,相对于Linux下的方法要少不少,例如fork一个子进程,ptrace父进程进行检测方式再也不奏效。并且,要彻底防止程序被调试或者被逆向,理论上是不可能的,但能够增长破解者调试的难度。

总之,添加以上的一些保护措施后,iOS APP的安全性会得到很大的加强,大大提升了破解者破解的难度。对于iOS开发者来讲,有必要了解这些措施,特别是针对一些金融、证券类APP的开发,保护方面的需求比较大,好比国内某知名移动支付工具就添加了一些调试检测以及反调试的功能。

相关文章
相关标签/搜索