cycript使用的方式以及hook函数的过程

Cycript 有两种使用方式

1:动态使用在越狱机器上,可以对越狱机器的所有应用使用Cycript

2:xcode使用lib文件 可以在非越狱机器上使用 但仅仅限于构建自己的应用 只能在自己的应用里使用Cycript

下面来分别介绍这两种方式的使用过程

一:Cycript的安装

网上关于Cycript的安装都是使用sftp将下载的包文件推入越狱设备,但是Cycript官网给出的却是


cycript使用的方式以及hook函数的过程_第1张图片
cycript使用的方式以及hook函数的过程_第2张图片
cycript使用的方式以及hook函数的过程_第3张图片
cycript使用的方式以及hook函数的过程_第4张图片

显然Cycript.ios和Cycript.osx是在非越狱手机上使用并为xcode提供framework的,但第二种根本没有可以推入的deb包。

原来在这个网址里http://www.cycript.org/debs/

将最新的包下载到桌面


cycript使用的方式以及hook函数的过程_第5张图片

注意:使用stfp将包推送到越狱手机之前 一定要早终端上先cd进包的文件夹

sftp [email protected]

输入密码

sftp -> put cycript.deb

sftp -> put libffi_1-3.0.10-5_iphoneos-arm.deb

接下来退出stfp进入ssh [email protected]

首先要 dpkg -i libffi_1-3.0.10-5_iphoneos-arm.deb 不然cycript.deb包无法安装成功 cycript.deb是依赖libffi_1-3.0.10-5_iphoneos-arm.deb的

然后 dpkg -i cycript.deb

安装成功 运行cycript将会显示cy# 如下图所示


cycript使用的方式以及hook函数的过程_第6张图片

ssh远程登录的时候可能会出现这个问题

cycript使用的方式以及hook函数的过程_第7张图片

问题原因在于 ssh密码变更,电脑上rsa的钥匙串密码未改变

解决办法:

清除旧的公钥信息

ssh-keygen -R 192.168.0.100

在安装的过程中出现了这个问题 尚未解决

dyld: lazy symbol binding failed: Symbol not found: ___clear_cache

Referenced from: /usr/lib/libsubstrate.dylib

Expected in: /usr/lib/libgcc_s.1.dylib

有可能会出现这种bug

dyld: Library not loaded: /usr/lib/libapr-1.0.dylib

Referenced from: /usr/bin/cycript

Reason: no suitable image found.  Did find:

/usr/lib/libapr-1.0.dylib: no matching architecture in universal wrapper

/usr/lib/libapr-1.0.dylib: no matching architecture in universal wrapper

Trace/BPT trap: 5

然而通过这种方式安装不得不说实在是太傻X了

完全可以在cydia里搜索cycript进行安装,这种安装完全没有任何bug 不像之前 可能会出现各种问题

cycript也是一种源啊···

二:用越狱的方式使用cycript

现在来简单挂钩一下自己写的demo

运行前 如图


cycript使用的方式以及hook函数的过程_第8张图片


Last login: Fri Jul 22 17:42:36 on ttys000

dandeMacintosh:~ danchen$ [email protected]//登录越狱机器

[email protected]'s password:  //输入ssh密码

dande-iPhone:~ root# ps aux | grep test1 //获取test1的进程

root      3070   0.0  0.0   536256    444 s000  R+    5:50PM   0:00.01 grep test1 //系统根进程

mobile    3055   0.0  2.4   577264  25220   ??  SXs   5:45PM   0:00.55 /var/mobile/Containers/Bundle/Application/04882BBD-4E14-41CA-B0BE-E22B18AB8EF3/test1.app/test1   //test1的进程

dande-iPhone:~ root# cycript -p 3055  //cycript挂住该进程

cy#varapp=[UIApplication sharedApplication] //获取app的当前实例

#""

cy#varwindow=app.keyWindow  //获取当前实例的运行窗口

#"; layer = >"

cy#varrootController=window.rootViewController //获取运行窗口的根视图控制器

#""

cy# rootController.view.backgroundColor=[UIColor yellowColor] //将根视图下的view的背景色变为黄色

#"UIDeviceRGBColorSpace 1 1 0 1"

cy#


改变结果如图


cycript使用的方式以及hook函数的过程_第9张图片

下面进行函数的hook

依着上文 拿到viewController的句柄或者成为指针

配置打印viewController里面所有函数的函数


cycript使用的方式以及hook函数的过程_第10张图片

得到结果


发现了目标函数buttonClick。但是此时不知道如何获得这个函数的调用 网上以及官网里的isa调用messages方法在ios8.3里似乎不行

打印viewController里的所有属性


cycript使用的方式以及hook函数的过程_第11张图片

就没有发现所谓的message。

官网上给出的实现hook的案例是


这种方法在ios8.3上实现不了 IOS8.3的文件结构中没有messages这一项。

比如这个 是应该将ViewController里的validateLogin函数替换成function()这个函数

不过hook的方法肯定能找到。

但是似乎没有什么hook的必要性 原因在于

cycript是一种运行时工具,即是说如果要想hook一个目标函数,首先就需要得到它的句柄(又可以称为指针),然而拿到它的句柄的前提,是需要从根句柄,即是app的keyWindow出发一层层的解析遍历

然而这个app的分析就类似树的结构

从UIApp --> keyWindow  --->rootViewController

这样一层层的遍历分析下去 才能找出这个目标函数 然而每一层的遍历其实是很不容易的 原因在于

a:IOS本身的导航栏,TabController,pushViewController,scrollView等等其实是非常复杂的结构,不同的组合会应变出不同的结构 这个因app的种类繁杂而变得不同 依靠自动化去分析本身就是一件非常困难的事情,而每一种原生插件都有可能是我们需要分析的对象,每一种原生插件的

API以及结构已经足够复杂···

比如本例仅仅是只有一个页面,一个button,实现的组织结构为


诸如QQ这样的组织结构,一屏幕都放不下。

原本分析APP的逻辑本不是HOOK的主要工作,但是使用这样方式来做的话,非要层层分析到不可。这种分析的过程本身就带了OC以及IOS开发中很多知识,比如TabController控制着几个tab,UINavigationController被谁控制,同时又控制着谁,某个viewController是该UINavigationController的第几层,scrollView有几个子页面,滑动的时候有可能会触发一些操作,TableViewCell上的重用机制导致随着屏幕的滑动,cell句柄的改变等等...正是这种过程使得通过分析UI来层层获得对应的句柄困难重重···

b:很多非IOS原生的组织系统,比如第三方自己写的结构,如果app加入了这个,因为我们并不了解这种第三方结构,使得自动化分析几乎成为不可能的事情

c:这只是hook一些IOS app的API。假设我们要hook的是私有API,那么即是将树的某一步递归分得更加细致,拿到私有API的指针,进行HOOK。这样更加增加了自动化的难度。

d:即使经过层层努力,定位到了目标函数,然而仍然需要将目标函数的内容提取出来,才能实现监控,不然就改变了样本原有的操作。而通过这种方式获取目标函数的内容仍然是一大难点。

e:运行时hook 其实是运用的OC语言Method Swizzling的原理。这里我盗个图来解释一下这种原理。

原本的方法实现selector的名字和实现方式是存在着这样的一种一一映射


cycript使用的方式以及hook函数的过程_第12张图片

我们可以利用 method_exchangeImplementations 来交换2个方法中的IMP,

我们可以利用 class_replaceMethod 来修改类,

归根结底,都是偷换了selector的IMP,如下图所示:


cycript使用的方式以及hook函数的过程_第13张图片

cycript运用的就是这种机制。然而这并没什么用,仅仅是在运行时进行实时更改,一旦kill掉进程,重新来启动一遍的话,如果不再次实时hook,其实它是改变不了app的任何内容的,也无法进行监测。

这里可以将cycript和theos做一个比较

theos是在外部注入dylib去hook指定的类里的函数的,theos不需要进行动态运行时的分析,因为它不需要拿到任何运行时的指针,在外部进行hook修改。外部的插件总是存在的,不管app是否安装,是否启动,是否在后台活动。但theos不是太容易区分是哪个进程进行的操作,这个想必在tweak中的加入判断条件也不是难事。

cycript是在内部去hook的,它没有加入任何的dylib。进程一旦结束,则cycript内部所做的任何修改监测都将不复存在。但cycript却是对app进程唯一进行评判分析的。

简单点总结:cycript来实现自动化定位hook几乎是一件不太可能的事情,因为即便就是人为使用cycript去hook一个指定函数的话,都不是件太容易的事情。

而且使用cycript来进行扩展的话 基本是一件没必要也太可能实现我们目标的事情。

就实现的难度而言 theos容易扩展,较为方便的实现我们监控的需求。而cycript则实现的难度很大,而且实现的方式也不够满足我们的需求。

参考资料:http://www.mobile-open.com/2015/52491          htmlhttp://blog.csdn.net/fg313071405/article/details/38496305http://blog.csdn.net/sakulafly/article/details/29633627

你可能感兴趣的:(cycript使用的方式以及hook函数的过程)