十、iOS逆向之《越狱砸壳/ipa脱壳》
砸壳原理
砸壳顾名思义就是对软件进行逆向操作,对已加密的软件进行解密,从而获取真实软件源码。
App Store下载的包全都是经过苹果加密过的包。苹果不允许开发者自己加密ipa包,加密后的ipa包,我们是无法对其进行反编译的。也无法class-dump,需要对其进行解密才能反编译。
砸壳的两种方式
一、静态砸壳
使用已知的解密方法对软件进行解密叫静态砸壳,静态砸壳难度大,需要知道其软件的加密算法才能对其解密。
二、动态砸壳
从进程的内存空间中获取软件镜像(image)进行转存处理叫动态砸壳,动态砸壳无需关心软件的加密技术,只需要从内存中获取即可,这种方法相对简单。
为什么可以通过这种方式进行砸壳呢?
任何软件的加密方式都需要系统内核能读懂,系统内核不认识也就无法运行。系统内核能对其运行,也就对其解密了,解密后镜像会保存在内存中,我们就是通过这种方式对其进行获取的。
iOS动态砸壳系统内核流程
砸壳工具介绍
1、clutch
Clutch是由KJCracks开发的一款开源砸壳工具。工具支持iPhone、iPod Touch、iPad,该工具需要使用iOS8.0以上的越狱手机应用。
Clutch 是一个可执行文件,固不能直接clone代码来使用。我们可以在(release)页面下载最新的可执行文件来使用。
Clutch是一个在手机执行的软件,我们要将其拷贝到手机(已越狱)。
- 连接手机
# ssh root@手机IP
$ssh root@192.168.0.1
- 拷贝文件到手机
# scp 被拷贝文件名 root@机IP:可执行文件地址;
# 手机中的这个目录地址(/usr/bin)的文件,是在任何地方都可以执行的目录文件。
$scp Clutch-2.0.4 root@192.168.0.1:/usr/bin
- 列出可以砸壳的列表
# 列出可以砸壳的列表(列表中都是正在运行的APP)
$Clutch -i
- 砸壳
# Clutch –d 应用ID
$ Clutch -d 4
- 完成后会打印文件保存路径
# com.gotokeep.keep-iOS9.0-(Clutch-2.0.4)-2.ipa 是导出的包名
DONE: /private/var/mobile/Documents/Dumped/com.gotokeep.keep-iOS9.0-(Clutch-2.0.4)-2.ipa
Fnished dumping com.gotokeep.keep in 40.1 seconds
- 通过ifunbox打开手机上面路径,将包拷贝到电脑
- 验证是否砸壳成功(检查包内的MachO文件)
# Keep是MachO文件
$ otool -l Keep | grep crypt
2、dumpdecrypted
Github开源工具, dumpdecrypted这个工具就是通过建立一个名为dumpdecrypted.dylib的动态库,插入目标应用实现脱壳。
- Git Clone
# clone
$git clone https://github.com/stefanesser/dumpdecrypted.git
- Make 编译生成动态库
# 在文件的目录下执行make
$make
- 远程拷贝到手机
#拷贝到手机跟目录下
# scp 拷贝
# dumpdecrypted.dylib 动态库
# root 手机root账号
# 192.168.0.1 手机IP地址
# ~/ 手机根目录
$scp dumpdecrypted.dylib root@192.168.0.1:~/
- 连接手机
# ssh root@手机IP
$ssh root@192.168.0.1
- 查看需要砸壳的app列表路径
# 查看需要砸壳的app列表路径
$ps -A
- 砸壳:通过DYLD_INSERT_LIBRARIES 环境变量插入动态库执行
$DYLD_INSET_LIBRARIES=路径
- 完成后会生成
应用名.decrypted
文件,dumpdecrypted只给我们导出了Mach-O文件,没有同时把资源导出来,也没有打包成ipa,所以它的速度更快一些。 - 找到在手机跟目录的
应用名.decrypted
通过ifunbox拷贝到电脑 - 验证是否砸壳成功
# Keep是MachO文件
$ otool -l `应用名.decrypted` | grep crypt
3、frida-ios-dump
该工具基于frida提供的强大功能通过注入js实现内存dump然后通过python自动拷贝到电脑生成ipa文件。
安装Mac端frida
- 查看python版本,Mac都是自带的
$python -V
Python 2.7.10
- 查看pip版本,没有则安装
# 安装pip
$sudo easy_install pip
- 安装frida
# 安装frida
$sudo pip install frida-tools
- 安装frida出现的问题
问题1:
chian$ sudo pip uninstall prompt-toolkit
The directory '/Users/chian/Library/Caches/pip/http' or its parent directory
is not owned by the current user and the cache has been disabled.
Please check the permissions and owner of that directory.
If executing pip with sudo, you may want sudo's -H flag.
frida安装问题
解决办法:
$sudo-H pip install frida-tools
问题2:Uninstalling a distutils installed project (six)
解决办法:
$sudo pip install frida –upgrade –ignore-installed six
配置frida-ios-dump环境
- clone iOS-dump
$sudo git clone https://github.com/AloneMonkey/frida-ios-dump
- 进入目录安装即可
$sudo pip install -r frida-ios-dump/requirements.txt –upgrade
- 安装出现的问题:
问题1:
$frida-tools 1.2.2 has requirement prompt-toolkit<2.0.0,>=0.57, but you'll have prompt-toolkit 2.0.7 which is incompatible
解决办法:降低 prompt-toolkit 版本
# 卸载
$sudo pip uninstall prompt-toolkit
# 安装指定版本
$sudo pip install prompt-toolkit==1.0.6
越狱手机iOS端安装frida
- 启动 Cydia
- 添加软件源 软件源 Sources -> 编辑 Edit(左上角)-> 添加 Add(右上角)-> 输入 https://build.frida.re/
- 根据设备的32位或64位cpu构架安装对应的frida。
- 连接手机(连接教程)输入列出可砸壳应用命令检查是否可以使用
frida-ps -U
- 修改dump.py参数
$vim /opt/dump/frida-ios-dump/dump.py
#用户名
User = 'root'
# 密码
Password = 'alpine'
# 手机IP地址或者映射地址
Host = 'localhost'
# 端口号,端口号在设置USB连接时修改了
Port = 2222
- 设置别名
打开.bash_profile
$vim ~/.bash_profile
在末尾加上一条
# 注意:/opt/dump 是文件目录路径,可以按需更改。
alias dump.py="/opt/dump/frida-ios-dump/dump.py"
使别名生效
source ~/.bash_profile
通过frida砸壳
- 打开终端映射端口
# 映射端口
$iproxy 12345 22
- 新建终端窗口连接手机
# 127.0.0.1 是IP地址
# -p 表示端口号
$ssh -p 12345 root@127.0.0.1
- 砸壳
# 列出可砸到应用列表
$frida-ps -U
# 砸其中的QQ
$dump.py QQ
砸壳成功后会在frida-ios-dump
目录下生成砸壳后的ipa包。
- 完成砸壳验证是否砸壳成功
# Keep是MachO文件
$ otool -l `应用名.decrypted` | grep crypt
手动砸壳
请跳转查看手动砸壳