913015d57b851af13116614fdcf8c9f6
安全攻与防篇:砸壳

1.砸壳概述

加壳

我们知道,iOS 应用开发完成之后,会上传 Store,经过 Store 分发给用户。在开发完成上传到 Store 的时候,Apple 会对我们的应用进行加密和审核,以确保用户使用的 App 是安全的。经过 Apple 加密处理之后的 App,逆向工程师无法使用 IDA(或 Hopper)解析,也无法使用 class-dump 来导出头文件。这里我使用越狱设备,从 Store 上下载了微信 App(也可以通过爱思助手去下载正版应用 App 包),将 app 文件拷贝到电脑(越狱设备可以在这个目录下找到对应的 app 文件:【/var/containers/Bundle/Application】)。然后使用 class-dump 导出头文件:

App > class-dump -H WeChat -o /Users/GofLee/Desktop/GofHeaders

可以看到导出的头文件只有一个:【CDStructures.h】。通过下面的指令,来查看可执行文件的加密信息:

从结果可以看到:【cryptid】的值为 1,表示该 App 是加密的。

运行原理

从【Store】下载到移动设备的 App,在磁盘中是加密的状态。运行的时候,由于 CPU 不会识别加密文件,因此在 App 启动前,需要在内核中对应用进行解密,提取可执行文件放入内存中运行。如下图所示:

砸壳方式

逆向分析前,需要对加密的二进制文件进行解密才可以做静态分析,解密过程也就是今天要讲的:砸壳。砸壳主要有两种方式:

  • 静态砸壳:在已经掌握和了解加密应用的加密算法和逻辑后,不运行加密应用程序的前提下,将壳应用程序进行解密处理。这种方式砸壳难度大,并且加密方发现应用被破解后,很可能会改用更高级的复杂加密算法,来提高安全性。
  • 动态砸壳:在程序加载到内存中,从可执行程序的镜像入手,将内存中的内容进行转储处理来实现砸壳。该方法相对简单,并且不用关心应用所使用的加密技术。

2.静态砸壳(使用 Clutch )

2.1 准备工作

2.2 Clutch 配置和说明

在砸壳之前,我们通过 OpenSSH,使用下面的指令,将 Clutch 拷贝到移动设备的这个目录(这个目录下的在其他任意目录下都可以执行):/usr/bin/

scp -P 2222 /Users/GofLee/Desktop/Clutch root@127.0.0.1:/usr/bin

当然也可以通过 iMazing,拷贝文件到移动设备。

文件拷贝到移动设备之后,直接运行【Clutch】,如果提示没有权限,如下所示:

root# Clutch
-sh: /usr/bin/Clutch: Permission denied

这时候使用下面的指令赋权即可:

LeeGof-5C:/usr/bin root# chmod +x Clutch
LeeGof-5C:/usr/bin root# Clutch
Usage: Clutch [OPTIONS]
-b --binary-dump <value> Only dump binary files from specified bundleID
-d --dump <value>        Dump specified bundleID into .ipa file
-i --print-installed     Print installed applications
   --clean               Clean /var/tmp/clutch directory
   --version             Display version and exit
-? --help                Display this help and exit
-n --no-color            Print with colors disabled

赋权之后,再执行【Clutch】,可以看到 Clutch 的命令选项。其中核心的主要是下面三个:

  • -b:表示产出一个二进制文件;
  • -d:表示产出一个 ipa 文件;
  • -i:表示列出手机上面已经安装的 App。

这里我们可以先来查看一下设备上已经安装的没有砸壳的 App(系统应用没有加壳):

LeeGof-5C:/usr/bin root# Clutch -i
Installed apps:
1:   QQ音乐 - 让生活充满音乐 <com.tencent.QQMusic>
2:   爱思加强版 <com.pd.A4Player>
3:   微信 <com.tencent.xin>

App 名称前面的数字,表示对应 App 的 id,-b 和 -d 选项可以根据对应 id 来进行砸壳。

2.3 砸壳

我们可以使用下面的指令来砸壳,这里以微信为例:

LeeGof-5C:/usr/bin root# Clutch -d 3

指令执行会有一些输出,最后两行会显示砸壳之后文件的保存路径以及砸壳花费的时间:

DONE: /private/var/mobile/Documents/Dumped/com.tencent.xin-iOS9.0-(Clutch-2.0.4).ipa
Finished dumping com.tencent.xin in 47.7 seconds

【/private/var】和 最外层的【/var】目录是同一个。

我们使用【iMazing】,将刚才砸壳输出的文件,拷贝到电脑,然后拿到 Mach-O 文件,使用下面的指令查看加密信息:
```
~/Desktop > otool -l WeChat | grep crypt
cryptoff 16384
cryptsize 58556416

top Created with Sketch.