iOS 知识点NXiOS 进阶

iOS-砸壳+IDA分析

2018-03-09  本文已影响353人  树下敲代码的超人

技 术 文 章 / 超 人


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破壳

下载OpenSSH 下载完成后确认Open SSH已经下载好了 查看该WiFi的IP记录下来

然后用PP助手就可以在相应路径里找到对应ipa包。

注意:经过本人多次测试,发现Clutch砸壳一直失败,报的entitlements错误。似乎只有系统自带的某些app能砸壳成功。使用Clutch方案我已经放弃了。这里依然保存这不部分的内容,留给懂的大神看看也许是我哪里没有做对


砸壳方案二:class-dump+ cycript + dumpdecrypted

该方法本人已经多次测试,确认能成功砸壳
在砸壳前需要安装class-dumpdumpdecryptedcycript这个工具可以在越狱设备的cydia中下载

步骤1.首先,在终端中用ssh连接你越狱设备(ssh是什么,请看看上面说Clutch的内容,有详细说明)

ssh连接
步骤2.接着我们查找当前设备的运行进程(可以删除设备里其他应用,只留自己要砸壳的应用运行。)在连接好ssh的终端中输入ps -e
进程id

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/
把dumpdecrypted.dylib文件放入沙盒路径

步骤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文件。把它导出到电脑中。


.decrypted

步骤8:利用class-dump破解里面的代码,在终端中输入

//第一个路径是.decrypted文件的路径,第二个路径是导出.h文件的路径
class-dump -H /Users/xieyujia/Desktop/ios/逆向工程/WeChat.decrypted -o /Users/xieyujia/Desktop/ios/逆向工程/head
image.png

ps.如果你自己编译的工程,没有上传到AppStore 那么就没有加密,所以可以不需要砸壳,可以把步骤8中的.decrypted文件的路径改为你.app的路径。一样可以导出.h内容


这就是破壳出来的程序中的.h文件

ps.这里说明下,解析出来的.h为该应用的所有.h文件,但.h文件中包含的内容并不只有原本工程的.h内容,比如你在原工程一个类的.h中只声明公开了一个 add方法,而在.m中除了add方法的实现还有remove,push方法,那么解析出来的.h中也会包含有.m中声明的方法(包括.m中的属性变量),只是没有包含具体实现。还有,解析出来.h中不包含你在原代码中注释的内容。所以不用担心你在.h.m中写的注释被别人解析出来
ps2.比如工程中接入了第三方的静态库.framework。那么解析也会把第三方库中的.h也解析出来


IDA工具静态分析源码

解析出来的汇编界面

从这里基本就可以看出该方法源码的内容。


关于cycript动态注入代码的使用后面在写吧。网上资料很多,都是千篇一律。这部分需要深入,目前我还没深入研究,后面研究清楚了在补充。还有一个Reveal工具也不错。

上一篇下一篇

猜你喜欢

热点阅读