iOS逆向-day3:Cycript
一、Cycript 简介
- 1.1、Cycript 是Objective-C++、ES6(JavaScript)、Java等语法的混合物,可以用来探索、修改、调试正在运行的
Mac
/iOS APP
官网
文档
通过Cydia安装Cycript,即可在iPhone上调试运行中的APP - 1.2、Cycript的开启和关闭
-
开启(进程的查看需要借助 PS指令,请看1.3)
cycript cycript -p 进程ID cycript -p 进程名称
- 爱奇艺的进程是 2613,那么输入:cycript -p 2613,之后的操作都是在调试爱奇艺
- 建议使用进程名称(如爱奇艺:
cycript -p iQiYiPhoneVideo
),因为进程的ID一直在变
-
取消输入:
Ctrl + C
-
退出:
Ctrl + D
-
取消输入:
Command + R
-
- 1.3、ps 命令
- 安装 adv-cmds
-
ps命令是
process status
的缩写,使用ps命令可以列出系统当前的进程-
列出所有的进程
ps –A ps aux
提示:输入上面的指令是在 终端连接iphone的情况下
上图左边是进程 ID
,右边是进程的可执行文件
,右边最后一个单词可以称为进程的名称
,如上图的:launch、amfid、syslogd....... -
搜索关键词,如果是爱奇艺,可以搜索 Video
ps –A | grep 关键词
-
二、Cycript常用语法
-
2.1、常用语法一
-
(1)、获取UIApplication 对象,下面等价
UIApp [UIApplication sharedApplication]
- 说明爱奇艺的UIApplication 就是 UIApplication,没有改名字
-
(2)、定义变量:
var 变量名 = 变量值
// 获取 app的Window var appWindow = UIApp.keyWindow // 获取根控制器 app.rootViewController
以爱奇艺为例打印的是:<RootViewController: 0x12e075600>",说明爱奇艺的根控制器就是:RootViewController
-
(3)、用内存地址获取对象:
#内存地址
-
(4)、ObjectiveC.classes:已加载的所有OC类,如下查看
糗事百科
的主界面WechatIMG45.jpeg
-
(5)、查看对象的所有成员变量:*对象,如查看 UIApplication 里面的所有成员变量,可以如下
*UIApp
-
-
2.2、常用语法二
-
(1)、递归打印view的所有子控件(跟LLDB一样的函数)
view.recursiveDescription().toString()
-
(2)、筛选出某种类型的对象
choose(UIViewController) choose(UITableViewCell)
-
-
2.3、上面的使用太繁琐了,我们可以使用 MJ 老师的工具: mjcript,它是基于Cycript实现的一些实用函数
- 安装
-
2.4、mjcript 工具的用法
- 一些常用属性
- 拿到显示在最前面的控制器,下面以糗事百科为例
- 我们可以看到 糗事百科 我的界面的控制器叫做:
QBMeViewController
-
获得某个类的 对象方法名列表,支持正则表达式查询
MJInstanceMethodNames(控制器的名字 或者 #地址) // 举个正则的例子,找有关login的对象方法 MJInstanceMethodNames(控制器的名字 或者 #地址,/login/)
- 我这里是以糗事百科的设置界面为例
-
获得某个类的 类方法名列表,支持正则表达式查询
MJClassMethodNames(控制器的名字 或者 #地址)
-
获取界面的 view,下面以糗事百科的登录界面为例
MJSubviews(#地址.view)
接着我们可以在登录界面的文本框上动手脚,比如修改
用:#内存地址.text = "190"
来修改手机号的输入#0x1443a7e00.text = "190"
我们还可以找到登录按钮 ,把它移除掉,如下
拿到登录的按钮地址,做如下操作
[#0x1443b9f60 removeFromSuperview]
-
这里做一个小提示:汉子与unicode码转换的方式,下面是用Python
python unicode('登录','UTF-8') u'\u767b\u5f55'
-
三、封装Cycript - .cy文件
-
3.1、
.cy文件
的简单写法,我的文件名是:jkcycript
(function(exports) { // 这里面可以填充我们需要的东西 })(exports);
函数 和 常量的定义
(function(exports) { // 求和 sum = function(a,b) { return a + b }; // 求差 minus = function(a,b) { return a - b }; })(exports); // 在使用的时候我们需要如下操作 // 导入: @import jkcycript @import jkcycript sum(2,3) // 结果是:5
上面是全局的,如果想要前缀可以写为
(function(exports) { // 求和 exports.sum = function(a,b) { return a + b }; // 求差 exports.minus = function(a,b) { return a - b }; })(exports); // 在使用的时候我们需要如下操作 // 导入: @import jkcycript @import jkcycript jkcycript.sum(2,3) // 结果是:5
- exports 参数名固定,用于向外提供接口
- 将
.cy
文件存放到/usr/lib/cycript0.9
目录下
-
3.2、更多的可以参考MJ老师的mjcript
四、Reveal (UIView层级分级工具)
Reveal-
4.1、Reveal是一款调试iOS程序UI界面的神器
官网:https://revealapp.com
下载:https://revealapp.com/download/
破解版:提取码: y8ri
建议下载至少Reveal4版本,支持USB连接调试,速度快。低版本的只能WiFi连接调试提示 :Reveal 只能识别 UIView 的层级结构,想要是识别控制器的结构,我们可以使用 mjcript
- 如果是我们自己的app,我们可以在 xcode上查看,也可以用 Reveal,参考博客 iOS更新系统10.13.4关于Reveal4的破解版和最新配(亲测可用)置
-
4.2、Reveal 调试环境配置 (越狱设备)
-
调试环境配置 一 :iPhone上安装Reveal Loader
软件源:http://apt.so/codermjlee,不要安装其他源的版本,有可能不支持新版Reveal
-
调试环境配置 二
安装完Reveal Loader后,打开【设置】,选择需要调试的APP -
调试环境配置 三
找到Mac的Reveal中的RevealServer
文件,覆盖iPhone的/Library/RHRevealLoader/RevealServer
文件,我们可以用iFunBox
打开
WechatIMG61.jpeg- 重启SpringBoard或者重启手机,可以在iPhone上输入终端命令
重启SpringBoard:killall SpringBoard
重启手机:reboot
- 重启SpringBoard或者重启手机,可以在iPhone上输入终端命令
-
-
4.3、在上面的操作做完,我们再重新打开 Reveal ,就可以看到使用中的iphone
选择USB方式开始调试:速度更快
屏幕快照 2019-11-29 下午1.01.29.png