ken 发表于 2015-8-25 22:36:22

IOS应用安全(三): 理解Objective-C Runtime

本帖最后由 ken 于 2015-8-25 22:41 编辑

原文出处: http://highaltitudehacks.com/2013/06/16/ios-application-security-part-3-understanding-the-objective-c-runtime/
这是肿么回事,图片需要放大才能看清楚{:5_143:}
这几天到处忙着找房子,不得不吐槽帝都的房租真贵。


static/image/hrline/5.gif


苹果设备中几乎所有的原生IOS应用都是用Object-C写的。所有的这些这些应用使用Cocoa这个库提供的API来编写,这个Cocoa比Objc-C高一级,我是这样理解的,他们的关系 就和Windows编程中MFC 和SDK一样,Cocoa把Objc-C的那些API封装成高级API。这样可以让Mac和IOS开发更简单一点。Cocoa为每一个应用程序添加了运行时环境。这篇文章,我们主要着重于理解Objective-C runtime 和函数和关于这个语言函数的详细细节。 这会更加深入的帮助我们理解IOS应用安全。 有兴趣深入的可以看看这个博客http://southpeak.github.io/blog/categories/ios/。
Objective-C runtime
Objective-C是面向运行时语言,现在出现的问题是,什么是运行时语言?运行时语言是在程序运行时决定实现一个函数和其他决定的一种语言。那么Objective-C是运行时语言吗?不是的,它是面向运行时语言(纯理论,不懂)。这意味着,只要有可能它就把编译和链接的时间 推迟到 应用程序实际被执行的时候。前面提到的,Cocoa提供了IOS应用需要的运行时环境。下图是从苹果官方文档摘抄下来的一部分,解释的很清楚了。你也可以访问https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Introduction/Introduction.html
http://highaltitudehacks.com/images/posts/ios3/1.png

现在让我们来看一下,运行时库有没有被导入。理论上,每个IOS应用都应该导入了运行时库。为了验证,我们进 applications看下。
http://highaltitudehacks.com/images/posts/ios3/Screen%20Shot%202013-05-15%20at%204.58.11%20AM.png
上面什么也没看出,我们在用ls * 来查看全部的目录列表
http://highaltitudehacks.com/images/posts/ios3/2.png
我们来看看BADLAND应用,这是一款比较流行的游戏,进这个游戏的目录里对二进制格式文件(这个词上一篇翻译错了)使用otool工具,命令otool -L BADLAND()
http://highaltitudehacks.com/images/posts/ios3/3.png
有很多的框架和库被加载,加载的objc-runtime如下图
http://highaltitudehacks.com/images/posts/ios3/5.png
这个库使得在Objective-C上对Runtime操作变得有可能。所有的IOS应用默认都包含这个库。下面我们用otool对Google Maps分析,发现Google Maps也包含这个库。
http://highaltitudehacks.com/images/posts/ios3/6.png

使用GDB分析Runtime



这一节,我们使用GDB来观察应用的执行流程。首先最重要的是安装能用的GDB,因为从Cydia下载下来的不能正常运行。从其他一些地方来下载GDB。这一切都弄完后,将GDB的二进制文件上传到设备。
http://highaltitudehacks.com/images/posts/ios3/7.png
赋予执行权限
http://highaltitudehacks.com/images/posts/ios3/8.png
为了HOOK一个进程,必须保证这个进程在运行中。在这种情况下,这里我使用 Google Maps来测试。运行该程序,然后使用ps来获取这个程序的pid号。这里Google Maps的pid号是661.
http://highaltitudehacks.com/images/posts/ios3/9.png
使用GDB HOOK这个进程,命令gdb -p 661
http://highaltitudehacks.com/images/posts/ios3/10.png
http://highaltitudehacks.com/images/posts/ios3/11.png
正如你所看到的,我们已经成功的hook了这个进程,对于出现的那些警告可以忽视。
Objective-C使用了消息机制。这个消息机制的内容就是   每当一个消息被发送,objc_msgSend() 方法就会被调用。为了分析应用程序的流程。我将在最基本的调用下断点。即objc_msgSend 和输出 $r0 和 $r1的值。 从$r0我们可以找出正在调用这个方法的类,$r1可以找到selector(类似于c语言的函数指针,不过不能直接赋值,只能通过@selector来获取ID编号即函数地址 )。使用gdb时候可能导致出现大量没有用的信息。我们需要采用一种更高效的方法。我们只需要输出$r0 和 $r1的值。命令如下图:x/a表示是地址, x/s 表示是字符串c应该是继续(猜的).end用来结束本次输出。
http://highaltitudehacks.com/images/posts/ios3/12.png
输入命令 c
http://highaltitudehacks.com/images/posts/ios3/13.png
看到上面的图片没,这个app的流程很轻易的就能看出来了。虽然对于我们实时分析应用不是很有用(应该是动态调试)。但是有助于帮助我们理解应用程序的实现。

Method Swizzling

正如名字名字所暗示的,Method Swizzling是我们能用自己的 advantage来修改IOS应用的行为的有力武器。允许我们用自己的 advantage来改变从 selector 到实现的映射来调用我们自己的方法(hook大法好)。更详细的关于 Method Swizzling的内容在下一章会有详细介绍

References:


[*]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







wruih 发表于 2015-8-26 11:59:03

这几天到处忙着找房子,不得不吐槽帝都的房租真贵。

wruih 发表于 2015-8-26 12:03:29

gdb 貌似 也没人用了。。。。

听鬼哥说故事 发表于 2015-8-26 18:22:25

挺详细的文章~

FindAllBlue 发表于 2015-9-14 16:51:37

wruih 发表于 2015-8-26 11:59
这几天到处忙着找房子,不得不吐槽帝都的房租真贵。

多少钱一个月啊多大,看看有多贵
页: [1]
查看完整版本: IOS应用安全(三): 理解Objective-C Runtime