IOS逆向学习-Cycipt
1. Cycript
1.1 Cycript简介和安装
- Cycript是Objective-C++、ES6(JavaScript)、Java等语法的混合物
- 可以用来探索、修改、调试正在运行的Mac、IOS App
- 官网:http://www.cycript.org/
- 文档:http://www.cycript.org/manual/
- 通过Cydia安装Cycript,即可在iPhone上调试运行中的APP
- Cycript支持的语言:
- Cydia中安装Cycript(如果发现失败,报错:can’t find a source to download version… 请刷新下全部的源,在安装):
1.2 Cycript的开启和关闭
-
如何获取手机app的进程id和进程名称
- 需要在手机上安装
adv-cmds
,在安装Cycript的时候就已经安装了adv-cmds
ps
命令是process status
的缩写,使用ps命令可以列出系统当前的进程ps -A
: 列出所有的进程ps -A | grep 关键词
:所有关键词相关的进程- 查询手机上当前所有进程、根据关键字搜索进程,以网易云音乐为例:
- 需要在手机上安装
-
cycript
: 进入cycript语言编程环境cycript -p 进程ID
或则cycript -p 进程名称
都进入某个app的调试状态ctrl + D
: 退出调试环境- 注意:建议使用进程的名称,因为进程名称只要app装在手机上,可执行文件就是不变的,所以名称不会变,而进程的id可能时刻都在变化
- 进入某个app的调试环境(以网易云音乐为示例):
ctrl + C
: 取消输入
1.3 Cycript的常用语法
-
UIApp
:[UIApplication shareApplication]
-
定义变量:
var 变量名 = 变量值
-
用内存地址获取对象:
#内存地址
-
ObjectiveC.classes
:已加载的所有OC类 -
查看对象的所有成员变量:
*对象
-
递归打印view的所有子控件(跟LLDB一样的函数):
view.recursiveDescription().toString()
-
刷选出某种类型的对象:
choose(UIViewController)
、choose(UITableViewCell)
-
常用语法示例:
-
#对象地址
: 获取当前对象
-
获取类的所有成员变量(
*UIApp
): -
递归打印所有子控件(
UIApp.keyWindow.recursiveDescription().toString()
): -
cycript自带函数:
choose(xxxxx)
筛选某种类型的对象:
-
1.4 自己的Cycript-.cy文件
-
首先我们可以下载一个超级编辑器
sublimetext
-
我们可以将常用的Cycript代码封装在一个.cy文件
- 首先需要编写一个
.cy
文件 - 把
.cy
文件拷贝到iPhone端的usr/lib/cycript0.9
目录下 - 终端进入调试环境,然后导入写好的.cy文件 然后使用
- 导入方式如下图:
- 首先需要编写一个
-
exports
参数名固定,用于向外部提供接口,如果.cy
文件内部的属性和方法没有用exports
来修饰,那么在外部是无发访问的,在js中在函数中声明函数属于私有
-
外部调用方法是类型(文件名).函数名(变量名):
*如果想实现全局函数,则不需要使用exports关键字来修饰,则可以直接调用
由上图可知,没有使用exports关键字修饰的方法和属性 都不属于test,所以我们导入test时候,发下里面只有使用exports关键字来修饰的方法和属性
-
如果把封装的文件没有放入到cycript的根路径下,那么在导入你自己写的库时需要带上路径
1.5 Reveal
-
Reveal是一款调试IOS程序UI界面神器
-
官网:Reveal官网下载,本人这里是在玩转苹果上下载一个Reveal24版本的
-
iPhone上安装Reveal Loader 工具,但是此版本很久了, 本人安装的是Reveal2Loader ,直接在Cydia中搜索即可:
-
调试配置环境
- 在Mac和iPhone上安装软件之后,连接之后调试APP的时候可能会报错:
The operation couldn’t be completed. The app is linked against an older version of the Reveal library. You may need to update the Reveal library in your app.
- 网上很多的资料是说 把
RevealServer
文件拷贝到iPhone的/Library/RHRevealLoader/RevealServer
文件, 如果路劲不存在的话就自己创建, 这里本人试过,但是没有用。正确操作如下
: - 首先找到Mac的Reveal中的
RevealServer
文件,覆盖iPhone的/Device/Library/Frameworks/RevealServer.framework
中的ReverServer
文件
- 在Mac和iPhone上安装软件之后,连接之后调试APP的时候可能会报错:
-
经过上述文件替换之后, 我们重启Mac上的Reveal,在打开手机上的app就可以正常调试界面了,如果你的手机和电脑连着同一个wifi,会出现wifi标志的选择, 插着USB线,会出现USB线调试的选择, 一般会选择USB的选项,速度比较快
-
重启SpringBoard或则重启手机,可以在iPhone上输入终端命令
- 重启SpringBoard :
killall SpringBoard
- 重启手机:
reboot
- 重启SpringBoard :
1.6 ipa安装过程
- ipa的安装: Mach-o 文件(IOS中代码可执行文件的格式)
1.7 逆向APP的思路
- 界面分析:Cycript、Reveal
- 代码分析:对Mach-O文件的静态分析
- MachOView、class-dump、Hopper Dosassember、ida等软件
- 动态调试:对运行中的APP进行代码调试;
debugserver
、LLDB
- 代码编写:注入代码到APP中,必要时还可能需要重新签名、打包ipa
1.8 class-dump
-
class-dump
:顾明思议,它的作用就是吧Mach-O文件的class信息给dump出来(把类信息导出来),生成对应的.h文件,官网地址:http://stevenygard.com/projects/class-dump/ -
Mac上终端编译指令为什么输入就会找到,而有些是找不到, 那是因为你执行的命令,mac会去两个地方寻找(
user/bin
或user/local/bin
),
-
平时所有用到的指令都在这两个文件夹下,所以我们执行
cd
等指令都可以直接执行,但是 在mac系统10.11 开始 usr/bin目录已经不能写数据了, 所以我们可以把class-dunmp
执行文件放在local/bin
目录下,这样你在执行class-dump
指令时不会出现找不到该指令 -
常用格式:
class-dump -H Mach-O文件路径 -o 头文件存放目录
-
class-dump
把Mac-o
文件的可执行头文件导出来,根据头文件我们可以分析app的一些类、函数。代码编译过程:
-
class-dump是分析机器语言,然后导出一些头文件:
1.9Hopper Disassmbler
- Hopper Disassmbler能够将Mach-O文件的机器语言代码反编译成汇编代码、OC伪代码或则swift伪代码
- 常用快捷键 : Shift + option + X()找出哪里引用了这个地方
- 可以分析以下苹果框架的方法调用流程, 可以看一些伪代码 ,大概知道调用过程 还是比较实用的
- 软件 百度搜索下载即可