1.2 iOS应用逆向工程的作用

打个比喻,iOS逆向工程就像一杆长矛,专门刺破App看似安全的防护盾。有趣的是,很多制作App的公司还没有意识到这样一杆长矛的存在,固步自封地以为自己的盾坚不可摧。

对于微信和WhatsApp之类的IM应用,交流的信息是它们的核心;对于银行、支付、电商类的软件,交易数据和客户信息是它们的核心。所有的核心数据都是需要重点保护的,于是,开发人员通过反调试、数据加密、代码混淆等各种手段重重保护自己App,为的就是增加逆向工程的难度,避免类似的安全问题影响用户体验。

可是目前App防护所用到的技术跟iOS逆向工程所使用的技术根本就不是同一个维度的。一般的App防护,感觉就像是一个城堡,将App的MVC布置在城堡内部,外围圈上厚厚的城墙,看上去易守难攻,就像图1-1所示的这样。

图1-1 防御良好的城堡(图片来自刺客信条)

但是当我们站到高处,在天空中鸟瞰这个App所在的城堡,它的内部结构就不再是秘密,如图1-2所示。

图1-2 鸟瞰城堡(图片来自刺客信条)

这时,所有的Objective-C函数定义、所有的property、所有的导出函数、所有的全局变量、所有的逻辑完全暴露在我们面前,城墙的防护意义荡然无存。处在这个维度,城墙已经不再是阻碍,我们更应该关注的是如何从偌大的城堡里面找到想要找的那一个人。

此时,基于iOS逆向工程技术,可以在不破坏城墙的前提下,选择任意高维度地点进入低维度城堡,巧取而不强夺,通过监视甚至改变App的运行逻辑,从而达到获取核心信息,了解软件设计原理等战术目的。

说得似乎很玄乎,可事实就是如此。就笔者数年来对App和iOS系统本身进行逆向工程的经历和成果来看,iOS应用逆向工程可以“透视”绝大多数App,它们的设计理念与实现细节在逆向工程中暴露无遗。

以上比喻只是iOS逆向工程的一隅之见,但也形象地说明了iOS逆向工程的强大威力。概括起来,iOS逆向工程主要有两个作用:

·分析目标程序,拿到关键信息,可以归类于安全相关的逆向工程;

·借鉴他人的程序功能来开发自己的软件,可以归类于开发相关的逆向工程。

1.2.1 安全相关的iOS逆向工程

安全相关的IT行业一般会大量运用逆向工程技术。比如:通过逆向一个金融类App,来评定安全等级;通过逆向iOS病毒,来找到查杀的方法;通过逆向iOS系统电话、短信功能,来构建一个手机防火墙,等等。

1.评定安全等级

iOS中那些具有交易功能的App一般会先加密数据,然后将加密过的数据存储在本地或通过网络传输。如果安全意识不够强,就完全有可能将敏感信息(如银行账号和密码)直接用明文保存或传输,安全隐患极大。

假如一家有名望的公司考虑推出一款App,为了让App的质量能够对得起公司的声誉和用户的信任,该公司聘请一家安全机构来评估这个App的安全性。绝大多数情况下,安全机构无法拿到App的源代码,不能通过代码审核的方式正向分析App的安全性,因此,他们只有利用iOS逆向工程技术,尝试“攻击”这个App,然后依据结果评定其安全等级。

2.逆向恶意软件

iOS是智能移动终端操作系统,它同计算机操作系统没有本质区别。从第一代开始,它就已具备了上网功能,而互联网正是恶意软件传播的最好媒介。2009年暴露的Ikee病毒是iOS上公开的第一款蠕虫病毒,它会感染那些已经越狱并且安装了ssh服务,但是没有更改ssh默认密码“alpine”的iOS,将它们的锁屏背景图改成一个英国歌手的照片。2014年年底出现的WireLurker病毒会窃取用户隐私信息,并且可以通过PC和Mac传播,给iOS用户带来了比较严重的危害。

对于恶意软件的开发者来说,他们通过逆向工程定位系统和软件漏洞,利用漏洞渗透进目标主机,获取数据,为所欲为。

对于杀毒软件的开发者来说,他们通过逆向工程剖析病毒样本,观察病毒行为,尝试查杀被感染主机上的病毒,并总结出可以防范病毒的方法。

3.检查软件后门

开源软件的一大优势是其具有较好的安全性。成千上万的程序员浏览并修改开源软件的代码,代码中几乎不可能存在任何后门,软件的安全问题往往在大白于天下之前就能及时得到解决。而对于闭源软件,逆向工程是检查其是否留有后门的主要方法之一。比如我们常会在越狱iOS中通过AppStore以外的渠道安装各种软件,这些软件未经苹果官方审核,存在一定安全隐患;还有的App会故意留有后门,伺机损害用户的利益。对这一类行为进行检测的过程中通常少不了逆向工程的身影。

4.去除软件使用限制

iOS开发者通过AppStore或Cydia等渠道出售自己的App,作为他们最主要的经济来源之一。在软件的世界里,收费与盗版永远是共存的,不少开发者也在自己的App里加入了防止盗版的功能。但这场矛与盾的战争永远不会停止,再好的防御也会有被攻破的一天,盗版软件的层出不穷把防止盗版变成了一项不可能完成的任务。比如Cydia上最知名的“共享”源xsellize能够在几乎所有收费软件发布后的1天时间内对其完成破解,是业界的一大毒瘤。

1.2.2 开发相关的iOS逆向工程

对于iOS开发者来说,逆向工程是最为实用的技术之一。例如,工程师可以逆向系统API,在自己的App里使用一些文档中没有提及的私有功能,还可以逆向一些经典软件,学习借鉴它们的技术和设计。

1.逆向系统API

工程师编写的软件之所以能够运行在操作系统中,提供各种各样的功能,是因为操作系统本身已经内嵌了这些功能,软件只是对其进行重新组合罢了。众所周知,能在App Store上架的App的功能十分有限,在苹果公司严格的审核制度下,绝大多数App的实现都源于公开的开发文档,而不能使用诸如发短信、打电话等文档中不涉及的功能。如果你的软件面向Cydia,那么不采用非公开功能将会导致软件丧失极大的竞争力。如果你的软件想拥有文档里没有提及的非公开功能,最有效的途径就是逆向iOS系统API,还原系统实现相应功能的代码,并应用到自己的软件中。

2.借鉴别的软件

逆向工程最受欢迎的应用场合就是“借鉴”他人的软件功能。对于App Store上的大多数App来说,其技术实现并不复杂,巧妙的创意和良好的运营才是其成功的关键。如果只是单纯借鉴其功能,那么采用逆向工程来还原代码,费时费力,性价比低,不如从头开发一个功能类似的软件省时省力,性价比高。但是,当我们不知道App中的某个功能是如何实现的时候,逆向工程就能起到关键性的作用。这种情况在大量使用私有函数的Cydia软件中尤其常见,比如2013年3月面世的,号称iOS上第一款通话录音软件的Audio Recorder,它是闭源软件,但足够有趣,此时使用iOS逆向工程技术就能够对它了解一二。

有些老牌软件的架构设计合理,代码工整规范,实现得非常优雅。我们没有他们那样深厚的技术功底和人才储备,想要借鉴他们使用的高级技术,却又求学无门。在这种情况下,逆向工程就是解决问题的金钥匙。通过逆向那些软件,可以从App中把它们的设计思路抽象出来为我所用,从而提高自己App的精致程度。比如,WhatsApp的稳定性、健壮性出类拔萃,如果我们自己要编写一个IM类App,通过逆向工程技术学习WhatsApp的整体架构与设计思路将是非常有益的。