在IOS逆向工具大全里 总结了四种运行时工具:cycript、InspectiveC、introspy、Snoop-it。这几种工具功能大体相同(包含与被包含的关系)。
这些基本原理都是源自于ios的runtime特性,也称为运行时特性。
本文首先科普ios的runtime特性。
何为运行时呢。普通的语言,如C语言,一旦经过编译,则马上转换成可目标语言(汇编语言或机器语言),比如此时想要调用某个函数,则实际在内存中
就调用了某个函数。
然而OC语言却不是这样:OC语言除了编译器之外,还多了个运行时系统,经过编译之后,此时的函数在内存里并没有实际的地址,也即是此时无法调用该
函数,而只有等到实际运行的时候,这个函数或者类才在内存中实例化,被调用。
也正是因为如此,app每次运行的时候实际在内存中产生的地址都是不同的,这就给反汇编的代码阅读增加了困难,这个又称之为ios的app的ASLR特性。在
IOS逆向工具大全里有一种removePIE的工具,可以增加汇编代码的可读性,详见http://www.cocoachina.com/industry/20140310/7940.html。
这个就称之为运行时机制。
OC语言在运行的时候都会被转换成runtime语言,苹果本身对runtime是完全开源的,换言之,苹果是允许去窥探已有app的内部结构的。通过runtime机制,
完全可以实现在app运行的时候,了解app实现的内部结构:某个界面的组成,某个类有什么属性方法,runtime甚至允许改变已有类的属性方法值,亦可以增加
一个类,这就使得hook成为可能。
然后依次介绍每个工具的各自特性。
1:cycript
关于cycript的介绍在Cycript 研发_陈旦中已经有了很详细的介绍。但是cyript还有另外一种特性:cyript允许OC代码和JS代码混合编写。
这种机制的原理源自于Objective-C与JavaScript交互。
2:Snoop-it:https://wizardforcel.gitbooks.io/ios-sec-wiki/content/chapter4/issue4-6.html
Snoop-it有两个功能:运行时分析、对iOS应用进行黑盒安全评估。它有自己进行操作的web界面,这是它优于cycript的一个地方。
它还可用来分析网络流量:https://wizardforcel.gitbooks.io/ios-sec-wiki/content/chapter6/issue6-1.html
Snoop-it官网地址:https://code.google.com/archive/p/snoop-it/.值得注意的是,这个工具作者并没有放出源代码。
3:InspectiveC
InspectiveC是一个基于OC的库,它可以帮助查看类的详细信息:
某个类的所有方法调用情况、某个类的某个方法的调用情况、某个类的实例对象的所有方法的调用情况、某个类的实例对象的某个方法的调用情况、某个方法签名的调用情况
严格来说 它的功能很有限:http://iphonedevwiki.net/index.php/InspectiveC
4:introspy:http://wufawei.com/2013/11/ios-application-security-17/、http://www.blogfshare.com/ioss-introspy.html、http://ios.jobbole.com/58889/
Introspy由两个模块组成, 一个追踪器,一个分析器。我们可以用追踪器来对应用执行运行时分析。追踪器会把信息保存到sqlite文件中以便后续用分析器分析,
追踪器也可以把所有信息都输出到设备的控制台上。分析器可以用这个数据库文件生成一个详尽的HTML报告。
Introspy源码:https://github.com/iSECPartners/Introspy-Analyzer
因此在本次调研中 只有1、4两种工具,即cycript、introspy是开源的,而关于introspy的功能我有一个思路:通过动态运行工具对app进行追踪,可以对这些追踪行为进行
定义规则,而后,可以将这些追踪信息输出成静态文本,类似introspy那样,从而将动态分析转换成静态的文本分析。