这里使用了越狱手机, 在手机上通过Cydia安装了Cycript.
还可以通过注入的方式注入到非越狱设备, MonkeyDev就是使用了这样的方法
一、启动Cycript
1. 通过SSH远程登录iPhone
参考 SSH远程登录iPhone
2. 查看进程
// 查看所有进程
ps -A
// 查看指定进程
ps -A | grep WeChat
查找结果
956 ?? 6:51.88 /var/mobile/Containers/Bundle/Application/F3FC3536-BAE2-43FA-B360-05A9A42C68C8/Wechat.app/WeChat
3. 连接进程(比如微信)
// 通过进程名
cycript -p Wehcat
通过进程名连接进程时, 如果有两个同名的进程, 会连接前一个
// 通过进程ID连接
cycript -p 956
二、Cycript的简单使用
Cycript的命令可以去其官网查看使用方法
1. cy文件的运用
Cycript可以定义函数
cy# function sum(a,b){return a+b;}
cy# sum(1,2)
3
但是这种方式定义的函数再次连接Cycript的时候会失效
Cycript支持一种cy文件, 可以永久定义函数和命令
创建一个test.cy文件, 其内容如下:
rootvc = function(){
6 return UIApp.keyWindow.rootViewController;
7 }
将test.py文件保存到iPhone的/usr/lib/cycript0.9/
目录下
注:
/usr/lib/cycript0.9/
这个目录会随着cycript的版本更改, 最好是去/usr/lib/
目录中找一找
scp -P 12345 test.cy root@127.0.0.1:/usr/lib/cycript0.9/
函数使用
注意: 修改cy文件之后, 最好杀死应用重新启动链接, 不然不起作用
cy# @import test
{}
cy# rootvc()
#"<WCRootNavigationController: 0x15c5b7200>"
test.cy文件中也可以这样写
rootvc = UIApp.keyWindow.rootViewController;
注意, 这样写的好处是可以不写省略号, 但是这种命令在@import的时候就执行了, rootvc相当于一个变量 ,之后的使用都不会再更改rootvc的值, 如果你获取的值有改变的可能, 不要使用这种方式, 比如
visibleViewController
2. 常用的函数或命令
z_rootvc = function(){
return UIApp.keyWindow.rootViewController;
};
z_appid = [NSBundle mainBundle].bundleIndentifier;
z_curentVCFromRootVC = function(rootVC){
var currentVC;
if([rootVC presentedViewController]){
rootVC = [rootVC presentedViewController];
}
if([rootVC isKindOfClass:[UITabBarController class]]){
currentVC = z_curentVCFromRootVC(rootVC.selectedViewController);
}else if([rootVC isKindOfClass:[UINavigationController class]]){
currentVC = z_curentVCFromRootVC(rootVC.visibleViewController)
} else {
current = rootVC;
}
return currentVC;
};
z_currentVC = function(){
return z_curentVCFromRootVC(z_rootvc());
};
网友评论