Cycript 有两种使用方式
1:动态使用在越狱机器上,可以对越狱机器的所有应用使用Cycript
2:xcode使用lib文件 可以在非越狱机器上使用 但仅仅限于构建自己的应用 只能在自己的应用里使用Cycript
下面来分别介绍这两种方式的使用过程
一:Cycript的安装
网上关于Cycript的安装都是使用sftp将下载的包文件推入越狱设备,但是Cycript官网给出的却是
显然Cycript.ios和Cycript.osx是在非越狱手机上使用并为xcode提供framework的,但第二种根本没有可以推入的deb包。
原来在这个网址里http://www.cycript.org/debs/
将最新的包下载到桌面
注意:使用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# 如下图所示
ssh远程登录的时候可能会出现这个问题
问题原因在于 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
运行前 如图
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#
改变结果如图
下面进行函数的hook
依着上文 拿到viewController的句柄或者成为指针
配置打印viewController里面所有函数的函数
得到结果
发现了目标函数buttonClick。但是此时不知道如何获得这个函数的调用 网上以及官网里的isa调用messages方法在ios8.3里似乎不行
打印viewController里的所有属性
就没有发现所谓的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的名字和实现方式是存在着这样的一种一一映射
我们可以利用 method_exchangeImplementations 来交换2个方法中的IMP,
我们可以利用 class_replaceMethod 来修改类,
归根结底,都是偷换了selector的IMP,如下图所示:
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