学习逆向的意义
- 掌握编码的本质,编写高效代码
- 修改已有APP的功能
- 学习优秀APP的设计
- 增强客户端的安全性
- 通用性极强(越底层,通用性越强)
越狱环境的搭建
准备环境
-
iPhone 5S(因为从5S开始支持arm64架构)或者至少是iPad Air、iPad mini2等支持arm64架构的设备
-
检查手机是否可以越狱:
http://jailbreak.25pp.com/ios
什么是iOS Jailbreak
利用iOS系统的漏洞,获取iOS系统的最高权限(Root),解开之前的各种限制(合法行为)
Jailbreak的优缺点
优点
-
打造个性化、与众不同的iPhone 自由安装各种实用的插件、主题、APP 修改系统APP的一些默认行为
-
自由安装非AppSore来源的APP “付费APP”秒变“免费APP” 未越狱iPhone安装APP的途径 AppStore 真机调试 通过证书打包签名ipa安装
-
灵活管理文件系统,让iPhone可以像U盘那样灵活
-
给开发者提供了逆向工程的环境
缺点
-
不予保修
-
费电,越狱后的iOS系统会常驻一些进程,耗电速度约提升10%~20%
-
在新的iOS固件版本出来的时候,不能及时地进行更新 每个新版本的固件,都会修复上一个版本的越狱漏洞,使越狱失效 如果需要保持越狱状态,要等待新的越狱程序发布时,才能升级相应的固件版本
不再受iOS系统默认的安全保护,容易被恶意软件攻击,个人隐私有被窃取的风险
- 如果安装了不稳定的插件,容易让系统变得不稳定、变慢,甚至出现“白苹果”等问题
完美Jailbreak和不完美Jailbreak
越狱方法推荐 PP助手:jailbreak.25pp.com/
-
完美越狱 越狱后的iPhone可以正常关机和重启
-
不完美越狱 iPhone一旦关机后再开机时,屏幕就会一直停留在启动画面,也就是“白苹果”状态 或者能正常开机,但已经安装的软件都无法正常使用,需要将设备与PC连接后,使用软件进行引导才能使用
一般说来,在苹果发布新的iOS固件后,针对该固件的不完美越狱会先发布,随后完美越狱才可能发布 一般较新的系统版本,均为不完美越狱
Cydia
可以在Cydia中安装各种第三方的软件(插件、补丁、APP)
需要安装
- Apple FileConduit“2”(它的作用是可以访问整个iOS设备的文件系统)
SSH
Mac 远程登录到iphone
为了能够让Mac终端中的命令行能作用在iPhone上,我们得让Mac和iPhone建立连接
用到的技术 SSH (OpenSSH是SSH协议的免费开源实现)
- Secure Shell的缩写,意为“安全外壳协议”,是一种可以为远程登录提供安全保障的协议
- OpenSSH 是SSH协议的免费开源实现 可以通过OpenSSH的方式让Mac远程登录到iPhone
具体步骤
-
SSH是通过TCP协议通信,所以要确保Mac和iPhone在同一局域网下,比如连接着同一个WiFi
-
在Mac的终端输入ssh 账户名@服务器主机地址比如ssh root@10.1.1.168(这里的服务器是手机)
初始密码alpine
-
登录成功后就可以使用终端命令行操作iPhone
-
退出登录命令是exit
root、mobile
-
iOS下有2个常用账户:root、mobile root:最高权限账户,
HOME是/var/mobile 登录mobile用户:root mobile@服务器主机地址 root和mobile用户的初始登录密码都是alpine
-
最好修改一下root和mobile用户的登录密码(登录root账户后,分别通过passwd、passwd mobile完成)
USB-SSH登录
端口就是设备对外提供服务的窗口,每个端口都有个端口号(范围是0~65535,共2^16个)
iPhone默认是使用22端口进行SSH通信,采用的是TCP协议
默认情况下,由于SSH走的是TCP协议,Mac是通过网络连接的方式SSH登录到iPhone,要求iPhone连接WiFi
为了加快传输速度,也可以通过USB连接的方式进行SSH登录
Mac上有个服务程序usbmuxd(它会开机自动启动),可以将Mac的数据通过USB传输到iPhone
usbmuxd的使用1
-
下载usbmuxd工具包(下载v1.0.8版本,主要用到里面的一个python脚本:tcprelay.py) 将iPhone的22端口(SSH端口)映射到Mac本地的10010端口
-
将iPhone的22端口(SSH端口)映射到Mac本地的10010端口
cd ~/Documents/usbmuxd-1.0.8/python-client
python tcprelay.py -t 22:10010 (加上-t参数是为了能够同时支持多个SSH连接)
注意:要想保持端口映射状态,不能终止此命令行(如果要执行其他终端命令行,请新开一个终端界面)
不一定非要10010端口,只要不是保留端口就行
USB的方式:iproxy
使用步骤
- 通过brew来安装usbmuxd
brew install usbmuxd
- 端口映射:把iPhone的22端口(即SSH端口)映射到mac的10010端口(未被占用的端口号即可)
iproxy 2222 22
- 连接Mac本地的10010端口
ssh -p 2222 root@手机IP
出现~ root# 就代表连接成功了,可以尝试用命令控制iPhone了.
cycipt
Cycript是Objective-C++、ES6(JavaScript)、Java等语法的混合物 可以用来探索、修改、调试正在运行的Mac\iOS APP 通过Cydia安装Cycript,即可在iPhone上调试运行中的APP
cycipt的简单使用
- 进入某个进程
cycript
cycript -p 进程ID
cycript -p 进程名称
-
取消输入 Ctrl + C
-
退出 Ctrl + D
-
清屏 Command + R
PS命令 (先下载查看进程状态的工具 adv-cmds)
- 查看所有的进程ps -A
- 搜索关键词
ps –A | grep 关键词
常用语法
-
UIApp [UIApplication sharedApplication]
-
定义变量 var 变量名 = 变量值
-
用内存地址获取对象(#内存地址)
-
ObjectiveC.classes 已加载的所有OC类
-
-
查看对象的所有成员变量(*对象)
-
打印View 的所有子控件
UIApp.keyWindow.rootViewController.view.recursiveDescription().toString()
-
使用如下指令筛选出某种类型的对象
#筛选出抖音中所有UIViewController类型的对象
choose(UIViewController)
#筛选出抖音中所有UITableViewCell类型的对象
choose(UITableViewCell)
Cycript工具库的使用
下载对应的工具库github.com/CoderMJLee/…
mjcript就是将一些常用的Cycript方法进行了封装,具体可参考源码
复制代码 找到其中的mjcript.cy文件,保存到本地目录,同时使用如下命令将mjcript.cy拷贝到iPhone的/usr/lib/cycript0.9目录下 (要显示usr目录要下载Apple FileConduit“2” 插件)
使用Cycript监听App,同时使用@import导入mjcript
#监听抖音App
cycript -p Aweme
#导入mjcript库
@import mjcript
使用里面的方法
//获取App的bundleId
MJAppId
//获取App可执行文件路径
MJAppPath
//获取keyWindow
MJKeyWin()
//获取根控制器
MJRootVc()
//找到显示在最前面的控制器
MJFrontVc()
//递归打印UIViewController view的层级结构
MJVcSubviews(MJFrontVc())
//打印所有的对象方法,需要传入参数,以抖音App首页为例
MJInstanceMethods(MJFrontVc()) 或者
MJInstanceMethods(#0x15f2d3600)
//打印所有对象方法的名字
MJInstanceMethodNames(MJFrontVc())
//打印所有的类方法
MJClassMethods(MJFrontVc())
//打印所有的类方法名字
MJClassMethodNames(MJFrontVc())
//打印所有的成员变量
MJIvars(MJFrontVc())
//打印所有的成员变量名字
MJIvarNames(MJFrontVc())
//由于Cycript不支持OC中的CGRectMake等函数的使用,所以mjcript提供了CG函数的封装
MJPointMake(x,y)
MJSizeMake(w,h)
MJRectMake(x,y,w,h)
微信改金额
找到金额所在的Label
cycript -p WeChat
@import mjcript
MJSubviews(MJFrontVc().view)
目前微信钱包中的数字是一个个Label拼成的,数字要一个个改
根据当前钱包页面显示的余额找到对应的UILabel(找到对应的内存地址即可)
var moneyLabel = #0x12e7b35e0
拿到了目标Label,就可以为所欲为了
moneyLabel.text = "¥9"
字符串查找
由于在终端打印出来的UILabel里面显示的中文都是经过Unicode编码的,所以如果我们需要根据当前页面上的中文字符找到其所对应的编码后的字符,可以借助Python来进行中文和编码后的转换
或者放在在线转码中转义一下。
UI调试神器-Reveal
-
下载Reveal 下载地址
-
在手机的Cydia 使用Reveal2Loader
-
重启手机,或者利用OpenSSH在电脑终端执行killall SpringBoard 重启桌面.
-
可以在手机设置中查看到Reveal,然后选中Reveal->Enabled Applications,打开想要查看的应用开关,然后退出.
-
打开想要查看的app,即可查看对应的层级结构。
小结
电脑连接到手机
-
手机越狱(uncOVer)
-
mac登录到 手机 (SSH) 2.1 同一无线网远程登录
-
ssh root@10.253.117.221 后面是手机的ip地址(需要和电脑在同一个网路下)
-
ssh 免密码连接到手机 ssh root@192.168.0.103
2.2 usb连接
-
usbmuxd 里面的python 文件建立连接。
-
通过brew来安装usbmuxd
-
执行命令(iproxy 2222 22)(此进程不要关闭)
-
通过usb连接到手机 (ssh root@127.0.0.1 -p 2222),127.0.0.1是虚拟网卡的地址 其实ssh root@localhost -p 2222 也行,但是未实验成功。
- mac 连接到手机中的app (Cycript)
- 通过ps 命令找到进程的名字 (在root#中查看命令而不是进入cycript 环境中)
- 通过 Cycript 命令 进入到程序进程中(注意App必须在启动时才能进行调试)
电脑连到手机快速操作
- iproxy 2222 22 (不要关闭)(可以编成sh脚本执行 sh usb.sh)
- ssh root@127.0.0.1 -p 2222 (sh login.sh )
- ps -A | grep 关键字
- cycript -p 进程名称
操作手机中的app (Cycript)
下载对应的工具库
找到其中的mjcript.cy文件,保存到本地目录,同时使用如下命令将mjcript.cy拷贝到iPhone的/usr/lib/cycript0.9目录