iOS常用的逆向分析方法

iOS以高安全性著称,但它并非金刚不坏之身。对于信息安全而言,止大风于青萍之末是上上策。iOS开发者息息相关的问题主要是被破解、分析。APP一直以来存在的“山寨”现象,引起越来越多开发者的不满,山寨泛滥的后果将是劣币驱逐良币,打击创新者的积极性,造成恶性循环。懂得如何攻击才会懂得如何防御,本文梳理了iOS常用的分析方法。

1.iOS分析常用的命令和工具

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


(2)nm可以显示程序符号表。


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


我们自己编译的程序需要签上名才能跑在iPhone/iPad上。

2.class-dump-z 

它通常是和Clutch一起使用的,因为APP Store上的APP都是加密过的,需要先解密。Clutch解密后,就可以得到APP的源码结构,包括资源文件、二进制文件等,下面以XX新闻APP为例: 

 

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


3.IDA等静态分析工具

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


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

4.实例

我们想了解一个SDK的使用情况,到底有多少APP在集成该SDK。那么,这到底该怎么做呢?

我们首选获取一定数量的APP,一般是拉取榜单的数据,比较有意义,然后分析拉到的APP里包含了哪些SDK。当然这得基于概率统计学的原理,获取足够多的样本,比如一万、十万都是可以的。那么又如何从XX助手服务器拉取这些数据呢?

大家可能都会想到,那就是分析XX助手的网络协议,然后通过代码模拟网络协议,请求数据,获取APP,再分析APP的符号。分析网络协议,最简单的就是网络抓包,但是估计现在很难再有裸奔的网络包了,XX助手确实也没有明文的网络包,所以只有逆向分析了。值得庆幸的是,它的APP没有做加固、保护,分析起来就简单多了。

4.1界面分析

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

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

[[UIApp keyWindow] recursiveDescription].toString()

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


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

使用[#0x15baf520 nextResponder]往上找,可以得到:TRTableMultipleViewCell。

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


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

  

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


 至此,我们基本确定了我们需要的函数名了。  

4.2逆向分析

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

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

 

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

以上介绍了iOS常用的逆向分析方法,了解如何逆向分析,有助于对APP更好的进行加固保护。关于如何进行iOS加固,可以通过以下文章了解:

iOS应用加固是否必要?如何进行iOS加固?

iOS游戏的破解及防护

代码混淆的原理是什么?常见代码混淆方法介绍

如何系统有效地提升Android代码的安全性?