iOS砸壳

一、iOS砸壳思路

APP上架会经历 APP->AppStore->源码 加密过程。

应用加密:开发者向AppStore提交应用,都将由苹果官方进行加密处理,以确保用户使用的APP都是经过审核过的,加密后的APP,开发人员无法通过Hopper等反编译应用,也无法使用class-dump

应用加密:开发者向AppStore提交应用,都将由苹果官方进行加密处理,以确保用户使用的APP都是经过审核过的,加密后的APP,开发人员无法通过Hopper等反编译应用,也无法使用class-dump

应用运行:应用在磁盘中是加密状态,由于CPU运行不会识别加密文件,因此在启动应用前需要在内核中对加密应用文件进行解密,提取可执行文件才可放入内存中运行。流程如下:

ios_run.png

逆向需要对加密的二进制文件进行解密才可以做静态分析,解密过程即为砸壳。砸壳有两种:

1、静态砸壳 在已经掌握和了解加密应用的加密算法和逻辑后在不运行加密应用程序的前提下将壳应用程序进行解密处理,静态砸壳方法难度大,并且加密方发现应用被破解后就可能会改用更高级的复杂加密算法。

2、动态砸壳 在运行进程内存中的可执行程序映像入手,将内存中的内容进行转储处理来实现砸壳。该方法相对简单,并且不用关心应用所使用的加密技术。

砸壳工具有很多,下面只介绍使用frida-ios-dump工具砸壳的配置流程。

二、frida配置与使用

原理:通过注入js实现内存dump,再由Python自动拷贝到电脑生成ipa包。

下载:frida-ios-dump

创建dump文件夹,移动到opt/dump目录下,修改dump.py中的user、password、host、port如下:

1
2
3
4
User = 'root'
Password = 'alpine'
Host = 'localhost'
Port = 2222

三、越狱手机配置

1、打开cydia添加源:http://build.frida.re 并在搜索中下载安装frida

2、安装完成后在Mac端执行frida-ps -U查看是否可以工作。

四、Mac配置

1、安装Python

1
brew install python

2、安装wget

1
brew install wget

3、安装pip:

1
2
wget https://bootstrap.pypa.io/get-pip.py
sudo python get-pip.py

4、安装frida

1
sudo pip install frida –upgrade –ignore-installed six

5、安装脚本依赖环境

1
sudo pip install -r requirements.txt --upgrade

6、安装usbmuxd与手机通信

1
brew install usbmuxd

7、设置别名,设置后可以在任意路径下使用别名执行

1
vim ~/.bash_profile

在尾部添加如下:

1
alias dump.py="/opt/dump/frida-ios-dump-master/dump.py"

执行代码使生效

1
source ~/.bash_profile

8、通过USB使用ssh连接设备,将22映射到电脑上的2222端口

1
iproxy 2222 22

9、另开终端加入连接 密码为设备的登录密码alpine,需要保持连接

1
2
ssh -p 2222 root@127.0.0.1
或 ssh root@127.0.0.1 -p 2222

10、再开终端开始砸壳微信,命令如下:
dump.py微信
脚本会将破壳后的ipa包获取到当前路径,在哪个路径执行将会获取到哪个路径。
端口映射:

iproxy.png

连接设备:

connect.png

开始砸壳:

getipa.png

五、开发中遇到的问题

1、报错信息

1
Caught exception: <class 'paramiko.ssh_exception.SSHException'>: Error reading SSH protocol banner[Errno 54] Connection reset by peer

打开微信或重新插入USB接口,在执行以上命令即可。

2、报错信息

1
ERROR: frida-tools 7.2.0 has requirement prompt-toolkit<4.0.0,>=3.0.3, but you'll have prompt-toolkit 2.0.10 which is incompatible

解决:

1
2
3
cd /opt/dump/frida-ios-dump
sudo pip uninstall prompt-toolkit
sudo pip install prompt-toolkit==1.0.6, //重新安装其他版本

再执行

1
2
sudo pip install -r requirements.txt --ignore-installed six
frida-ps -U

修改完成。

3、dump.py 微信 执行报错

1
need gadget to attach; its default location is: /Users/hibo/.cache/frida/gadget-ios.dylib

解决:
在越狱手机Cydia应用中选择相应的Frida安装包,如:iPhone6s(11.4.1)选择Frida for pre-A12 devices

4、iproxy 2222 22 执行报错

1
2
3
dyld: Library not loaded: /usr/local/opt/libplist/lib/libplist.3.dylib
Referenced from: /usr/local/bin/iproxy
Reason: image not found

注意更新插:

执行:brew install usbmuxd

提示:libusbmuxd 2.0.1 is already installed To upgrade to 2.0.2, run brew upgrade libusbmuxd

执行:brew upgrade libusbmuxd即可解决

5、缺少库

如:ModuleNotFoundError: No module named 'paramiko'ModuleNotFoundError: No module named 'scp'

解决:
重新安装:pip install paramiko pip install scp,缺少什么安装即可

6、TypeError: can’t concat str to bytes

不能将字节类型值赋值给str类型的变量,需要将字节逆编码后再赋值。

解决: /opt/dump/frida-ios-dump-master/dump.py文件中将if IS_PY2修改为if IS_PY2 or isinstance(baseName, bytes),判断baseName是否为字节类型(进行逆编码)

1
2
3
4
5
6
7
8
9
10
11
def progress(filename, size, sent):
baseName = os.path.basename(filename)
# 修改处
# if IS_PY2:
if IS_PY2 or isinstance(baseName, bytes):
t.desc = baseName.decode("utf-8")
else:
t.desc = baseName
t.total = size
t.update(sent - last_sent[0])
last_sent[0] = 0 if size == sent else sent

7、unable to attach to the specified process

手机iPhone6s14.4dump报错如下:

1
2
3
desktop dump.py 微信
Start the target app 微信
unable to attach to the specified process

解决:
打开Cydia应用,搜索Frida选择Frida for 32-bit devices安装后,重新dump即可。