以前文章已经对LLDB进行了介绍和使用。LLDB在咱们调试应用的时候确实很爽,但他每次都要断住程序,这在分析而且修改APP的时候确实是一个优点,可是在面对一个比较大型的项目,咱们须要总体分析的时候,这样调试就显得有些力不从心了。而Cycript就能够弥补上这个需求。html
Cycript是由Cydia创始人Saurik推出的一款脚本语言,Cycript混合了OC、JavaScript语法的解释器,这意味着咱们可以在一个命令中使用Oc或者JavaScript,甚至二者并用。它可以挂钩正在运行的进程,可以在运行时修改不少东西。git
编译型语言(OC) 须要将源码通过编译器编译,生成对应架构的可执行文件(二进制)github
解释型语言(Python) 源码不须要编译器提早编译,而是在运行的时候,通过一套对应的解释器,临时将源码翻译成二进制让CPU识别。vim
编译型语言就至关于一个英语娴熟的人看一本英文书籍,不须要借助别的工具了。代价就是学英语这个过程很慢(编译时间长)。 解释型语言就至关于一个不会英语的人看一本英文书籍,这时候就须要借助工具(字典)才能正常阅读。好处的就是没有学习(编译)这么个耗时的过程。api
理论上解释型语言在运行效率上会比解释型语言慢不少,但实际上如今有不少牛逼的解释器,在执行特定的代码的时候效率也很是快。原理就是在执行的的时候会将以前解释过的代码缓存起来,以后就不须要重复解释了。如:pypy3缓存
这片文章的主角Cycript就是解释型语言!安全
Cycript的安装极其简单,在这里下载SDK,下载下来的就是一个可执行文件。文件不大,只有2.9M。ruby
打开终端,CD进入Cycript目录直接运行Cycriptbash
./cycript
复制代码
不出意外这个时候会有以下报错:
微信
这是由于本地Ruby版本和Cycript要求的版本不同致使(其实代码都同样,只是版本号换了就不认识了,真蠢)。
cd /System/Library/Frameworks/Ruby.framework/Versions/
ls
复制代码
本地显示版本号为:2.3,而Cycript要求的版本号2.0。
解决方案:
复制一本Ruby源码,将其版本号(文件夹名称)改成2.0
在 OS X El Capitan 中有一个跟安全相关的模式叫 SIP(System Integrity Protection ),它禁止让软件以 root 身份来在 Mac 上运行,在升级到 OS X 10.11 中或许你就会看到部分应用程序被禁用了,这些或许是你经过终端或者第三方软件源安装。对于大多数用户来讲,这种安全设置很方便,可是也有些开发者或者高级 Mac 用户不须要这样的设置。
csrutil disable
,重启csrutil enable
重启电脑后,运行以下命令:
sudo mkdir -p /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/
sudo ln -s /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/libruby.2.3.0.dylib /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/libruby.2.0.0.dylib
复制代码
注:根据每一个人ruby版本不一样,将上面第二条命令的/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib/libruby.2.3.0.dylib中的2.3改为本机的ruby版本。 这里不是降级ruby,只是复制一份2.0的ruby的dylib,让cycript运行起来。
再次运行
./cycript
复制代码
若是出现 cy#
即表明进入Cycript环境了。
/opt
目录是专门放置一些额外功能包的目录,因此咱们将Cycript也放在该目录下。
进入用户的根目录,里面有个文件.bash_profile
,用文本编辑器打开。
export CY=/opt/cycript_0.9.594/
export PATH = $CY:$PATH
复制代码
Save保存。以后就能够在任意目录下使用Cycript了。
在上篇文章中已经介绍了Monkey,而且能够看出它已经帮咱们集成了Cycript的动态库。因此一下就配合着Monkey来进行调试。
快马加鞭,新建一个Monkey工程,将已经砸壳成功的优酷ipa包放入对应的Target目录下。详情参考:
因为Monkey默认开放了一个端口号6666,如图:
因此咱们就使用Cycript链接端口号6666,找到手机链接的Wifi的IP地址:
cycript -r 192.168.32.113:6666
复制代码
若是你那一直停在这一步,没有进入Cycript环境
那么有三种可能
一切正常后就能够开始调试了,见以下图:
// 查看当前的KeyWindow
UIWindow.keyWindow()
// 自定义变量
var keyWindow = UIWindow.keyWindow()
keyWindow
// 隐藏状态栏
[UIApp setStatusBarHidden:YES];
// 使用地址查看
#0x108e3cd80
// 查看一个对象下的全部变量
*#0x108e3cd80
// 查看一个对象下成员变量的名字
[i for(i in *keyWindow)]
// 格式化输出当前View的层级关系
keyWindow.recursiveDescription().toString()
// 显示当前View下的全部的Button
choose(UIButton)
复制代码
在以前的文章 LLDB,自制LLDB脚本,窜改微信红包金额 中介绍了LLDB能够本身定义脚本以方便本身使用,一样Cycript也是能够作到自定义API。
新建一个cy文件,取名FYTest.cy
在FYTest.cy中定义变量和函数
// 获取AppID
FYAPPID = NSBundle.mainBundle.bundleIdentifier;
// 获取沙盒目录
FYAPPPATH = NSBundle.mainBundle.bundlePath;
FYRootVC = function(){
return UIApp.keyWindow.rootViewController;
};
FYGetCurrentVCFromRootVC = function(rootVC){
var currentVC;
if([rootVC presentedViewController]){
rootVC = [rootVC presentedViewController];
}
if([rootVC isKindOfClass:[UITabBarController class]]){
currentVC = FYGetCurrentVCFromRootVC(rootVC.selectedViewController);
}else if([rootVC isKindOfClass:[UINavigationController class]]){
currentVC = FYGetCurrentVCFromRootVC(rootVC.visibleViewController);
}else{
currentVC = rootVC;
}
return currentVC;
};
// 获取当前VC
FYCurrentVC = function(){
return FYGetCurrentVCFromRootVC(FYRootVC());
};
复制代码
FYTest.cy文件虽然已经在咱们的APP里面了,可是咱们每次使用的时候仍是须要导入一次。
@import FYTest
复制代码
Monkey默认帮咱们预装好了几个cy文件,分别在一下两张图的位置:
MachO中的cy
经过网络加载的cy
具体有哪些变量能够用,哪些函数能够用均可以在这找到哦:ms,md
到此,全部非越狱环境下的东西已经整理完了,接下来将要开启新的篇章:手机越狱、砸壳、以及汇编静态分析。若是你以为有帮助,就点个当心心吧