iOS应用安全Part3:理解Objective-C运行时

【说明】英文原文发表时间:2013.6.3,原文链接:点击这里

简介

上一篇《iOS应用安全Part2:获取iOS应用的类信息》中,我们学习了如何使用class-dump-z工具获取APP的类信息。本文中,我们将重点学习Objective-C运行时的概念和技术。

几乎所有的原生iOS应用都是用Objective-C语言写的,所有这些APP都使用Cocoa,这是一个处在Objc-C顶端的库,它提供了高级API,使Mac和iOS的开发工作更加简单。此外,Cocoa还为APP提供了一个运行时环境。在本文中,我们将重点理解Objective-C运行时,以及Objective-C如何在内部运行等这些复杂细节。掌握这些将有助于我们更加深入地理解iOS应用的安全性。

Objective-C运行时

Objective-C是一种面向运行时的编程语言,但问题是,什么是运行时语言?运行时语言是也是一种语言,只是它可以在应用程序的运行时决定一个函数实现什么内容,以及其他方面的决策。那么,Objective-C是一种运行时语言吗?No,它只是一种面向运行时的语言,这意味着只要有可能,它会将决策从编译和链接时推迟到代码真正执行时。正如前面指出的,Cocoa提供iOS应用需要的运行时环境。下图是来自苹果文档的一段内容,里面很清楚地解释了这一点,同时你也可以在这里查看该文档。


现在,我们检查一下运行时库是否成功导入项目中。理想情况下,每一个iOS应用程序中都会包含运行时库。为了检查这一点,登录你的设备并进入到应用目录。

现在输入指令“ls”来查看目录中的文件清单。

接着,我们看一下iOS应用BADLAND,它是iOS平台上一个非常流行的游戏。我们进入到Badland目录,然后进入BADLAND.app文件夹,并使用otool功能对Badland二进制文件进行操作。

现在我们可以看到它导入了很多框架和库文件,objc运行时库如下图中所示。

该库文件使得在Ojective-C运行时操作成为可能。默认情况下,所有iOS应用程序中都包含有这个库文件。下图中显示了iOS APP谷歌地图使用otool功能操作的结果,正如你所看到的,它包含了Objective-C运行时库。


利用GDB对运行时分析

在本节中,我们将着眼于如何使用GDB观察APP的执行流程。首先,我们需要安装一个适当版本的GDB,而Cydia商店中的GDB版本不能正常工作。所以,要确保你从其他地方获得GDB的二进制文件。获取GDB之后,使用sftp登录到你的iOS设备,并上传GDB二进制文件。如下图所示:


然后,确保它有合适的权限来运行。


为了hook一个进程,首要的问题就是确保该进程目前正在运行。在本例中,我们将演示对谷歌地图APP的测试。所以,我们首先在设备上开始运行该应用,然后获取它的进程ID。同时,要确保该程序在前台运行。正如从下图我们能看到的,谷歌地图应用的进程ID是661,不过可能你测试时的进程ID会与此值不同。


现在,我们使用GDB hook进这个进程。


正如你所看到的,我们已经成功hook进入该进程,目前你可以忽略那些警告。

Objective-C是基于消息机制的,无论何时只要发送一条消息,objc_msgSend()方法都会被调用。为了分析一个APP的执行流程,我将为最基本的调用方法添加一个断点,例如objc_msgSend(),并打印$r0和$r1的值。从$r0的值中,我们可以找到该方法所属的类,还可以使用$r1的值来找到选择器。注意,尽管这可能会导致太多的细节,因为每次发送一条消息都会调用objc_msgSend()。在以后的文章中,我们将讲解如何更高效地使用它。因此基本上,每当程序执行到一个断点处,我都将打印$r0和$r1的值,然后继续执行。如下图所示:


我们输入指令“c”继续APP的执行。


正如你所看到的,在分析APP执行流方面这帮到了我们很多。再一次地,它输出了太多信息,可能在对应用实时分析时并没什么帮助,但它显示了我们可以获得多少有关APP的实现信息。

Method Swizzling

我们已经知道,所有的iOS应用在执行时都会使用一个运行时环境,这意味着很多决策都是在运行时执行的。顾名思义,method swizzling是另一个武器,我们可以利用它来修改iOS应用的行为。它允许我们改变从选择器到实现的映射,利用这一点我们可以让程序调用我们自己的方法。在下一篇文章中,我们将深入学习method swizzling。

参考资料

The Dark art of IOS Application hacking
http://www.slideshare.net/daniel_bilar/blackhat2012-zdziarskidarkarti-osapplicationhacking/
The Objective-C runtime
http://www.slideshare.net/mobiledatasolutions/objectivec-runtime



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值