iOS应用逆向工程(第2版)
上QQ阅读APP看书,第一时间看更新

第1章

iOS逆向工程简介

虽然可口可乐的配方是高度机密,但还是有些公司可以调制出跟可乐几乎没有差别的味道。虽然我们拿不到别人App的源码和文档,但仍可以通过逆向工程来一窥究竟。

1.1 iOS逆向工程的要求

iOS逆向工程指的是在软件层面上进行逆向分析的一个过程。读者如果想要具备较强的iOS逆向工程能力,最好能非常熟悉iOS设备的硬件构成、iOS系统的运行原理,还要具备丰富的iOS开发经验。如果你拿到任意一个App之后能够大致推断出它的项目规模和使用的技术,比如它的MVC(Model-View-Controller,请Google“iOS MVC”)模型是怎么建立的,引用了哪些framework和经典的开源代码,说明你的iOS逆向工程能力已经不容小觑了。

这要求高吗?好像确实有点高!不过,这些条件都是充分非必要的。如果你目前还不具备这些充分条件,那么一定要满足两个必要条件:强烈的好奇心和锲而不舍的精神。因为在iOS逆向工程中,好奇心会驱动你去研究经典的App,而在研究的过程中一定会遇到一系列的困难和障碍,但你又不可能对任何问题都胸有成竹,所以这时就需要有锲而不舍的精神来支撑你克服一个又一个困难。请相信,在投入大量精力去编写代码、调试程序、分析逻辑之后,你会在不断的试验和错误中感受到逆向工程的艺术之美,你的个人能力也会得到质的提升。

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的整体架构与设计思路将是非常有益的。

1.3 iOS应用逆向工程的过程

要逆向一个App时,应该怎么思考?应该从何入手?这本书的初衷就是引导初学者走进iOS逆向工程的大门,培养读者从逆向的角度思考问题。

一般来说,软件逆向工程可以看作系统分析和代码分析两个阶段的有机结合。在系统分析阶段,要从整体上观察目标程序的行为特征、文件的组织架构,从而找到我们感兴趣的地方,进入代码分析阶段后,则要把软件的核心代码还原出来,最终达到我们的目的。

1.3.1 系统分析

在系统分析阶段,应在不同的条件下运行目标程序,在程序中进行各种各样的操作,观察程序的行为特征,同时寻找我们感兴趣的功能点。比如选择哪个选项会弹框,按下哪个按钮会发声,输入什么内容屏幕会有什么显示,等等。还可以浏览文件系统,观察程序显示的图片、程序的配置文件存放的位置,数据库文件中存放了哪些信息,有没有加密等特征。

以新浪微博App为例,我们在查看它的Documents目录时,会看到如下一些数据库文件:

-rw-r--r-- 1 mobile mobile  210944 Oct 26 11:34 db_46100_1001482703473.dat
-rw-r--r-- 1 mobile mobile  106496 Nov 16 15:31 db_46500_1001607406324.dat
-rw-r--r-- 1 mobile mobile  630784 Nov 28 00:43 db_46500_3414827754.dat
-rw-r--r-- 1 mobile mobile 6078464 Dec  6 12:09 db_46600_1172536511.dat
……

用SQLite工具打开它们,可以看到一些微博关注信息,如图1-3所示。

这样的信息给逆向工程提供了很多线索:数据库文件名、微博用户的ID,用户信息对应的URL等,这些都可以作为逆向工程的切入点。寻找和整理这些线索,从中抽丝剥茧找到我们感兴趣的东西,往往是iOS逆向工程的第一步。

图1-3 新浪微博数据库信息

1.3.2 代码分析

完成系统分析之后,就该对App的二进制文件进行代码分析了。

通过逆向工程,可以推导出这个App的设计思路、内部算法和实现细节,但这是一个非常复杂的过程,可以说是一种解构再重组的艺术。想让自己的逆向工程水平达到艺术的高度,需要对软件开发、硬件原理和iOS系统有透彻的理解。一点一点地分析程序的底层指令绝非易事,也不是一本书能够完全阐述清楚的。

本书的目标仅仅是向初学者讲述iOS逆向工程入门时所用到的工具和一般思路,但技术是不断发展的,书中的内容不可能覆盖所有的知识点。出于这个考虑,笔者搭建了一个iOS逆向工程论坛http://bbs.iosre.com,供大家讨论和交流最新的技术。

1.4 iOS应用逆向工程的工具

了解了一些iOS逆向工程的理论,就要使用各种工具实践这些理论了。相对于正向开发,逆向工程使用的工具并不那么“智能”,很多工作需要我们手工完成。但是对工具的熟练使用能够极大地提高逆向工程的效率。iOS逆向工程的工具可以分为四大类:监测工具、反汇编工具(disassembler)、调试工具(debugger),以及开发工具。

1.4.1 监测工具

在iOS逆向工程中,起到嗅探、监测、记录目标程序行为的工具统称为监测工具。这些工具通常可以记录并显示目标程序的某些操作,如UI变化、网络活动、文件访问等。iOS逆向常用的监测工具有Reveal、snoop-it、introspy等。

图1-4所呈现的是一款监测工具——Reveal,它可以用来实时监测目标App的UI布局变化。

图1-4 Reveal

Reveal能够辅助定位App中我们感兴趣的部分,让我们能够迅速从UI层面切入代码层面。

1.4.2 反汇编工具

从UI层面切入代码层面后,就要用到反汇编工具来梳理代码了。反汇编工具把二进制文件作为输入,经过处理后输出这个文件的汇编代码;在iOS逆向工程中,常用的反汇编工具主要是IDA和Hopper。

作为老牌反汇编工具,IDA是逆向工程中最常用的利器之一。它支持Windows、Linux、OSX平台和多种处理器架构,如图1-5所示。

Hopper是一款近年面世的反汇编工具,它主要针对的是苹果系操作系统,如图1-6所示。

把二进制文件反汇编之后,就要阅读生成的汇编代码了。这是iOS逆向工程中最具挑战,也是最有意思的部分,具体会在第6章详细讲述。本书主要以IDA作为反汇编工具,但我们会在http://bbs.iosre.com交流Hopper的使用心得。

图1-5 IDA

图1-6 Hopper

1.4.3 调试工具

iOS开发者对调试工具应该不陌生,在App开发中,少不了在Xcode中调试代码。我们可以在某一行代码上设置断点,使进程能够停止在那一行代码上,并实时显示进程当前的状态。在iOS逆向工程中,用到的调试工具主要是LLDB。图1-7是使用LLDB进行调试的示例。

图1-7 LLDB

1.4.4 开发工具

从UI层面切入代码层面,用反汇编工具和调试工具分析过二进制文件后,就可以整理分析结果,用开发工具写程序了。对于App开发者来说,Xcode是最常用的开发工具。但是我们一旦将战场从AppStore转移到越狱iOS,开发工具的种类就得到了扩充,不但有基于Xcode的iOSOpenDev,还有偏命令行的Theos。从个人体验来说,Theos是让笔者最为兴奋的开发工具,在知道Theos之前,笔者感觉自己一直都被限制在AppStore中,直到掌握了Theos的用法,才突破了AppStore,完整地认识了整个iOS系统。本书主要以Theos作为开发工具,关于iOSOpenDev的问题,可以到http://bbs.iosre.com交流讨论。

1.5 小结

本章科普了iOS应用逆向工程的相关概念,旨在让读者对iOS逆向工程有一个概念上的大体了解。详细的技术内容和案例会在后面的章节中逐一讲解,敬请期待。