Cycript是由Cydia创始人Saurik推出的一款脚本语言,Cycript混合了OC、JavaScript语法的解释器,这意味着我们能够在一个命令中使用Oc或者JavaScript,甚至两者并用。它能够附加到正在运行的进程,能够查看和修改运行时的数据
基本使用
通过cydia安装,自带的源
https://apt.bingner.com/
就有cycript打开 App ,通过 ssh 连接设备,然后进入Cycrypt调试模式
1
2
3
4
5
6
7
8# 调试进程(PID=323)
cycript -p 323
# 调试进程(进程名)
cycript -p SpringBoard
cycript -p neteasemusic
# `Control+D`退出cycript模式获取进程Id
需要先安装插件:
adv-cmds
(在自带源https://apt.bingner.com/
可找到)1
2
3
4
5# 查看所有进程
ps -A
# 搜索进程
ps -A | grep neteasemusic常用语法
- UIApp:
[UIApplication sharedApplication]
- 定义变量:
var 变量名 = 变量值
- 通过内存获得对象:
#内存地址
- 查看对象的所有成员:
*对象
- 获取所有已加载的OC类:
ObjectiveC.classes
- 获取当前内存中所有UITableViewCell(包含子类)的实例:
choose(UITableViewCell)
- 递归打印所有的子控件:
[view recursiveDescription].toString()
- 查看 bundleId:
[[NSBundle mainBundle] bundleIdentifier]
- UIApp:
函数
1
2
3
4
5
6
7
8
9
10function KenPrintIvars(objc){
var x = {};
for(i in *objc){
try {
x[i] = (*objc)[i];
} catch(e) {
}
}
return x;
}
引用外部脚本
这里使用mjcript
作为外部脚本引入,下载得到mjcript.cy
把文件拷贝到手机上
1 | scp mjcript.cy root@xx.xx.xx.xx:/usr/lib/cycript0.9/mjcript.cy |
把手机的文件拷贝到本地
1 | scp root@xx.xx.xx.xx:/usr/lib/cycript0.9/mjcript.cy ~/Desktop/mjcript.cy |
加载脚本
1 | # 附加到进程 |
mjcript
功能列表
1 | // 包名 |
Cycript默认不支持中文,可以使用 unicode 字符表示中文
\**\**\**\**
技巧:使用python把中文转成unicode字符
1 | unicode("登录", "UTF-8") |
封装cycript脚本
1 | (function(exports) { |
导入(/usr/lib/cycript0.9/test.cy
),并引用
1 | @import test |
通过目录引用/usr/lib/cycript0.9/com/mj/cycript.cy
1 | @import com.mj.mjcript |
小结
Cycript 可以直接附加到App 进行内存调试,可以查看和修改 UIViewController,UIView,可以动态修改和分析应用的业务逻辑,用起来非常方便