iOS逆向之脱壳

一、加壳和脱壳

1、加壳

利用特殊的算法,对可执行文件的编码进行改变(比如压缩、加密),以达到保护程序代码的目的。iOS端App在上线之前会有苹果商店进行FairPlayDRM数字版权加密保护,我们称之为“加壳”。

图1:加壳.png

2、脱壳

要对App Store分发的iOS App进行分析,我们需要先对App进行解密,我们称之为“脱壳”,有些人也称为“砸壳”。脱壳之后的二进制文件就是原始的、未加密的二进制文件。 对于macOS上的App,苹果官方是不会对其进行加壳的。所以分析macOS App不需要执行脱壳操作。脱壳主要有2种方法:硬脱壳、动态脱壳

iOS逆向之脱壳_第1张图片
图2:脱壳.png

二、判断是否加壳

1、使用MachOView检测

使用MachOView打开目标Mach-O文件。展开“Load Commands”节点,选择“LC_ENCRYPTION_INFO_64”节点,右边的crypt ID即代表了是否加密。为0则代表未加密(没有壳或已脱壳),为1则代表已加密(已加壳)。

图3:MachOView检测是否加壳.png

2、使用otool检测

otool是Xcode自带的命令行工具,安装了Xcode的macOS系统不需要额外安装otool。 使用otool的如下命令可以检测App是否被加壳。如下:

otool -l mach-O文件 | grep crypt 
iOS逆向之脱壳_第2张图片
图4:otool检测是否加壳.png

三、Clutch 脱壳

  • 1、下载最新的Release版: https://github.com/KJCracks/Clutch/releases 建议去掉版本号,改名为Clutch。如下图

  • 2、将Clutch文件拷贝到越狱iPhone的/usr/bin目录下。如下图

图5:下载安装Clutch.png
  • 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 如下图

图6:Clutch的使用.png

四、dumpdecrypted 脱壳

1、下载安装dumpdecrypted

dumpdecrpyted是开源的,需要先进行编译,然后再将编译好的dylib复制到越狱iPhone上

  • 1)下载源码 https://github.com/stefanesser/dumpdecrypted
  • 2)目录下执行make命令执行编译操作。
  • 3)编译成功后目录下会多出一个dylib动态库文件。
  • 4)将dylib复制到越狱设备的/var/root目录下(以root用户身份登录)
图7:dumpdecrypted下载安装.png

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文件。该文件就是脱壳后的可执行文件。

图8:使用dumpdecrypted.png

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.dylibdumpdecrypted.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目录


参考链接:https://cloud.tencent.com/developer/article/1764018

你可能感兴趣的:(iOS逆向之脱壳)