一、加壳和脱壳
1、加壳
利用特殊的算法,对可执行文件的编码进行改变(比如压缩、加密),以达到保护程序代码的目的。iOS端App在上线之前会有苹果商店进行FairPlayDRM数字版权加密保护,我们称之为“加壳”。
2、脱壳
要对App Store分发的iOS App进行分析,我们需要先对App进行解密,我们称之为“脱壳”,有些人也称为“砸壳”。脱壳之后的二进制文件就是原始的、未加密的二进制文件。 对于macOS上的App,苹果官方是不会对其进行加壳的。所以分析macOS App不需要执行脱壳操作。脱壳主要有2种方法:硬脱壳、动态脱壳
二、判断是否加壳
1、使用MachOView检测
使用MachOView打开目标Mach-O文件。展开“Load Commands”节点,选择“LC_ENCRYPTION_INFO_64”节点,右边的crypt ID即代表了是否加密。为0则代表未加密(没有壳或已脱壳),为1则代表已加密(已加壳)。
2、使用otool检测
otool是Xcode自带的命令行工具,安装了Xcode的macOS系统不需要额外安装otool。 使用otool的如下命令可以检测App是否被加壳。如下:
otool -l mach-O文件 | grep crypt
三、Clutch 脱壳
1、下载最新的Release版: https://github.com/KJCracks/Clutch/releases 建议去掉版本号,改名为
Clutch
。如下图2、将Clutch文件拷贝到越狱iPhone的
/usr/bin
目录下。如下图
3、如果在iPhone上执行Clutch指令,权限不够,赋予“可执行的权限”
chomd +x /usr/bin/Clutch
。如上图4、列出已安装的APP:
Clutch -i
。如下图5、输入APP序号或者Bundle Id进行脱壳操作:
Clutch -d APP序号或BundleId
。 注意:因为是动态脱壳,使用Clutch脱壳前需要先启动目标App。如下图6、脱壳成功后会生成一个ipa文件。之后就可以在对应的手机文件目录下获取脱壳后的ipa文件了。
/private/var/mobile/Documents/Dumped/com.ss.iphone.ugc.Aweme-iOS8.0-(Clutch-2.0.4)-2.ipa
如下图
四、dumpdecrypted 脱壳
1、下载安装dumpdecrypted
dumpdecrpyted是开源的,需要先进行编译,然后再将编译好的dylib复制到越狱iPhone上
- 1)下载源码 https://github.com/stefanesser/dumpdecrypted
- 2)目录下执行
make
命令执行编译操作。 - 3)编译成功后目录下会多出一个dylib动态库文件。
- 4)将dylib复制到越狱设备的
/var/root
目录下(以root用户身份登录)
2、使用dumpdecrypted
终端进入dylib所在的目录。使用环境变量DYLD_INSERT_LIBRARIES将动态库dumpdecrpyted注入到需要脱壳的目标mach-O文件中。命令格式DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib 可执行文件路径
.可执行文件路径
可以通过 ps -A
查看获得。
例如命令:
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/EE46F01C-AECF-4894-938C-7588A6543397/QQNews.app/QQNews
执行成功后目录下会多出一个xxx.decrypted文件。该文件就是脱壳后的可执行文件。
3、可能出现的问题
1)dyld: Symbol not found: ___chkstk_darwin
原因是Xcode SDK 版本要与越狱手机 iOS SDK 版本一致。此时我们需要下载一个老版本的Xcode9者Xcode10。然后打开终端执行如下命令sudo xcode-select -s /Users/xxx/Desktop/Xcode_9.4.1.app/Contents/Developer
。然后cd到dumpdecrypted所在目录,删除原来生成的 dumpdecrypted.dylib
和dumpdecrypted.o
文件,然后执行make
命令
问题详情请转阅:https://www.jianshu.com/p/06474e84166c
2)dyld:could not load inserted library 'dumpdecrypted.dylib' because no suitable image found.
- 原因:对dylib所在的文件夹权限不够
- 解决方案:将dylib放在用户所在文件夹,比如 :如果是root用户,请将dylib放在/var/root目录。如果是mobile用户,请将dylib放在/var/mobile目录