在教程开始前,简单说下为什么要砸壳,砸壳后我们能做什么。
在 App Store 看到感兴趣的 APP ,我们会希望了解它是如何实现的,可以从技术角度进行源码剖析。比如研究该 APP 的优点、游戏是什么引擎开发的、编码风格如何、用到了哪些三方库等等。但从 App Store 获取的应用都是经过加壳保护的,要想着手进行分析,必须先跨过第一道门槛:砸壳。
所以说,砸壳是对 APP 脱壳的逆向操作。为了深入解析想了解的 APP ,让我们开始砸壳之旅吧。
一、第一步,为手机越狱
2、连接苹果手机,确保手机被识别后点击开始按钮
3、根据checkra1n的指示开始操作,越狱成功后,可以在手机上看到checkra1n的App(在越狱完成之前,不要断开手机与MAC的连接)
4、打开checkra1n,安装cydia
二、配置手机环境
在cydia中搜索并安装OpenSSH、Cycript,在cydia中搜索添加frida源(https://build.frida.re),并安装Frida插件,用于后续的砸壳(frida要根据手机系统选对应的版本)
四、关键操作,对APP砸壳
网上可以砸壳的库有好几个,下面介绍dumpdecrypted、frida这两个库
方法 | 优点 | 缺点 |
dumpdecrypted | 环境配置简单 | 操作步骤较多,生成 .decrypted文件,需手动替换 |
frida | 一键砸壳,生成ipa包 | 1、环境配置复杂 2、砸壳过程如果中断,需从头开始 |
【dumpdecrypted】方式介绍
下载地址:https://github.com/stefanesser/dumpdecrypted
(ps:源代码只脱壳包的可执行的文件,没有砸framework中的库,可参考这个版本修改代码https://github.com/AloneMonkey/dumpdecrypted.git)
1、生成dumpdecrypted.dylib并签名
(注意:生成的dylib要匹配手机的系统版本,否则会砸壳失败。 直接在终端make,会根据电脑上的xcode版本生成对应版本的dylib;若是要生成其他版本,可以用源代码新建动态库,自定义最低版本。)
1.1打开终端,进?dumpdecrypted目录,输入make,生成dumpdecrypted.dylib
1.2 获取电脑上的签名证书,对dumpdecrypted.dylib进?签名
securityfind-identity -v -p codesigning
codesign--force --verify --verbose --sign "iPhone Developer: xxxxxxx" dumpdecrypted.dylib
2、找到应用砸壳并保存到本地(步骤中需要输入密码地方,默认密码是alpine)
2.1连接iPhone(ip为手机链接的网络的ip)
ssh root@
2.2 iPhone启动“待砸壳应?用”,最大化终端窗?口,打印iPhone当前所有进程
ps -e
2.3找到“待砸壳应?”所在进程(自己安装的App路径一般以/var/开头)
以下图为例,可以看到,进程编号: 7219,应?路径为/var/containers/Bundle/Application/6F77740B-4DD3-4508-8F54-0F407B47EC8D/Strategy click ejection.app/Strategy click ejection
2.4根据进程编号找到应?沙盒路路径(快捷键"control+D"退出cycript)
cycript-p7219 #执?行行之后命令?行行会以cy#开头
cy# [[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
找到沙盒路径: /var/mobile/Containers/Data/Application/64DA79D7-D0F3-4F67-B15D-328EE91EE64C/Documents/
2.5新建终端窗?,将dumpdecrypted.dylib拷?至应?沙盒中
scpdumpdecrypted.dylib root@
2.6回到链接iPhone的终端,查看应?沙盒中是否存在dumpdecrypted.dylib文件
2.7使?dumpdecrypted.dylib动态库对应用进行破壳(若应用路径中有空格,需用双引号,否则会失败),破壳成功后,会在应?沙盒?目?生成.decrypted文件
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/6F77740B-4DD3-4508-8F54-0F407B47EC8D/"Strategy click ejection".app/"Strategy click ejection"
2.8拷?沙盒文件和应?文件?本地 (需新开一个窗口)
scp-r root@
scp-r root@
2.9拿到了ipa和已砸壳的xxx.decrypted文件,需手动替换掉ipa中Mach-O文件,生成新的ipa包
otool-l
【frida-ios-dump】方式介绍
下载地址:https://github.com/AloneMonkey/frida-ios-dump
1、电脑安装frida环境(安装的版本要和手机的对应)、安装frida-ios-dump所需的依赖
pip3instanll frida
sudopip3 install -r requirements.txt --upgrade
1.1根据手机连接的网络修改dump.py中的host和port
2、找到应用砸壳
2.1 显示手机上的应用
python3dump.py-l
2.2用应用的名字或者包名砸壳
python3dump.py[app name]/[app bundle]
四、Dump二进制文件
使?用class-dump提取破壳应?用Mach-O文件中存储的头文件信息。
1、安装class-dump,赋予class-dump执?权限
sudo chmod777 class-dump
2、提取头文件信息
class-dump -H
五、常见问题与解决方法
1、连接手机时报错
原因:known_hosts是记录远程主机的公钥的文件,之前重装个系统,而保存的公钥还是之前系统的系统公钥,在ssh链接的时候首先会验证公钥,如果公钥不对,那么就会报错
解决:使用shh-keygen 命令把对应的ip公钥信息清除
ssh-keygen-R
2、dumpdecrypted砸壳时报错Abort trap: 6
原因:dumpdecrypted.dylib版本跟手机系统版本不匹配
解决:用dumpdecrypted源码新建动态库,自定义最低版本
3、安装frida依赖报错
解决:在pip命令中加入–use-feature=2020-resolver参数就可以了, 比如
pip3install xxx --use-feature=2020-resolver
4、frida执行dump.py报错
(1)报错1
needgadget to attach; its default location is: .cache/frida/gadget-ios.dylib
解决:下载对应版本的dylib放到缓存位置(https://github.com/frida/frida/releases/)
mkdir -p ~/.cache/frida
cp <下载的dylib> ~/.cache/frida/gadget-ios.dylib
(2)报错2
File"/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/frida/core.py", line 383, in _on_message
callback(message,data)
File"dump.py", line 119, in on_message
scp.get(scp_from,scp_to)
......
解决:修改dump.py脚本
- #!/usr/bin/env python
+ #!/usr/bin/env python3
#-*- coding: utf-8 -*-
(3)报错3
1、failedtogetthetaskforprocess <进程编号>
2、unabletoattachtothespecifiedprocess
原因:cydia没有安装frida或者安装的版本和手机版本不匹配