首先,本逆向分析是系列文章,会分别从常见的逆向技巧来介绍iOS开发中常见的逆向技术。
网络分析
在逆向过程中很多时候需要分析APP和Web端数据交互的内容那么最简单的方式即是抓包网络分析,而使用Charles、Tcpdump也是逆袭分析最基本的手段。本文以Charles为例来介绍网络相关的内容。
Charles 是在 Mac 下常用的网络封包截取工具,在做 移动开发时,我们为了调试与服务器端的网络通讯协议,常常需要截取网络封包来分析。Charles 通过将自己设置成系统的网络访问代理服务器,使得所有的网络访问请求都通过它来完成,从而实现了网络封包的截取和分析。除了在做移动开发中调试端口外,Charles 也可以用于分析第三方应用的通讯协议。配合 Charles 的 SSL 功能,Charles 还可以分析 Https 协议。
Charles 主要的功能包括:
- 截取 Http 和 Https 网络封包;
- 支持重发网络请求,方便后端调试;
- 支持修改网络请求参数;
- 支持网络请求的截获并动态修改;
- 支持模拟慢速网络。
Charles安装好后只需自己设置成代理服务器来完成封包的截取,设置也很简单选择菜单中的 “Proxy” –> “Mac OS X Proxy” 来将 Charles 设置成系统代理。
这样你就可以看到网络请求出现在 Charles 的界面中,包括你模拟器你的请求也会在这里,那么小伙伴会有疑问iPhone真机设备的网络数据包如何截取呢,也很简单只需将手机的代理服务器设置为电脑IP即可,如下操作
第一步:Charles 的菜单栏上选择 “Proxy”–>“Proxy Settings”,填入代理端口 8888,并且勾上 “Enable transparent HTTP proxying” 就完成了在 Charles 上的设置。
第二步:获取Charles 运行所在电脑的 IP 地址,Charles 的顶部菜单的 “Help”–>“Local IP Address”,即可在弹出的对话框中看到 IP 地址,如下图所示:
第三步:设置iPhone设备Http代理,在 iPhone 的 “ 设置 ”–>“ 无线局域网 ” 中,点击当前连接的 wifi 名,可以看到当前连接上的 wifi 的详细信息,在其最底部有「HTTP 代理」一项,点击后,然后填上 Charles 运行所在的电脑的 IP,以及端口号 8888,如下图所示:
至此所有电脑,模拟器,iOS真机设备所有的Http请求都已经可以通过上边的方法抓包分析获取Request和Respone等具体网络请求数据,可是Https的加密请求如何抓取呢?如果你需要截取分析 Https 协议相关的内容。那么需要安装 Charles 的 CA 证书。具体步骤如下。
第一步:我们需要在你要分析的设备上安装Charles证书。点击 Charles 的顶部菜单,选择 “Help” –> “SSL Proxying” ,–> “Install Charles Root Certificate”安装到Mac上抓取Mac产生的Https请求,Install Charles Root Certificate on a Mobile Device or Remote Browser”安装到iOS 真机设备抓取iOS设备产生的Https请求,如下图所示:
第二步:Charles 的菜单栏上选择 “Proxy”–>“SSL Proxy Settings”添加需要抓取的域名,如下图所示:
这样就可以分析目标App的所有网络请求,对其进行逆向数据分析,学习下优秀的API设计规范,根据抓包分析的数据格式,通过脚本语言或其他方式伪造网络请求修改数据。比如想自己写个新闻类App就可以抓黄易,某条分析其网络数据,笔者之前分析时记得黄易的接口设计要比某条的清晰明了,然后将就可以在自己的App中使用了。
如果是返回https的接口,可以参考下面的文章:Charles https使用
静态分析
在逆向过程中很多时候仅仅对数据交互的分析并不能看出业务大概实现逻辑,技术方案,这个时候我们就需要静态分析这个App,今天就浅显的讲下如何静态分析目标APP的方法论。
首先分析目标APP我们需要获取Ipa,那么怎么获取呢,上次我逆向冲顶大会后,有小伙伴问,怎么获取Ipa,其实很简单,虽然Itunes 在新版中去掉了AppStore,但我们可以通过其他渠道下载,如PP助手同步推、91等越狱市场下载。以最近很火小佛系游戏旅かえる(旅行青蛙)为例我们直接搜索如下图:
获取Ipa文件后,把旅かえる旅行青蛙-1.0.1.ipa 后缀名改为zip,然后解压可以看到iTunesArtwork,iTunesMetadata,META-INF,Payload四个文件,其中iTunesMetadata里边有BundleId,bundleDisplayName,VersionString等等应用相关的信息。
Payload里只有一个文件tabikaeru,这个文件也是我们重点要分析的文件,我们直接右键显示,可以看到如下内容,在这里可以看到一些三方库,界面nib文件,图片资源,数据等,其中_Codesignature里边包含了这个包的签名信息,如果我们修改了ipa内部的任一文件重新压缩改为ipa然后安装就会报签名错误,这就是下一节动态分析要用到的技术重签,最重要的可执行文件tabikaeru这个就是所有编译后的二进制代码块。
这里简单讲下二进制可执行文件的结构,主要分三部分Object files,Sections,Symbols。其中Object files包括 .o , .framework,.a文件;Sections 对二进制文件进行了一级划分,描述可执行文件全部内容,提供segment,section位置和大小;Symbols 对Section中的各个段进行了二级划分。以下图为例,对于__TEXT __text,表示代码段中的代码内容,其对应地址为0x1000021B0,然后我们拿着这个地址去符号表中查询会发现,这一地址对应的代码0x1000021B0 -[ULWBigResponseButton pointInside:withEvent:],理解了这个过程我们就可以更好的理解反编译的过程,也能理解友盟Crash分析是如何把那些你看不懂的错误信息还原成你看得懂的函数调用栈的过程。
其实介绍到这里都还不是静态分析的重点内容,我们是要反编译,反汇编对不对,那么我们把二进制文件直接丢入Hopper disassembler(反编译工具)看下呢,试过的小伙伴肯定要说了,看到一堆没意义的字符,是的,因为开发者将自己的Ipa打包上传后,Apple对Ipa加了一层壳,也就是加固,怎么办呢?有很多方式如Dumpdecrypted,Clutch等工具可以砸壳,特别说明砸壳需要越狱手机,因为要使用SSH连接到手机,这里不对该过程展开说明,需要的同学自行学习,《iOS应用逆向工程》小黄书里边有讲,或者一些博客也有介绍。我在这里介绍另一种获取脱壳Ipa的方式,直接在PP助手搜越狱栏目下的Ipa,就是脱壳的Ipa。
如上图我们可以看到游戏是基于Unity3D做的,可以看到定位服务LocationService,SplashScreen业务类,三方库GADSDK三方库等内容,如果要进一步看具体方法实现,就需要读图里的汇编代码了,关于ARM汇编一级的逆向知识就更低层包括ARM指令集,各种寄存器操作等不做展开讨论,另外如果是应用类APP分析到这里,整个APP的头文件就都看到,由于该游戏采用Unity3D引擎C#开发如果反编译C#代码还需要其他工具才能进一步看,这里笔者只是举例,有兴趣的同学可以进一步分析。
最后静态分析在逆向中是非常重要的手段,很多时候我们需要静态分析提供线索,寻找蛛丝马迹,动态分析去论证,多种技术手段互相交替使用,逐步突破,才能一窥究竟,那么我会在下一节中讲解如何动态分析目标APP,如分析UI结构,分析关键技术,或者注入自己的代码改变业务流程,更多骚操作,尽在iOSTips。
附静态分析工具集:
- Dumpdecrypted:砸壳
- class-dump-z: 用于简单分析出工程中的头文件和函数名
- IDA:强大的反编译工具
- Hopper Disassembler:类似IDA
动态分析
下面以腾讯视频广告移除为例,来讲解如何做动态分析。首先我们进入视频播放页,点击最近的热片《战长沙》,进入详情页如下图,VIP可关闭广告,那么这个详情页肯定会有与与VIP广告相关的业务,我们只要找到对应的ViewController然后丢给Hooper反编译就应该可以看到VIP相关的业务函数。那么怎么知道这一页对应的ViewController呢,有2种办法,一种全局hook viewDidLoad 在这里断点看vc,还有直接看视图堆栈。
首先我们通过hook viewDidLoad方式书写如下代码,当点击详情时开启断点,可以看到程序被中断,控制台self=QLVideoDetailViewController,我们通过这种方式很容易确定详情播放的控制器为这个类。直接查看UI堆栈发现也是这个类,并且获得了更多信息,可以看到广告相关的View,这里想下下是不可以直接隐藏这个ad view呢?
通过Hooper发现,和广告相关的代码真多啊,不知道企鹅的程序猿是怎么设计的。
通过上面静态分析的内容并不能提供明显的思路让我去广告,我准备回到UI堆栈那里,我在这里发现了QNBPlayerVideoAdsViewController,看名字就知道播广告的,邪恶的笑下,鹅肠同学名字起得真是清晰明了,这次试一下直接hide这个控制器看广告会不会消失。
我写了如下代码以后,很暴力直接隐藏了广告视图,发现广告会消失一会儿,然后又显示,经过静态分析发现QNBPlayerVideoAdsViewController这个类里边有adsStartPlay,那我更暴力一点,在这个方法里只要你播广告我就影藏这个view,command r运行,看电视剧,妥妥的没广告了,最终代码如下。
故事讲到这里算是讲完了,有兴趣的同学可以进一步研究vip付费视频如何直接看,整体而言,这次分析的过程比较顺利,我们可以看到在逆向过程中是动态,静态分析结合相互提供线索一步步逼近真相,我们现在复盘,通过复盘来来解密我们使用的工具,以及这些工具背后的原理。
我们这次动态分析使用的是IPAPatch,和这个类似的有AloneMonkey的MonkeyDev,这俩库原理类似核心思想都是将我们自己写的代码编成动态库注入目标App,然后重签,作为一个有情怀的开发者,仅仅会使用工具肯定不是我们的目标对不对,我们要做的是探究这个过程是如何实现的,这里我抛出几个问题动态库是如何注入的?App重签名的过程是怎样的?今天我们大概简单聊聊有个印象,这些内容每一个点都很重要,都是逆向的基础知识,虽然枯燥但是,但可以让你更好的理解这些原理。
如果要理解动态库注入那还需要更深入的理解Mach-o的文件结构,我在上篇文章中简单讲了下,这里再详细的讲下,一个典型的Mach-O文件格式如图所示:
通过上图,可以看出Mach-O主要由以下三部分组成:
Mach-O头部(mach header)。描述了Mach-O的cpu架构、文件类型以及加载命令等信息。
加载命令(load command)。描述了文件中数据的具体组织结构,不同的数据类型使用不同的加载命令表示。
Data。Data中的每个段(segment)的数据都保存在这里,段的概念与ELF文件中段的概念类似。每个段都有一个或多个Section,它们存放了具体的数据与代码。
二进制当中所有引用到的动态库都放在Load commands段当中,那么我们只要,通过给这个段增加记录,就可以注入我们自己写的动态库了,对不对。那么问题来了,在这里插入我们自己的动态库有什么用?我们自己写的代码没有执行的入口,一样什么都不能干,我们还需要一个”main”函数来执行我们自己的代码,不要忘了,这个”main”函数在oc里面称为构造函数,只要在函数前声明 “attribute((constructor)) static” 即可,这样你的代码就可以被目标APP执行了。
关于重签名,有兴趣的同学可以学习下整个签名过程,包括代码如何签名,证书如何校验等,重签名大概过程如下,
1、解压ipa安装包 cp test.ipa olinone.zip
2、替换证书配置文件(文件名必须为embedded)
cp embedded.mobileprovision Payload/test.app
3、重签名(certifierName为重签名证书文件名,可以加证书ID后缀)
certifierName=”iPhone Distribution: olinone Information Technology Limited(6a5LOVE58MYX)” codesign -f -s $certifierName –entitlements entitlements.plist Payload/test.app
4、打包 zip -r test.ipa Payload
至此逆向系列的入门教程已经全部更完,现在应该拿到一个App应该已经可以自己玩了,篇幅有限,有很多内容不能展开讲,也没讲到,比如有攻就有防,了解防才可以更好的绕过,如何为自己的App加固,再比如一些细节符号表是怎样恢复的,砸壳的原理到底是怎样的,这些有趣的话题我们只能后边再聊,更多骚操作,尽在iOSTips,关注公众号,第一时间get新姿势。
附静态分析工具集:
- Dumpdecrypted:砸壳
- class-dump-z: 用于简单分析出工程中的头文件和函数名
- IDA:强大的反编译工具
- Hopper Disassembler:类似IDA
附动态分析工具集:
- IPAPatch,MonkeyDev:
- Reveal 界面分析
- CaptainHook,Tweak 编写hook代码,或自定义功能
附:
《iOS Hacker’s Handbook》
《iOS应用逆向工程:分析与实战》小黄书
iOSRE 中文逆向论坛
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/5925.html