Cycript的一些使用方法
前言:最近在搞逆向的一些东西,不免会用到这些,将遇到的坑以及思路整理一下,好让别人不再掉到坑里去.开始!
首先,要使用Cycript你必须有一台越狱手机,这是必要条件,且能连接SSH
关于怎么连接SSH可以看我上一篇文章:SSH连接越狱iPhone(WIFI和USB)
第一步:安装Cycript
-
打开Cydia搜索Cycript进行安装
第二步:SSH连接手机
为了演示一下cy的一些用法,又不至于东西太多,我随手写了几行代码做个Demo来测试
如图
就一个label+一个按钮,按钮点击了会改变label的字
上代码
- (void)viewDidLoad {
[super viewDidLoad];
self.titleLB = [UILabel new];
self.titleLB.text = @"我是标题";
self.titleLB.frame = CGRectMake(100, 200, 200, 40);
[self.view addSubview:self.titleLB];
self.selBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[self.selBtn setTitle:@"按钮" forState:UIControlStateNormal];
self.selBtn.backgroundColor = [UIColor redColor];
self.selBtn.frame = CGRectMake(100, 350, 40, 40);
[self.view addSubview:self.selBtn];
[self.selBtn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
}
- (void)btnClick {
self.titleLB.text = @"我点了按钮";
}
第三步:开始使用Cycript
- 首先使用
ps ax或者ps -e
来查看当前手机进程(注意要把我们需要改的软件打开)
不难看出,红框中就是我写的测试Demo,因为我工程名就是testCycript
然后记住左边的数字,也就是进程的PID,我这里是28743,然后输入
cycript -p 28743
当出现
cy#
的时候,就代表已经hook住我们的程序了,可以开始下一步了
一些示例
1、
UIApp.keyWindow.recursiveDescription().toString()
获取视图结构图(这里的UIApp相当于[UIApplication sharedApplication])
可以很清晰的看到,当前Window上只有2个控件,UILabel和UIButton,后面还有它们的frame以及其它属性
2、
#0x157d1e200
获取对象,当使用了这个命令后,我们就拿到了地址所对应的对象,可以查看其相应的属性,我这里是拿的Label的地址
接下来我们来改动这个Label的text,如图
手机上的label已经改变了
大家应该就懂了,改其它的也是一样了,例如改按钮背景色、透明度等
懂OC语法的应该都知道怎么用了.
这里也可以使用
var p = new Instance(0x157d1e200)
然后用p.alpha = 0.5;这样来修改属性
3、根据类来获取所有方法
function printMethods(className, isa) {
var count = new new Type("I");
var classObj = (isa != undefined) ? objc_getClass(className)->isa :
objc_getClass(className);
var methods = class_copyMethodList(classObj, count);
var methodsArray = [];
for(var i = 0; i < *count; i++) {
var method = methods[i];
methodsArray.push({selector:method_getName(method),
implementation:method_getImplementation(method)});
}
free(methods);
return methodsArray;
}
可以这样一行一行的输入
也可以这样直接复制进去,使用方法如图下半部分
4、获取当前控制器
function currentVC() {
var app = [UIApplication sharedApplication]
var keyWindow = app.keyWindow
var rootController = keyWindow.rootViewController
var visibleController = rootController.visibleViewController
if (!visibleController){
return rootController
}
return visibleController.childViewControllers[0]
}
5、获取按钮的点击方法
这里第一步把按钮的地址传过去生成对象(也可以直接用地址,我这是为了方便)
然后获取按钮的Target,一般来说就是所在控制器,毕竟我们写代码的时候一般都是用的self
然后获取Events,将Target的地址和Events一起传入,最终获得btn的点击方法(可以看我上方代码,方法名就是btnClick)
6、修改按钮的点击方法
vi.constructor.prototype.btnClick = function() {}
然后我点击按钮就已经没反应了
7、退出Crcyipt
?exit