iOS 逆向工程

wb8y

贡献于2013-12-02

字数:0 关键词: iOS 开发 移动开发

《iOS 应用逆向工程—分析与实战 》第 1 章 第 1 章 iOS 逆向工程简介 软件的逆向工程,指的是通过分析一个程序或系统的功能、结构或行为,将它的技术实现或设 计细节推导出来的过程。当我们因为工作需要,或是对一个软件的功能很感兴趣,却又拿不到它的 源代码时,往往可以通过逆向工程的手段对它进一步分析。 对于 iOS 开发者来说,运行在 iOS 平台上的各种软件是我们知晓的最复杂而奇妙的虚拟物品 之一,它们精巧而细致,新颖且创意十足。作为开发人员,在使用这许多经典的 app 的同时,除了 会称赞 app 的实现效果之外,也会经常思考:它们的架构是如何搭建的?它们的运行机制又具体是 什么样的? 虽然 iOS app 从理论上说是一个运行于沙箱(sandbox)中的程序,但并不表示我们就结它束手无 策。接下来,我们就要引入 iOS 软件逆向工程的概念。 1.1 iOS 软件逆向工程的要求 iOS 软件逆向工程是一个在软件层面上进行逆向分析的过程。读者如果想要达到对 iOS 软件的 较强的逆向分析能力,最好非常熟悉 iOS 设备的硬件构成、iOS 系统的运行原理,还要具备丰富的 iOS 开发经验。比如:拿到一个 app 之后能够清晰的推断出这个 app 使用的技术,比如引用了哪些 Framework、哪些经典的第三方代码,还有整个 app 工程大致的文件个数、大致的代码行数,以及 如果由自己来组织设计开发,需要投入的人员、时间和精力。 这要求是不是有点高?其实真的不算高!不过,这些条件都是充分非必要的。如 果 你 目 前 还 不 具备这些技术条件,那么剩下的一个必要条件一定要满足:强烈的好奇心和锲而不舍的精神。因为 在 iOS 软件逆向工程的过程中,好奇心驱动你去钻研经典的 app,而在钻研的过程中会遇到一系列 的困难和障碍,各种各样的技术坑,别人埋的、自己挖的,此时就需要锲而不舍的精神来支撑你一 步步的向前进。但是请相信,在投入大量精力去编写代码、调试程序、分析逻辑之后,你会在不断 的试验和错误中感受到逆向工程艺术之美。 1.2 iOS 软件逆向工程的作用 打个比喻,iOS 逆向工程就像一杆长矛,专门用于刺破目标程序本以为安全的盾。刺破之后, 直捣黄龙,而不是拘泥于一点点的攻城拔寨。 《iOS 应用逆向工程—分析与实战 》第 1 章 说的似乎很悬,让人觉得逆向工程简直是无所不能,而我们往往也会在无情的事实面前被告知: 这是真的。 对于微信、陌陌、WhatsApp 之类的 IM 软件,交流的信息是它们的核心;对于银行、交易支 付、电商类软件,交易和客户信息是它们的核心。所有的核心数据都是需要重点保护的,于是,数 据库加密、网络连接加密、云存储,重重保护,为的就是让使用者能够高枕无忧。 可是 iOS 逆向工程与这些常规 app 不是同一个维度的东西!(向《三体》致敬,也请原谅我在 本章中将这些概念与《三体》小说中的典故合并在一起,对于没有看过《三体》的朋友,就请把我 的话当成胡言乱语吧) 从维度的角度来解释,我们看待常规 app 的感觉更象是将 app 的所有数据、UI、逻 辑 内 容 都 平 展地铺开在一张二维的大纸上,外围圈上厚厚的城墙。它的平面图的概念如同图 1-1 所示的 Google 地图一般: 图 1-1 但是当我们跳跃到城墙之外,在三维的天空中俯瞰这个 app 的二维城堡,这个城堡的内部结构 几乎完全开放在眼前:所有的 ObjC 函数定义、所有的接口数据、甚至所有的函数内执行代码。城 墙的防护意义已经荡然无存!此时限制我们的只是这个二维平面城堡到底有多大,里面的内容到底 有多丰富,以及排列整齐有序还是杂乱无章。 《iOS 应用逆向工程—分析与实战 》第 1 章 此时,基于逆向工程的技术能力,可以选择想进入的任意点“高维进入”,监视甚至改变二维 平面上的运行逻辑,而不是从二维世界打破外围城墙强行攻破。 不恰当的比喻说了这么多,回到正题。从概括的角度来说,iOS 逆向工程主要有 2 个作用: 1、攻破目标程序,拿到关键信息,可以归类于安全相关的逆向工程; 2、借鉴别人程序功能来开发自己的软件,可以归类于开发相关的逆向工程。 接下来就让我们将这些内容逐步展开。 1.2.1 安全相关的 iOS 逆向工程 从前面的内容介绍也可以大致了解,iOS 逆向工程最突出的作用就是与安全相关。比如:工程 师通过逆向一个金融类 app,来评定这个软件的安全等级;安全专家通过逆向 iOS 病毒,来找到杀 毒的方法;破解者逆向一个需要注册的 Tweak 插件(后面会详细介绍具体的概念), 来 达 到 免 费 使 用的目的。 1、评定安全等级 iOS 中那些具有交易功能的 app 一般会先加密敏感数据,然后将加密过的数据存储在本地或通 过互联网传输;而如果安全意识不够强,就完成可能将重要的用户信息,如银行账号和密码直接用 明文保存或传输,安全隐患极大。 假如一个有名望的公司推出了一款 app,他们当然希望自己 app 的质量能够对得起用户的信任, 于是请一家安全公司帮忙评估这个 app 的安全性。这家安全公司自然是不会被授权使用这个 app 的 源代码的,正向分析其安全性不可行,所以他们只有通过逆向工程,来尝试“攻击”这个 app,依 据结果评定其安全等级。 补充说明:前面的“维度攻击”概念已经提及,低维的 app 可以防守的如铜墙铁壁一般,但是 依旧挡不住高维的逆向攻击。但这不等于可以得出 app“不安全”的结论,因为所有这些逆向分析 能够统计出目标 app 中的可被攻击点的多少,可攻击点越少,自然是越安全的;而且逆向工程的概 念均来自于一个前提:iOS 越狱。只要使用者保持自己的手机不越狱,那么他就是安全的,如同那 些把自己包裹在“慢雾”之中的文明一般(抱歉,我又一次引用《三体》中的名词)。 2、逆向恶意软件 iOS 是智能移动终端操作系统,它同计算机操作系统已没有本质区别。从第一代 iOS 开始,它 就已具备了上网功能,而互联网正是恶意软件传播最好的媒介。2009 年暴露的 Ikee 病毒是 iOS 上 公开的第一款蠕虫病毒,它会感染那些已经越狱,并且安装了 SSH,但是又没有更改其默认 root 密码“alpine”的 iOS 设备,并且将它们的锁屏背景图改成一个英国歌手。 《iOS 应用逆向工程—分析与实战 》第 1 章 对于恶意软件的开发者来说,他们通过逆向工程定位系统和软件漏洞,利用漏洞渗透进目标主 机,获取敏感数据,甚至为所欲为。 对于杀毒软件的开发者来说,他们通过逆向工程剖析病毒样本,观察病毒行为,尝试杀掉被感 染主机上的病毒,并总结出可以防范病毒的方法。 3、破解软件使用限制 iOS 开发者通过 App Store 或 Cydia 出售自己的 app,作 为 他 们 最 主 要 的 经 济 来 源 之 一 。在 软 件 的世界里,收费与盗版永远是同时存在的,而不少 iOS 开发者也在自己的 app 里加入了反盗版的功 能。但这场矛与盾的战争永远不会停止,再好的防御也会有被攻破的一天,防止盗版几乎是一项不 可能完成的任务。Cydia 上最知名的“共享”源 xsellize 能够在几乎所有收费软件发布后的 3 天内 对其完成破解,让他们的用户免费享受到收费软件的功能。 4、检查软件后门 开源软件的一大好处是其较好的安全性。成 千 上 万 的 程 序 员 浏 览 并 修 改 开 源 软 件 的 代 码 ,代 码 中几乎不可能存在任何后门,软件的安全问题往往在大白天下之前就能得到及时解决。而对于闭源 软件,逆向工程是检查其软件后门的方法之一,比如我们现在的越狱 iPhone 上经常会安装 360、 金山、腾讯等各家手机安全助手,这些服务程序的权限极高,无一例外都拥有超强的能力,可以访 问用户的通话记录、短信记录,甚至更多,但我们不知道它们会不会收集不该收集的用户信息,并 把这些信息上传到自己的服务器。这种“有或没有”的结论一直是个争议,我们得不到可信的官方 数据,那么就只能通过逆向工程来检查该软件是否存在类似后门。 补充说一句,这些手机助手的开发者们本身也是逆向工程的高手,善用矛的同时也善用盾,想 要达到同台 PK 的水平需要积累锻炼足够长的时间才行。 1.2.2 开发相关的 iOS 逆向工程 对于 iOS 开发者来说,逆向工程是最为实用的技术之一。例如,工程师可以逆向系统调用, 在自己的程序里使用一些文档中没有提及的私有功能,还可以逆向一些经典的软件,包括竞争对手 的软件,看看自己的软件能够借鉴些什么技术。 1、逆向系统调用 程序员编写的软件能够运行在操作系统中,提供各种各样的功能,是因为操作系统本身已经内 嵌了这些功能,软件只是拿来重新组合使用罢了。众所周知,能上架 App Store 的 app 功能十分有 限,在苹果严格的审核制度下,绝大多数 app 的实现都源于公开的开发文档,而不能使用诸如锁屏、 关机等文档中不涉及的功能。如果你的程序面向 Cydia,那么不采用非公开功能将导致你的程序几 《iOS 应用逆向工程—分析与实战 》第 1 章 乎没有竞争力。如果你的程序想拥有打电话、发短信等不公开的功能,最有效的途径就是逆向 iOS 系统调用,还原系统实现相应功能的代码,并应用到自己的程序中。 2、借鉴别的软件 逆向工程最受欢迎的应用场合就是“借鉴”别人软件的功能。对于来源是 App Store 的 app 来 说,大多数技术实现并不复杂,巧妙的创意和良好的运营才是他们成功的关键。如果只是单纯借鉴 其功能,那么逆向工程费时费力,性价比不高,从头开发一个功能类似的软件反而要省时省力得多。 但是,当我们不知道被借鉴软件中的某个功能是如何实现的时候,逆向工程就能起到关键性的作用。 这种情况在大量使用未公开方法的 Cydia 软件中尤其常见,比如 2013 年 3 月面世的,号称 iOS 平 台上第一款通话录音软件的 Audio Recorder,足够有趣却又不知原理如何,此时使用逆向工程的技 术就能够对它了解一二。 有些软件,比如微信,功能经典,结构也非常复杂,所涉及的代码自然十分众多。图 1-2 是使 用 class-dump 获取微信 4.5 的.h 文件目录: 《iOS 应用逆向工程—分析与实战 》第 1 章 图 1-2 不过我们也看到,在目录中共有 2267 个.h 文件,光是文件名一个个的看下来,天都黑了。我 们当然不可能这样傻傻地一个文件一个文件的读过去,而是可以通过合适的逆向分析工具加上丰富 的开发经验来帮助定位关键信息点。对于微信这样足够经典的目标程序,使用的技术及框架都非常 有借鉴意义,所以也值得我们对它进行逆向工程,收集相关的知识并学习,进而一步步的掌握精髓。 1.3 iOS 软件逆向工程的一般过程 当我们想要逆向一个 iOS 软件,应该从何入手?应该怎么思考?这本书的初衷就是引导初学 者走进 iOS 逆向工程的大门,培养读者从逆向的角度思考问题。 所谓的 iOS 逆向工程初学者,其 实 至 少 也 是 iOS app 开发的中高级程序员了,理论上都拥有相 当丰富的开始经验。所以在后续的过程中,一些非常初级的技术原理可能会讲的非常简单,甚至直 接被忽略,毕竟读那些内容对有经验的开发人员来说是在浪费时间。 一般来说,软件逆向工程可以看作系统分析和代码分析两个阶段的有机结合。在系统分析阶段, 我们从整体上观察目标程序的行为特征,文件的组织架构,从而找到我们感兴趣的地方。一旦我们 能够较为熟练地操作这个程序,并且找到了我们想要逆向的点,就可以进入代码分析阶段,利用各 种工具对程序本身的二进制文件进行分析,达到我们的目的。 1.3.1 系统分析 在系统分析阶段,我们在不同的条件下运行目标程序,在程序中进行各种各样的操作,观察程 序的行为特征,同时寻找我们感兴趣的功能点。比如:选择哪个选项会弹框,按下哪个按钮会发声, 输入什么内容屏幕会有什么显示;同时,我们还可以浏览文件系统,观察程序显示的图片、程序的 配置文件存放在哪里,对应的数据库文件中存放了哪些信息、是否加密等等。 以新浪微博 app 为例,当我们将微博的目录展开时,会看到如图 1-3 所示的结构。在微博目录 下有 Documents、Library 等子目录,目录中放着对应的数据库文件以及缓存的图片文件等。 《iOS 应用逆向工程—分析与实战 》第 1 章 图 1-3 同样,我们可以看到 Documents 目录下 db_36000_3414827754.dat 这样的文件,从文件名上即 可识别出它是数据库文件,此时使用 SQLite 工具打开可看到如图 1-4 所示的数据内容: 图 1-4 此时我们能够看到在微博里的联系人信息、发的微博内容等信息。 因为这些信息已经通过 app 自身的目录文件结构呈现在我们面前,所 以 可以看到,对 iOS 平台 《iOS 应用逆向工程—分析与实战 》第 1 章 以及 app 的理解程度直接决定我们在逆向工程时所需要花费时间精力,以 及 与所获取有用信息的性 价比。 1.3.2 代码分析 当外围的分析已经完成之后,再进一步就是对程序的可执行文件进行代码这一层级的分析了。 使用逆向分析的方法可以倒推出这个程序的设计思路、内部算法和实现细节,这 是一个非常复 杂的过程,甚至可以说是一种解构的艺术。要想让自己的逆向工程水平达到艺术的高度,我们需要 对软件开发、CPU 工作原理和 iOS 有透彻的理解。而且很多软件的复杂度很高,即使其代码规范、 文档详尽,可是一旦开源,很多人还是会为其复杂度所惊叹,比如 Activator 这样的系统级插件程 序。一点一点地分析程序的底层指令绝非易事,也不是一本书能够完全阐述清楚的。 本书的目标仅仅向初学者讲述 iOS 逆向工程入门时所用到的工具和可能的思路,所提及的工 具及知识均是笔者长期积累的个人经验之谈,对知识点的覆盖不可能面面俱到,我们期望读者能结 合书中的理论和实例举一反三,形成自己的学习方法。 1.4 iOS 软件逆向工程用到的工具 对于 iOS 的逆向工程,除了理论之外,最重点的内容就是使用好各种工具了。整个 iOS 逆向 工程所牵涉到的工具数量达到数十款之多,而且这还不是 100%全覆盖到。因为毕竟在这一方向没 有一套统一的教学规范来指明哪些工具该用、哪些工具不该用,而都是各个参与者根据自己掌握的 深度及喜好来选择最称手的工具。 好的工具,以及对这些工具的熟练使用能够极大地协助我们进行高效的逆向工程。在本阶段的 逆向工程中,我们介绍的工具集主要可以分为四大类:监测工具、开发工具、反汇编器 (disassembler)、 调 试 器 ( debugger)。 1.4.1 监测工具 在逆向工程中,起到嗅探、监测、记录目标程序行为的工具统称为监测工具。这些工具通常可 以记录并显示目标程序的某些操作,如网络活动、文件访问等。iOS 逆向常用的监测工具有 Reveal、 tcpdump、libNotifyWatch,PonyDebugger 等。 图 1-5 中所呈现的是监测工具之一的 Reveal,一款用来查看目标 app 的 UI 元素的工具。 《iOS 应用逆向工程—分析与实战 》第 1 章 图 1-5 使用 Reveal 可以非常直观的看见 app 的界面上各个 UI 元素之间的从属关系,并且轻松、快捷 地定位到我们想查看的 UI 元素。有了类似这样的工具,很多原本以为会非常枯燥的分析工作均可 以跨越过去,达到事半功倍的效果。 1.4.2 开发工具 进行代码分析这一层级,我们就必须掌握开发工具的使用。实际上监测工具与开发工具一直都 是组合使用的,单纯使用某一类工具根本无法深入。 对于有成熟开发经验的 iOS 程序员,Xcode 是最常用的开发工具了,但在此之外,还有可以用 于开发越狱代码的工具,其中最方便也最有名的一个工具就是 Theos。这是一个非常简单易用的开 发工具,但是它能编译生成最具威力的 Tweak 插件,直刺 app 内脏,完成我们期望它完成的任务。 图 1-6 是 Theos 的创建工程命令行: 《iOS 应用逆向工程—分析与实战 》第 1 章 图 1-6 我们会在后面的工具篇中详细介绍 Theos 的详细使用方法。仅从个人体验来说,这是一个让笔 者最兴奋不已的开发工具,在接触使用 Theos 之前,感觉自己一直被限制在普通 app 的低维世界中, 直到学会并掌握 Theos 的使用,才觉得真正突破了普通 app 的开发界限,跨越了维度的限制,可以 从高维来看待 app 了。 1.4.3 反编译器 随着一步步的进阶,反编译器就会出现在我们的视野中。在 iOS 逆向工程领域,反编译器主 要就是 IDA。 IDA 是逆向工程中最常用的工具之一,横跨 Windows/Linux/Mac 平台,它把目标程序的可执 行文件作为输入,输出这个程序的汇编代码,甚至伪代码。 反编译是跟 CPU 架构相关的,但象 IDA 这样强大的反编译器支持多种 CPU 架构,如图 1-7 所示: 《iOS 应用逆向工程—分析与实战 》第 1 章 图 1-7 IDA 有免费版本,可以输出函数列表及对应的汇编代码。而相比较于免费版 IDA,收费版本 所能带来的功能就更震撼了,图 1-8 是用 IDA Pro(收费版),对于 iOS 程序,不仅仅是反汇编了, 甚至连伪代码都能高度接近: 图 1-8 笔者第一次看到这样的伪代码时,不禁感叹一句:逆向分析工具都强大到了这一步,还有什么 《iOS 应用逆向工程—分析与实战 》第 1 章 能藏的住的? 1.4.4 调试器 调试器对我们这些程序员来说就相当熟悉了,最常见、最熟悉的就是在 Xcode 中的单步调试 了,程序员可以在某一行代码上设置断点,使调试器能够在那一行代码执行之前暂停程序执行,并 且显示程序当前的状态。 因为程序员拥有自己程序的源代码,所以调试器的断点可以指定在源代码的代码行上,单步调 试可以以源代码的行为单位执行代码。 而在逆向工程中,我们往往没有目标程序的源代码,所以用到的调试器是汇编语言层级的,调 试的单位也是汇编语言的行。当然,我们同样可以利用调试器设置断点、单步调试,来观察甚至更 改程序的执行流程,从而达到分析程序的目的,只不过这个过程不如拥有代码调试那么直观、方便。 此时,我们使用的调试器就是大名鼎鼎的 GNU Debugger,即 gdb。 1.5 本章小结 本章介绍了 iOS 软件逆向工程的基本概念、作用、一般过程,以及需要用到的一些主流工具 等等,旨在让读者对 iOS 逆向工程有一个概念上的了解,详细的技术内容会在后面的章节中逐一 讲解。

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享文档获得金币 ] 3 人已下载

下载文档

相关文档