亲,iOS逆向开发了解一下

引言

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

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

可是目前 App 防护所用到的技术跟 iOS 逆向工程所使用的技术根本就不是同一个维度的。一般的 App 防护,感觉就像是一个城堡,将 App 的 MVC 布置在城堡内部,外围圈上厚厚的城墙,看上去易守难攻。但是当我们站到高处鸟瞰这个 App 所在的城堡,它的内部结构就不再是秘密。

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

iOS 应用逆向工程可以“透视”市面上绝大多数 App,它们的设计理念与实现细节在逆向工程中暴露无遗。比如了解一些老牌经典软件、当下火热的 App 的技术点,引用了哪些 framework 库等。 对于iOS开发者来说,如果清楚的了解系统的 API 实现细节的话,无疑是对我们工作有帮助的。在自己的 App 里使用一些文档中没有提及的私有功能,了解官方系统级源码的开发规范等。善于学习、借鉴别人成熟的方案岂不是一件很愉快的事,相信这些会使得学习者的个人能力得到质的提升。

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

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

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

准备

最近有在了解一些 iOS 逆向开发相关概念,《iOS应用逆向工程》这本书则可以很好的解决我大部分疑惑。我觉得学习一项新技术或者新知识点,比较高效率的方法大概就是实践了。所以,你可能需要提前准备一台 iPhone 设备,一台已经完美越狱的 iPhone。硬件版本推荐最新的 RAM64 架构机型,也就是 iPhone5s 及以后版本。软件版本推荐是越狱较为稳定的 iOS8、9 系统。【本人在某宝入手一台:iPhone6s、iOS 9.1、16G内存、完美越狱、¥1680】PP助手越狱平台:http://jailbreak.25pp.com/

按下空格键预览逆向

对于一款他人团队开发的软件,没有源码且不借助三方工具的情况下,我们能了解到的就是一个普通的用户视角所能呈现出的部分。不同的是,有类似开发经验者可以去猜测原作者实现逻辑的大致招数,实际上很多开发者初期的时候也都是这么做的,尝试了解一些经典软件的设计架构。但这么做有个问题在于,它受限于我们自身的知识储备、开发经验,可能一不小心就触发了我的知识盲区,这就有点尴尬,如果有妹子在场那就更得不偿失了。尝试去揣测他人作品的念头和行为本身就是逆向的思维,即使手段没那么高明。

外挂、插件、破解等均属于逆向工程的应用,我们当然知道技术同样具有两面性,这里不谈“副作用”,只聊技术本身。

本文就是记录一下如何更加科学的去逆向别人的 APP,以及沿途所需具备的知识点。具体技术细节另辟文章单独细述。

APP 逆向思路

为了更方便的了解一些 iOS 逆向工程的理论,就要使用各种工具帮助学习者去实践。相对于正向开发的 Xcode 这样大而全的神器,逆向工程使用的工具就显的不那么“智能”了,很多工作需要我们提前手工完成。iOS 逆向工程的工具可以分为四大类:监测工具、反汇编工具、调试工具,以及开发工具。

一款 APP,它的UI设计、操作逻辑、页面的层级结构,这些属于界面分析。除了正常上手使用了解,你可能还需要一些专业工具【Cycript、Reveal 这两款工具麻烦了解一下】来辅助你更优雅的完成这部分工作。

我们想要更加深层次的了解 APP 的实现,如果能看到它的源码岂不是快哉?【这里有个概念可能会帮助你打消这个念头,反汇编原理麻烦了解一下】。实际上是有一些工具【class-dump、Hopper Disassembler、IDA等】来帮助我们一定程度上拿到部分代码逻辑,比如说头文件。值得注意的是,介于 Apple 的安全理念,我们从 AppStore 商店下载的 APP 都是经过加密过的,系统在可执行文件上进行了加壳操作。不过一些三方下载平台上的 APP 会提前完成去壳操作,比如PP助手。所以在使用上述工具进行抽取操作前需借助一些工具【otool、MachOView】判断当前这款软件是否仍被加壳,如果有,需要使用一些工具【clutch、dumpdecrypted】执行脱壳操作。如果我们了解关于【Mach-O】文件内部结构的话,这会有助于我们理解这一系列操作背后的原理。

这里需要提的一点是,Mac 上我们可以在系统的 Terminal 终端程序中输入指令来完成一系列操作,在逆向开发过程中我们同样需要对 iPhone 设备做一些操作,比如Cycript、clutch、dumpdecrypted等命令工具均需要这些权限。但是 iPhone 上有没有类似终端一样的程序来完成这项工作,毕竟屏幕尺寸在这摆着呢,所以我们需要通过【SSH】的方式把拥有终端程序的 Mac 和 iPhone 设备连接起来。

前面几个步骤都是在不运行目标程序的情况下进行分析,称其为静态分析。在我们日常正向开发 iOS 程序时除了构思、编码,更少不了在 Xcode 中断点调试和测试代码。那在 iOS 逆向工程中,用到的调试工具主要是【debugserver、LLDB等】,这个过程称为动态分析。

从 UI 层面切入到代码层面,用反汇编工具和调试工具分析过二进制文件后,就可以整理分析结果,使用开发工具编写程序了。至于开发工具在越狱 iOS 中种类就不那么单一了,有基于 Xcode 的 iOSOpenDev,还有偏命令行的 【Theos】。

以 UI 分析切入,锁定目标所属的控制器。根据拿到的类名,去 dump 出来的文件集合里找出对应的头文件。创建 tweak 项目,根据具体需求通过编写 tweak 程序修改原程序地执行逻辑,具体做法就是重写对应方法的实现,注入自己的逻辑。至于如何快速地决定采取何种策略修改功能,离不开正向开发积累的经验。比如去除 APP 内的广告,可以选择直接 remove 掉对应的控件,也可以选择过滤掉从服务器请求来的广告数据模型。最终完成后,以安装.deb插件的方式注入你想加入或去除的功能,然后就是【签名打包.ipa】。

未完待续。。。。。。

可能吧。

参考文献:

第1章 概念篇;第3章 MacOS工具集;第4章 iOS工具集

iOS应用逆向工程 第二版沙梓社 吴航(著)