加壳
将打包好的ipa文件上传到App Store后会对可执行文件进行加壳,我们下载到iPhone的APP就是加壳后的App。所谓加壳,就是利用特殊算法,对可执行文件的编码进行改变(压缩、加密),以达到保护程序代码的目的。
对于不加壳的APP,可执行文件执行的时候是直接在内存中装载可执行文件。而对于加壳后的APP,可执行文件已加密,ldyd无法直接在内存中装载可执行文件,此时加密的可执行文件实际上包裹了一层壳,两者合成了一个可执行的壳程序,在内存中装载该壳程序并解密执行真正的可执行文件。
脱壳
所谓脱壳,就是摘掉壳程序,将未加密的可执行文件还原出来。脱壳有硬脱壳和动态脱壳2种方法。
硬脱壳:壳程序执行解密算法得到可执行文件。
动态脱壳:当壳程序运行在内存中时,直接将壳程序解密好的可执行文件从内存中导出。
使用MachOView查看Mach-O可执行文件,在Load Commands下有一个LC_ENCRYPTION_INFO_64,里面的Crypt ID若为0说明未加密,若为其他数字则说明被加密过。也可以使用otool工具使用命令行:otool -l Mach-O文件 | grep crypt。
未脱壳的微信Mach-O文件的cyptid为1,很明显的是加壳的。
Clutch
Clutch是iOS硬脱壳常用的一种工具,从https://github.com/KJCracks/Clutch/releases下载最新版,并放到iPhone的/usr/bin目录下,注意若提示/usr/bin/Clutch: Permission denied,可以使用chmod +x /usr/bin/Clutch修改权限。
1、使用“Clutch -i”列出已安装的APP。
2、输入APP序号或者Bundle Id进行脱壳操作。例如:Clutch -d 8。
很可惜,用这个工具试了好多APP都脱壳失败。
dumpdecrypted
dumpdecrypted也是iOS硬脱壳常用的一种工具。从https://github.com/stefanesser/dumpdecrypted下载源代码,在源代码目录执行make命令,获取dylib动态库文件。将dylib文件拷贝到iPhone上,建议放在/var/root目录。然后使用终端进入dylib所在目录,使用环境变量DYLD_INSERT_LIBRARIES将dylib注入到需要脱壳的可执行文件:DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib可执行文件。
iOS12以上需要对dumpdecrypted.dylib进行重签名,可以使用“ldid -S dumpdecrypted.dylib”命令在iPhone上对其进行重签名。
很可惜,由于我的Xcode版本过高再次脱壳失败。若想使用dumpdecrypted进行脱壳,需要让Xcode SDK版本与越狱手机的iOS SDK版本一致。此时可以去下载一个能与越狱iPhone对应的老版本的Xcode。然后打开终端执行命令“sudo xcode-select -s 老版本Xcode所在目录/Contents/Developer”。
还有一种方法,修改下载的dumpdecrypted目录下的makefile,然后重新 make。具体修改:在 GCC_BASE 最后加上 -miphoneos-version-min=12.0 或更低版本,并对新生成的dumpdecrypted.dylib进行重签名。
frida-iOS-dump
frida-iOS-dump是一种动态脱壳的方法,它需要让待脱壳的APP运行起来。
1、在越狱iPhone上安装AFC2、AppSync这两个依赖。并确保已经安装了SSH。
2、Mac端安装Python3,然后使用命令“sudo pip3 install frida-tools”安装frida-tools,因为frida-tools依赖frida,因此不需要单独下载frida,直接安装frida-tools就自动会安装上frida。
3、从https://github.com/AloneMonkey/frida-ios-dump/tree/3.x下载frida-ios-dump,在frida-ios-dump所在目录下使用“sudo pip3 install -r ./requirements.txt --upgrade”命令安装相关依赖库。
4、使用命令“brew install usbmuxd”安装usbmuxd,然后输入“iproxy 2222 22”切换远程连接的端口号,并登录到越狱iPhone。
5、越狱iPhone打开要脱壳的APP使其保持运行,然后回到Mac终端,在frida-ios-dump所在目录下使用命令“./dump.py 待脱壳APP包名”进行脱壳。
此时,将得到一个脱壳后的ipa文件,将其中的Mach-O文件取出,再次使用otool查看。
可以看到cryptid已经为0了,说明已经将AppStore加的那个壳给脱掉了。
然而,当满心欢喜的使用class-dump想导出头文件时,发现报错;使用Hopper Disassembler时也只比未脱壳前要多一些可利用的汇编代码。腾讯爸爸还是做了很多代码混淆等程序加固工作的。