前言
前段时间学习过利用工具来对加密的应用ipa包砸壳,dumpdecrypted砸壳,Clutch砸壳,frida-ios-dump砸壳,这次通过LLDB自己手动操作可执行文件,dump出解密的文件(实际上dumpdecrypted就是这个原理),简单了解砸壳的原理。
一、原理
加密内容在手机启动执行加载到内存后,是解密的,可以根据Mach-O文件记录的加密内容开始偏移值以及加密内容大小,从内存中dump出已经解密的部分,再将dump出的部分写回原执行文件,这样就得到一个完整的解密的可执行文件。
二、从越狱手机拷贝出原可执行文件
以WeChat为例
了解到了这两个数据信息,就可以利用LLDB进行解密,下面选择64位架构进行解密
三、使用LLDB砸壳
参考LLDB+debugserver调试第三方应用进入lldb调试界面,并且附加到目标进程,如下:
查看主模块加载地址
我们使用的物理地址为:
0x0000000100014000
,先记录下来,接着根据cryptoof
与cryptsize
字段dump出解密部分,如下:这样dump出的文件是没有Mach-O header,因此要将dump出文件Patch回原可执行文件(可以先备份原可执行文件),Patch之前先说个注意点:
注意:手机上拷贝出的Mach-O文件含有两种架构,因此我们在Patch的时候要找对架构起始偏移
从下面的Mach-O头信息可知,我们需要将dump出的文件写回70041600
+ 16384
=70057984
的位置
Patch操作如下(过程会有点久,耐心等待):
到这一步,原可执行文件的arm64架构文件已经解密,最后修改一下对应的加密标识
cryptID
即可。
提取arm64架构的文件
lipo -thin arm64 WeChat -output /Users/kinken_yuen/Desktop/WeChat_arm64
使用Mach-OView修改字段
最后使用class-dump能够正常dump出工程的类头文件,砸壳成功。
四、脚本调用LLDB砸壳
Github:https://github.com/BlueCocoa/dumpdecrypted-lldb