技 术 文 章 / 超 人
App Store上的应用都使用了FairPlay DRM数字版权加密保护技术
FairPlay保护的文件是具有加密容器文件。使用AES 算法进行加密。解密所需的主密钥也以加密形式存储在容器文件中。解密主密钥所需的密钥称为“用户密钥”。当用户使用iTunes、App Store登陆新设备时,该设备向Apple服务器请求授权,从而获得用户密钥。在试图使用容器文件时,存储在文件中的主密钥随后与用户密钥匹配,并且如果成功则允许使用。例1,有些买断性游戏,当你在iPhone X设备用A账号购买了一个游戏后,想在IPad上也可以玩,只需要在IPad上登陆你购买这款游戏的A账号即可,登陆后就能获取该账号的用户密钥,也能直接从App Store直接下载已买断的游戏。下载完后更换登陆的App Store账号,你会发现依然可以玩A账号买的游戏。因为A账号的用户密钥已经存在本地了。(这是本人的分析理解,具体是这样的可能只有苹果自己知道)
从AppStore下载的应用我们在使用IDA进行分析之前,需要对.ipa进行破壳解密,使用Clutch,其原理就是在应用运行时把内存数据按照一定格式导出,实质就是去除数字验证的过程。
PS.大家可以看看苹果的官方安全保护文档,这样有利于对苹果对逆向分析
本文主要分三部分:
1.Clutch破壳
2.class-dump+ cycript + dumpdecrypted 破壳
3.IDA静态解析
4.cycript动态输入代码
首先使用Clutch破壳
-
步骤1 下载Clutch
他的下载中有几种,一个是可执行文件,一个是工程需要编译获得可执行文件(不知道为什么2.0.4的工程编译出来没有build.sh。我是拿可执行文件直接用的)
-
步骤2 下载Mac版本的PP助手,用已经越狱的设备连接Mac电脑,然后打开PP助手 --> 工具 --> 文件管理 --> 系统文件(系统) --> usr --> bin 。把步骤1的可执行文件放入bin目录下
-
步骤3 打开越狱设备的Cydia工具,下载Open SSH
-
步骤4 让越狱的手机与Mac电脑连接在同一个WiFi中(可以Mac开WiFi共享给手机),获取手机连接WiFi的IP
-
步骤5 打开电脑的终端
1.输入ssh root@192.168.2.10
这里的IP地址填入步骤4所记录下来的手机IP(如果连接不上,请确认设备已经安装好了Open SSH,并且设备的WiFi与Mac是同一个)
2.输入完后会要求输入密码 这个值正常情况下都是默认为alpine
,如果不是请删除OpenSSH重新安装
3.密码输入正确后,就会发现终端的前缀已经变成我们的手机设备命了,cd到我们把Clutch可执行文件放在手机的位置cd /usr/bin
4.给Clutch加权限防止执行事权限不够chmod a+x Clutch
5.查看设备当前已安装的应用Clutch -i
,我的手机远远不止安装这些软件,但是显示出来的却只有这些,具体原因不是非常清楚,有可能是安装的自己打包的ipa的原因。
-
步骤6 在终端中输入
Clutch -d 1
,这里输入的数字id是我们步骤5中使用Clutch -i
打印出来的应用前面的数字id,如果你要破壳其他应用,请选择对应应用的id。等几十秒就会把破解的包导出来
然后用PP助手就可以在相应路径里找到对应ipa包。
注意:经过本人多次测试,发现Clutch砸壳一直失败,报的entitlements错误。似乎只有系统自带的某些app能砸壳成功。使用Clutch方案我已经放弃了。这里依然保存这不部分的内容,留给懂的大神看看也许是我哪里没有做对
砸壳方案二:class-dump+ cycript + dumpdecrypted
该方法本人已经多次测试,确认能成功砸壳
在砸壳前需要安装class-dump和dumpdecrypted,cycript
这个工具可以在越狱设备的cydia中下载
-
首先下载安装class-dump。这是一个放在电脑里的工具
1.官网下载
2.双击下载好的class-dump-3.5.dmg,并复制其中的
3.在Finder中选择前往
-->前往文件夹
输入/usr/local/sbin/
进入该目录,把2中复制的class-dump放进该目录(复制进去时需要输入电脑密码或者指纹)
4.打开终端 输入sudo chmod 777 /usr/local/sbin/class-dump
给class-dump文件赋予执行权利 -
接着在手机中安装cycript,打开越狱设备的cydia,在搜索中搜素cycript,点击更改,然后安装
-
接着下载安装dumpdecrypted,这是一个放在手机中的工具
1.下载好后,双击解压
2.打开终端 cd到解压到目录下,输入make
,这样程序就会自动运行编译出dumpdecrypted.dylib
和dumpdecrypted.o
3.一会儿会用到dumpdecrypted.dylib文件 最后我们开始砸壳
步骤1.首先,在终端中用ssh连接你越狱设备(ssh是什么,请看看上面说Clutch的内容,有详细说明)
步骤2.接着我们查找当前设备的运行进程(可以删除设备里其他应用,只留自己要砸壳的应用运行。)在连接好ssh的终端中输入
ps -e
,ps.必须把你的终端放大,不然你看不完整进程的应用路径信息,就无法找到对应的app。
步骤3.找到自己想要砸壳的应用后,记录下进程id和应用路径
步骤4:在终端中输入cycript -p 1736
进入该进程,这里的1736是你步骤3中记录的砸壳应用的进程id。等待直到终端输入中出现cy# 后,输入[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
打印出当前进程应用的沙盒路径,记录下打印出的沙盒路径
ps.必须让越狱设备当前运行界面为该砸壳应用,否则不会出现
cy#
步骤5:保存沙盒路径和应用路径
步骤6.输入exit
退出 ssh连接回到电脑,然后使用终端把刚刚下载好的dumpdecrypted.dylib
文件放入步骤3中记录的应用沙盒路径(是沙盒路径不是应用路径,沙盒路径有Documents)
例如:
//在终端中输入下面代码,记住scp 后的第一部分是你放在电脑中的dumpdecrypted.dylib的路径 第二部分是步骤5记录的应用沙盒地址,请替换成自己的
scp /Users/xieyujia/Desktop/ios/逆向工程/dumpdecrypted-master/dumpdecrypted.dylib root@192.168.2.10:/var/mobile/Containers/Data/Application/0EA4E809-E663-4E7B-AB91-2B7CFA2B0AB3/Documents/
步骤7:把dumpdecrypted.dylib文件放入沙盒路径后,重新连接ssh,并cd 到需要砸壳应用路径,输入
//后面的路径是应用路径 而不是沙盒路径
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/B8416315-EF7E-4464-8F7F-4C1B92CBF1AF/WeChat.app/WeChat
等待执行完成后,会在应用沙盒路径的Documents下生成一个.decrypted文件,这个就是破解后的可执行文件。利用pp助手,根据沙盒路径在pp助手中找到对应的Documents路径下的.decrypted文件。把它导出到电脑中。
步骤8:利用class-dump破解里面的代码,在终端中输入
//第一个路径是.decrypted文件的路径,第二个路径是导出.h文件的路径
class-dump -H /Users/xieyujia/Desktop/ios/逆向工程/WeChat.decrypted -o /Users/xieyujia/Desktop/ios/逆向工程/head
ps.如果你自己编译的工程,没有上传到AppStore 那么就没有加密,所以可以不需要砸壳,可以把步骤8中的.decrypted文件的路径改为你.app的路径。一样可以导出.h内容
ps.这里说明下,解析出来的.h为该应用的所有.h文件,但.h文件中包含的内容并不只有原本工程的.h内容,比如你在原工程一个类的.h中只声明公开了一个 add方法,而在.m中除了add方法的实现还有remove,push方法,那么解析出来的.h中也会包含有.m中声明的方法(包括.m中的属性变量),只是没有包含具体实现。还有,解析出来.h中不包含你在原代码中注释的内容。所以不用担心你在.h.m中写的注释被别人解析出来
ps2.比如工程中接入了第三方的静态库.framework。那么解析也会把第三方库中的.h也解析出来
IDA工具静态分析源码
- 下载完成后会有几个文件,我们只需要解压
x64_idapronm_hexarm64m_hexarmm_hexx64m_hexx86m_170914_e723c5648dc3f2f588ab8339ccf62ec0.zip
文件就可以得到IDA工具使用
- 下载完成后会有几个文件,我们只需要解压
-
3.双击解压出来的工具安装即可,安装完成后会有2个版本,我一直都用的64位版本
- 4.选择一个版本运行,然后点击new,选择自己要分析的应用(上面我们破解出来的
.decrypted
文件,.app
文件,.ipa
文件都可以选择)。然后一直点下一步OK即可,
-
点击F5 即可进入解析出来的源码界面(这个功能是付费功能,很多版本里都没有这个功能,我提供都版本里有这个功能,免费的)
-
点击F5 即可进入解析出来的源码界面(这个功能是付费功能,很多版本里都没有这个功能,我提供都版本里有这个功能,免费的)
从这里基本就可以看出该方法源码的内容。