IOS逆向学习-Cycipt
- 1. Cycript
-
- 1.1 Cycript简介和安装
- 1.2 Cycript的开启和关闭
- 1.3 Cycript的常用语法
- 1.4 自己的Cycript-.cy文件
- 1.5 Reveal
- 1.6 ipa安装过程
- 1.7 逆向APP的思路
- 1.8 class-dump
- 1.9Hopper Disassmbler
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和进程名称
- 需要在手机上安装
,在安装Cycript的时候就已经安装了adv-cmds
adv-cmds
-
命令是ps
的缩写,使用ps命令可以列出系统当前的进程process status
-
: 列出所有的进程ps -A
-
:所有关键词相关的进程ps -A | grep 关键词
- 查询手机上当前所有进程、根据关键字搜索进程,以网易云音乐为例:
- 需要在手机上安装
-
: 进入cycript语言编程环境cycript
-
或则cycript -p 进程ID
都进入某个app的调试状态cycript -p 进程名称
-
: 退出调试环境ctrl + D
- 注意:建议使用进程的名称,因为进程名称只要app装在手机上,可执行文件就是不变的,所以名称不会变,而进程的id可能时刻都在变化
- 进入某个app的调试环境(以网易云音乐为示例):
-
: 取消输入ctrl + C
-
1.3 Cycript的常用语法
-
:UIApp
[UIApplication shareApplication]
- 定义变量:
var 变量名 = 变量值
- 用内存地址获取对象:
#内存地址
-
:已加载的所有OC类ObjectiveC.classes
- 查看对象的所有成员变量:
*对象
- 递归打印view的所有子控件(跟LLDB一样的函数):
view.recursiveDescription().toString()
- 刷选出某种类型的对象:
、choose(UIViewController)
choose(UITableViewCell)
- 常用语法示例:
-
: 获取当前对象#对象地址
- 获取类的所有成员变量(
):*UIApp
- 递归打印所有子控件(
):UIApp.keyWindow.recursiveDescription().toString()
- cycript自带函数:
筛选某种类型的对象:choose(xxxxx)
-
1.4 自己的Cycript-.cy文件
- 首先我们可以下载一个超级编辑器
sublimetext
- 官网:http://www.sublimetext.com
- 我们可以将常用的Cycript代码封装在一个.cy文件
- 首先需要编写一个
文件.cy
- 把
文件拷贝到iPhone端的.cy
目录下usr/lib/cycript0.9
- 终端进入调试环境,然后导入写好的.cy文件 然后使用
- 导入方式如下图:
- 首先需要编写一个
-
参数名固定,用于向外部提供接口,如果exports
文件内部的属性和方法没有用.cy
来修饰,那么在外部是无发访问的,在js中在函数中声明函数属于私有exports
- 外部调用方法是类型(文件名).函数名(变量名):
*如果想实现全局函数,则不需要使用exports关键字来修饰,则可以直接调用
由上图可知,没有使用exports关键字修饰的方法和属性 都不属于test,所以我们导入test时候,发下里面只有使用exports关键字来修饰的方法和属性
- 如果把封装的文件没有放入到cycript的根路径下,那么在导入你自己写的库时需要带上路径
- MJ封装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.
- 网上很多的资料是说 把
文件拷贝到iPhone的RevealServer
文件, 如果路劲不存在的话就自己创建, 这里本人试过,但是没有用。/Library/RHRevealLoader/RevealServer
:正确操作如下
- 首先找到Mac的Reveal中的
文件,覆盖iPhone的RevealServer
中的/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
-
:顾明思议,它的作用就是吧Mach-O文件的class信息给dump出来(把类信息导出来),生成对应的.h文件,官网地址:http://stevenygard.com/projects/class-dump/class-dump
- Mac上终端编译指令为什么输入就会找到,而有些是找不到, 那是因为你执行的命令,mac会去两个地方寻找(
或user/bin
),user/local/bin
- 平时所有用到的指令都在这两个文件夹下,所以我们执行
等指令都可以直接执行,但是 在mac系统10.11 开始 usr/bin目录已经不能写数据了, 所以我们可以把cd
执行文件放在class-dunmp
目录下,这样你在执行local/bin
指令时不会出现找不到该指令class-dump
- 常用格式:
class-dump -H Mach-O文件路径 -o 头文件存放目录
-
把class-dump
文件的可执行头文件导出来,根据头文件我们可以分析app的一些类、函数。代码编译过程:Mac-o
- class-dump是分析机器语言,然后导出一些头文件:
1.9Hopper Disassmbler
- Hopper Disassmbler能够将Mach-O文件的机器语言代码反编译成汇编代码、OC伪代码或则swift伪代码
- 常用快捷键 : Shift + option + X()找出哪里引用了这个地方
- 可以分析以下苹果框架的方法调用流程, 可以看一些伪代码 ,大概知道调用过程 还是比较实用的
- 软件 百度搜索下载即可