在逆向过程中很多时候仅仅对数据交互的分析并不能看出业务大概实现逻辑,技术方案,这个时候我们就需要静态分析这个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