加壳
通常我们从App Store下载的应用,拿到安装包之后,通过class-dump导出头文件的时候,会发现无法导出头文件,原因就是App Store对我们上传的App进行了加壳操作。
什么是加壳?
利用特殊的算法,对可执行文件的编码进行改变(比如压缩、加密),以达到保护程序代码的目的
- 未加壳,我们App的可执行文件一旦执行,那么可执行文件中的代码会被装载到内存中
- 加壳后,可执行文件中的所有代码被加密之后就无法使用ldyd进行加载了,所以在可执行文件外部包了一层壳程序,壳程序可以直接运行。壳程序的作用就是使用解密算法对我们的可执行文件进行解密操作,解密完成之后就会去执行文件,将代码装载进内存中。
如何判断程序被加壳(加密)?
- 使用MachOView加载可执行文件,查看Load Commands -> LC_ENCRYPTION_INFO -> Crypt ID,<font color=red>0</font>表示<font color=red>未加密</font>,<font color=red>>=1</font>表示<font color=red>已加密</font>
这里的Crypt ID表示加密工具类型,如果为1,表示使用编号为1的加密工具进行加密
- 使用otool命令行也可以查看Load Commands
otool -l 可执行文件路径 | grep crypt
由于Load Commands内容较多,所以通过crypt关键字进行检索
脱壳
既然无法通过加壳后的程序导出我们所需要的头文件信息,那么我们就需要对程序进行脱壳操作
什么是脱壳?
摘掉壳程序,将未加密的可执行文件还原出来
怎么进行脱壳?
脱壳方式有两种,硬脱壳和动态脱壳。
- 硬脱壳就是直接将壳程序通过执行解密算法得到我们所需要的可执行文件,在iOS中,一般使用硬脱壳。
- 动态脱壳是指将程序运行之后,直接从内存中导出我们所需要的可执行文件
脱壳工具
iOS中常用的脱壳工具有<font color=red>Clutch</font>和<font color=red>dumpdecrypted</font>
Clutch
可以点击下载Clutch最新Release版本
Clutch配置
- 下载最新的Release版本,将Clutch-2.0.4改名为Clutch
- 使用以下命令将Clutch文件拷贝到iPhone上的/usr/bin目录,当然,也可以使用ifunBox直接拖拽
scp -P 10088 ./Clutch root@localhost:/usr/bin
- 如果在iPhone上执行Clutch命令提示无权限,则需要为Clutch增加执行权限
chmod +x /usr/bin/Clutch
Clutch使用
- 远程连接iPhone后,通过以下指令列出当前已安装的可以进行脱壳的App
Clutch -I
- 通过App序号或者bundle ID进行脱壳操作
Clutch -d 2
Clutch -d com.gemd.iting
- 脱壳成功之后,在<font color=red>/private/var/mobile/Documents/Dumped/</font>路径下就能找到脱壳成功后的ipa文件
路径当中的/private/var是iPhone中的真实路径,iPhone的/var是/private/var的替身
- 将脱壳后的ipa包导入到Mac上,找到其中的Mach-O文件,使用otool命令查看Load Commands可以发现Crypt ID为0
dumpdecrypted
dumpdecrypted配置
点击下载dumpdecrypted工具
- 下载好源代码后,在源代码目录执行make指令进行编译,获得dylib动态库文件
- 将dylib文件拷贝到iPhone上(如果是root用户,建议放在<font color=red>/var/root</font>目录)
dumpdecrypted使用
- 终端进入dylib所在位置,使用环境变量<font color=red>DYLD_INSERT_LIBRARIES</font>将dylib注入到需要脱壳的可执行文件
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib 可执行文件路径
可以通过ps -A查看可执行文件的完整路径
执行完成之后,在<font color=red>/var/root</font>目录下会生成.decrypted文件,这就是脱壳之后的可执行文件。现在使用otool命令查看Load Commands可以发现Crypt ID为0。
最后使用class-dump就可以导出可执行文件中的所有头文件了。