iOS应用安全Part4:使用Cycript进行运行时分析

【说明】英文原文发表时间: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指令,检查它是否正常工作。

利用Cycript进行运行时修改

本文中,我们做的所有测试都是在雅虎天气应用上,这是一个非常简洁的应用程序,它有一个优雅的UI,提供不同地方的天气信息服务。
一旦雅虎天气成功安装,运行它并确保它运行于前台,这是因为一旦应用程序处于后台,那么它将处于暂停状态,而此时你将无法对它进行更多操作。一旦运行应用程序,你可以通过找到该应用的PID,然后运行“cycript -p”指令直接hook到该进程。
如果hook成功,将出现一个Cycript解释器。此时,你可以通过使用Objective-C语法[UIApplication sharedApplication]来获得应用程序的实例。
你还可以如下图所示那样,使用Cycript解释器定义变量。在本例中,我为[UIApplication sharedApplication]定义了一个变量a。
Cycript默认情况下拥有该变量,便于引用应用程序实例。

为了找到这个应用程序的委托类,我们可以使用命令[UIApplication sharedApplication].delegate。但是因为我们之前已经定义了一个变量作为应用程序实例,所以此时我们可以使用下图所示的命令。
因此,现在我们知道了委托类的名字为YWAppDelegate。所以,委托文件名定义为YWAppDelegate.h和YWAppDelegate.m。现在,我们试着在运行时调用应用程序的一些方法。快速浏览应用程序给出了这样的一个界面。
正如你可以看到的,应用程序的状态栏是隐藏的。我们可以调用应用程序的一个方法来取消隐藏状态栏。同时,在你对应用执行运行时分析时,要确保程序一直处于前台。
修改之后,下图是应用程序现在的界面。

正如你可以看到的,状态栏现在是可见的。下面我们试一下,看看是否可以修改这个特定应用程序的消息提示数量。提示计数是应用程序图标右上角显示的数字,它通常指的是应用程序收到推送通知的数量。在邮件应用中,它也可以指未读邮件的数量。在雅虎天气应用中,并没有推送通知的概念,因此在应用图标的右上角并没有计数显示。不过,可以在应用本地通过一个简单的函数调用或者从服务器远程推送通知来设置提示计数。接着,我们试一下,看看是否可以设置应用程序的提示标记。下面是我们需要调用的Objective-C方法。在本例中,我设置提示数量为999。
现在,如果我们回到主屏幕,我们将看到应用的提示计数。
现在,我们调查更多一些,看看我们还可以找出有关应用程序的什么信息。为了找出应用的当前视图控制器,必须首先找出keyWindow属性。一个keyWindow是一个窗口,它目前接受来自用户的交互操作(触摸事件)。如果你想找出一个应用程序的所有窗口,那么下图显示了实现这一目的的做法。注意,一个窗口是类UIWindow类型。
现在,为了找出应用中特定时间的keyWindow,你应该像下图这样做。

现在,通过使用keyWindow的rootViewController属性,我们找出了该窗口的根视图控制器。该窗口的根视图控制器属性负责在这个窗口中显示内容。


正如你可以看到的,rootViewController类的名字是YahooSlidingViewController。从这个名字来看,相当明显,在应用中这个类是一个滑块,如下图所示。
因此,这个类基本上充当其他视图控制器的门面。这意味着,无论何时在菜单中选择一个菜单项时,如上图所示,YahooSlidingViewController类将负责显示相应的视图控制器。

结论

在本文中,我们学习了如何将Cycript安装到一个越狱设备上,以及如何hook到一个正在运行的进程,并找出应用程序的属性信息。我们还研究了如何自己调用函数在应用的沙箱中执行。在下一篇博文中,我们将着手如何找出给定类的所有方法及修改它的实现。此外,我们也会探索如何修改一个特定类的实例变量值。

参考资料

Cycript

Cycript tricks


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值