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逆向工程主要有两个作用:
——本文摘自《iOS应用逆向工程 第2版》