【说明】英文原文发表时间:2013.6.10,原文链接:点击这里
前言
在上一篇博文中,我们了解一个iOS应用程序(使用Cocoa框架用Objective-C开发)的运行时功能。在本文中,我们将学习如何使用一个名为Cycript的重要工具来分析和修改一个iOS应用程序的运行时,本文中我们以“雅虎天气”iOS应用作为示例App。Cycript
Cycript 是一个Javascript解释器,同时它还理解Objective-C语法,这意味着在一个特定指令中,我们可以编写Objective-C或Javascript代码或者二者混合使用。Cycript还可以hook一个正在运行的进程,帮助我们修改应用运行时的很多东西。针对iOS应用程序而言,使用Cycript有以下优点:1、我们可以hook一个正在运行的进程,并找到使用的所有类的名字,例如:视图控制器、所使用的内部和第三方库,甚至应用代理的名字。
2、对于一个特定的类,如视图控制器、应用代理或任何其他类,我们也可以找到所有使用的方法名字。
3、在应用程序运行时特定时间,我们也可以找到所有的实例变量名和它们的值。
4、在运行时,我们还可以修改实例变量的值。
5、我们可以执行Method Swizzling,例如:用其他实现替换一个特定方法的代码。
6、在运行时期间,我们可以在应用中调用任何方法,而不必要求该方法存在于实际应用的代码中。
安装Cycript
为了在你的设备上安装Cycript,你必须从它的官网下载页面下载最新版本,要确保下载最新版本。
一旦成功下载到你的系统上,使用sftp将它上传到你的设备上。
接着,使用dpkg指令将cycript安装到你的设备上。
利用Cycript进行运行时修改
本文中,我们做的所有测试都是在雅虎天气应用上,这是一个非常简洁的应用程序,它有一个优雅的UI,提供不同地方的天气信息服务。一旦雅虎天气成功安装,运行它并确保它运行于前台,这是因为一旦应用程序处于后台,那么它将处于暂停状态,而此时你将无法对它进行更多操作。一旦运行应用程序,你可以通过找到该应用的PID,然后运行“cycript -p”指令直接hook到该进程。
正如你可以看到的,状态栏现在是可见的。下面我们试一下,看看是否可以修改这个特定应用程序的消息提示数量。提示计数是应用程序图标右上角显示的数字,它通常指的是应用程序收到推送通知的数量。在邮件应用中,它也可以指未读邮件的数量。在雅虎天气应用中,并没有推送通知的概念,因此在应用图标的右上角并没有计数显示。不过,可以在应用本地通过一个简单的函数调用或者从服务器远程推送通知来设置提示计数。接着,我们试一下,看看是否可以设置应用程序的提示标记。下面是我们需要调用的Objective-C方法。在本例中,我设置提示数量为999。
现在,通过使用keyWindow的rootViewController属性,我们找出了该窗口的根视图控制器。该窗口的根视图控制器属性负责在这个窗口中显示内容。
结论
在本文中,我们学习了如何将Cycript安装到一个越狱设备上,以及如何hook到一个正在运行的进程,并找出应用程序的属性信息。我们还研究了如何自己调用函数在应用的沙箱中执行。在下一篇博文中,我们将着手如何找出给定类的所有方法及修改它的实现。此外,我们也会探索如何修改一个特定类的实例变量值。参考资料