本文是该系列文章的第2篇(第一篇请点击此处),我们将继续为读者介绍最有用的iOS应用程序渗透测试工具。在本文中,我们要介绍的工具为“Cycript”,这是一个运行时处理工具,主要用于动态分析和探索目标应用程序的执行流程。
对于这个系列文章来说,我们假设用户使用Electra进行越狱。就我而言,使用的系统是iOS11.1.2,但是本系列中的大多数工具都可以在任何版本的iOS11上使用。
安装Cycript
对于iOS 11来说,cycript是随bfinject一起安装的,关于bfinject的安装方法,我们在第1篇中已经安装好了。也就是说,我们已经在iPhone上安装了Cycript,不过,我们还需要在计算机上安装该软件。
您可以从http://www.cycript.org/下载该软件。
下载后,请将.zip解压到您喜欢的任何位置,然后,通过cd命令切换至该目录中。
将Cycript注入到应用程序中
现在,我们要在目标应用程序上运行Cycript,具体步骤如下所示:
通过SSH连接手机,并运行下列命令:
bash bfinject -P AppName -L cycript
这时候,会看到如下内容:
接下来,我们需要在计算机上启动Cycript程序。然后,在新的终端窗口中,运行如下所示的命令:
cycript -r XX.X.X.XXX:1337
其中xx.x.x.xxx是该设备的IP地址。
当您看到Cycript提示符出现时,说明连接成功:
cy#
注意:对于运行Mojave/High Sierra的用户来说,在运行Cycript时可能会遇到过如下所示的错误:
dyld: Library not loaded: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib Referenced from: /Users/me/Downloads/cycript/Cycript.lib/cycript-apl Reason: image not found Abort trap: 6
如果出现这种情况,说明您机器上的Ruby的版本/路径有问题,这时最简单的解决方法是运行下列命令:
brew install [email protected]
然后,手动将libruby.2.0.0.dylib文件移动到cycript主目录中。
探索运行时的世界
现在,我们已经为分析工作做好准备了!
下面,我们运行的第一个、也是最基本的命令,就是去确定当前视图,具体操作如下所示:
cy# UIApp.keyWindow.rootViewController
这样的话,软件就会返回当前视图控制器的名称。当使用更复杂的导航控制器或制表符栏控制器时,为了确定当前查看的到底是哪个视图,需要为"root viewcontroller"添加“visible viewcontroller”、“selected viewcontroller”或“presented viewcontroller”。
接下来,您可能想要浏览存储在内存中的当前对象。在第1篇文章中,我们考察了一个应用程序转储的头文件,并注意到了一些有趣的类/属性/方法。现在,我们看到的当前视图名为“WelcomeViewController”。我们可以转至转储的头文件,并搜索“WelcomeViewController”,可以看到,它有一个属性“loggedinuser”。
现在,我们可以借助cycript工具来查看这些属性了。
cy# UIApp.keyWindow.rootViewController.loggedInUser "<User: 0x104924e00>"
现在,我们看到LoggedInUser属性是名为“User”的类实例的引用。此外,我们也可以将对象存为变量,以便于进一步的考察:
cy# currentUser = UIApp.keyWindow.rootViewController.loggedInUser
现在,我们可以返回类转储文件,查看LoggedInUser等类中是否含有我们感兴趣的属性。此外,我们还可以调用方法!例如,假设loggedInUser类有一个方法:
- (_Bool)isEmailVerified;
我们可以使用cycript调用此方法,并查看其返回结果:
cy# [currentUser isEmailVerified] true
我们还对该方法进行操纵,使其返回我们想要的内容:
cy# User.prototype.isEmailVerified = function () { return true; }
同时,我们也可以操纵属性:
cy# user.isLoggedIn = true
另一个非常有用的命令是“choose”——当您知道要检查的类实例,却不知道它在哪里时,该命令就派上用场了。这个函数将返回一个数组,其中包含找到的实例,通常来说,数组中的第一个对象,就是我们的要找的对象。例如,假设我要考察一个名为“NetworkHandler”的类的实例:
cy# choose(NetworkHandler)[0] "<NetworkHandler: 0x103524e00>"
现在,我可以将该实例存储在一个变量中,并进行进一步的考察。
当然,这只是cycript丰富功能中的一个例子而已,若要更加深入的了解该软件的功能,推荐阅读这篇文档。本文到此结束,感谢阅读!