iOS逆向与安全5.3:Cycript
2019-06-13 本文已影响0人
looha
Cycript
Cycript是由Cydia创始人Saurik推出的一款脚本语言,Cycript混合了OC、JavaScript语法的解释器,这意味着我们能够在一个命令中使用Oc或者JavaScript,甚至两者并用。它能够挂钩正在运行的进程,能够在运行时修改很多东西。
高级语言语言 --> 二进制(对应架构)
解释型(同声翻译):Python
编译型(翻译成书):OC
Cycript 程序运行状态下,不用停止 ,就可以调试显示
Cycript的安装
-
下载 官网
-
将资源放入指定位置
一般放在 /opt/位置
文件位置
-
配置环境变量
编辑 vim ~/.bash_profile文件
export cycript_src=/opt/cycript_0.9.594/
export PATH=$PATH:$cycript_src
更新刚配置的环境变量
$ source .bash_profile
编辑 ~/.zshrc 不用每次手动执行source .bash_profile
$ vim ~/.zshrc
加入
source /Users/looha/.bash_profile
保存即可
Cycript的使用
- 连接手机
通过WIFI 端口连接 非越狱手机无法打开端口,借助于monkey, monkey套包会为应用申请端口6666
![](https://img.haomeiwen.com/i1902357/69ae758d6a883b24.png)
cycript -r ip地址
cycript -r 192.168.3.222:666
![](https://img.haomeiwen.com/i1902357/8c6fa19fbc0f2ff1.png)
- 使用
UIWindow.keyWindow() 获取keyWindow
UIApp 获取APPlication单例对象
recursiveDescription() 循环打印子视图
toString() 格式化打印(遇到\n换行)
# 对象地址。拿到该对象,可用于调用方法
#0xxxxxx.allTargets() 获取所有Target
#0xxxxxx.allControlEvents() 获取所有Target
获取target
[0xxxx actionsForTarget:target forControlEvent:64]
* 对象地址。可以取出对象的成员变量
Choose(类名) 查询当前进程中该类型的对象。
var keyWindow = UIWindow.keyWindow() 定义变量
[I for (I in * keyWindow)] 遍历循环打印
choose(UIView) 搜索选择
com + D 退出
![](https://img.haomeiwen.com/i1902357/c9a872ba43a44bab.png)
![](https://img.haomeiwen.com/i1902357/423586d4be72e255.png)
![](https://img.haomeiwen.com/i1902357/76dd0ec7b41c1d1b.png)
![](https://img.haomeiwen.com/i1902357/3571867229b62c42.png)
![](https://img.haomeiwen.com/i1902357/8792c1ef827e7c50.png)
![](https://img.haomeiwen.com/i1902357/f3f467da465ca021.png)
脚本自动连接
可以在个人文件根目录下建立sh文件 :LHShell
cycript -r 192.168.3.222:666
vim ~/.bash_profile
配置环境变量
export LHShell=~/LHShell
export PATH=$LHShell:$CY
![](https://img.haomeiwen.com/i1902357/d86e3c3a2fc8c97f.png)
- 登录 sh
sh cycriptLogin.sh
. cycriptLogin.sh
source cycriptLogin.sh
动态修改
在app运行时,用于cycript登录 ,修改界面 可及时看到修改界面
高级用法
- 输出当前所有的类
ObjectiveC.classes
- 输出bundle id
APPID
- pviews
pviews 控件
pviews()
pvcs()控制器
pvcs()
响应者 pactions(*0xxxxxxxx)
pactions(*0xxxxxxxx)
![](https://img.haomeiwen.com/i1902357/09d97beb391f512a.png)
响应者链条 rp(#0xxxxxxxx)
rp(#0xxxxxxxx)
![](https://img.haomeiwen.com/i1902357/aa2a2f2114b2f635.png)
![](https://img.haomeiwen.com/i1902357/ddb2cf7ffa99a7b8.png)
cy文件封装
Cy文件
Cycript是一门脚本语言,它可以加载封装好的.cy文件。
我们会将常见的Cycript常用功能封装到.cy文件中,便于调试。
非越狱中导入.cy文件
利用MonkeyDev工具导入.cy文件
MonkeyDev本身集成了Cycript。我们只需要将.cy文件通过xcode导入Framworks目录即可。
在monkey工程中
-
新建空文件Empty文件
image.png
![](https://img.haomeiwen.com/i1902357/fc32db3410d27a19.png)
-
添加到frameworks
image.png
-
cycript 导入
@import test
![](https://img.haomeiwen.com/i1902357/513f2e4c895c9a7a.png)
![](https://img.haomeiwen.com/i1902357/3da516b97aeaec2d.png)
PS 在cy文件中,定义的变量一旦加载后,就固定了,再不会变。为避免这个问题,可以用function()写成动态
![](https://img.haomeiwen.com/i1902357/213a727b277444f4.png)