逆向(四)脱壳

一、加壳

利用特殊的算法,对可执行文件的编码进行改变(比如压缩、加密),以达到保护程序代码的目的。

屏幕快照 2018-10-29 20.55.44

屏幕快照 2018-10-29 20.57.02

二、脱壳

摘掉壳程序,将未加密的可执行文件还原出来(有些人也称为“砸壳”)

脱壳主要有2种方法:硬脱壳、动态脱壳。

2.1 是否脱壳

Mach-O文件中,Crypt ID为1代表加密,即加壳。

  1. 查看Load Commands -> LC_ENCRYPTION_INFO -> Crypt ID的值,0代表未加密

cryptid

  1. 通过otool命令行

    otool -l 可执行文件路径 | grep crypt

屏幕快照 2018-10-30 07.02.41

2.2 脱壳工具

脱壳工具有很多,比如Clutch、dumpedcrypted。

另外,还有其他脱壳工具,如AppCrackr、Crackulous。

三、Clutch

3.1 安装

3.1.1 建议去掉版本号,改名为Clutch

3.1.2 将Clutch文件拷贝到iPhone的/usr/bin目录

clutch_path

3.1.3 提示权限不足,赋予可执行权限:

1
2
3
5s:~ root# Clutch
-sh: /usr/bin/Clutch: Permission denied
5s:~ root# chmod +x /usr/bin/Clutch

3.2 使用

1
2
3
4
5
6
7
8
> Clutch [OPTIONS]
> -b --binary-dump Only dump binary files from specified bundleID
> -d --dump Dump specified bundleID into .ipa file
> -i --print-installed Print installed application
> --clean Clean /var/tmp/clutch directory
> --version Display version and exit
> -? --help Display this help and exit
>

3.2.1 列出应用

列出已经安装的应用

屏幕快照 2018-10-30 06.51.49

3.2.2 脱壳

根据上面列出的,输入app序号或者bundle id进行脱壳操作:

1
2
Clutch -d  app序号
Clutch -d bundleid



3.2.3 脱壳完成

脱壳完成之后,会显示路径:

屏幕快照 2018-10-30 07.28.34

去对应路径,将脱壳头文件拷出即可。




当然也可能会脱壳失败:

屏幕快照 2018-10-30 07.31.57

那么,有两种方案

  1. 再次尝试脱壳;
  2. 利用dempdecrypted尝试脱壳。

四、dumpdecrypted

4.1 编译

下载源代码,然后在源代码目录执行make指令进行编译,获得dylib动态库文件




将dylib文件拷贝到iPhone上(如果是root用户,建议放/var/root目录)



4.2 破壳

注:以下操作均在手机端完成。

4.2.1 终端进入dylib所在的目录

4.2.2 DYLD_INSERT_LIBRARIES

使用环境变量DYLD_INSERT_LIBRARIES将dylib注入到需要脱壳的可执行文件:

  • 可执行文件路径可以通过ps -A查看获取,也可以通过MJAppTools获取。

找到芒果TV对应的路径:

/var/mobile/Containers/Bundle/Application/81DF5B23-4935-4E4D-81CA-03B6EE5B400F/MGTV-iPhone-appstore.app/

通过ps命令,得到的是app包的路径,还要找到app下对应的可执行文件。

此处,其对应的可执行文件为MGTV-iPhone-appstore,所以完整路径是:

/var/mobile/Containers/Bundle/Application/81DF5B23-4935-4E4D-81CA-03B6EE5B400F/MGTV-iPhone-appstore.app/MGTV-iPhone-appstore

  • DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib 可执行文件路径
1
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/81DF5B23-4935-4E4D-81CA-03B6EE5B400F/MGTV-iPhone-appstore.app/MGTV-iPhone-appstore
  • 小提示:
    • 获取对应APP的可执行文件,在找到app路径之后,app内一般可执行文件都以MB为单位,比较大
    • 另外,可执行文件,一般以APP应用名称有关联,比如微信是Wechat等。

4.2.3 破壳文件重命名

在dylib目录下找到对应的破壳程序,.decrypted就是破壳程序,将其重新命名为.ipa即可。



4.2.4小问题

☞假如遇到下面提示

image-20181030081948857

☞原因:对dylib所在的文件夹权限不够

☞解决方案:将dylib放在用户所在文件夹,比如

  • 如果是root用户,请将dylib放在/var/root目录

  • 如果是mobile用户,请将dylib放在/var/mobile目录

参考

链接

  1. Clutch
  2. Clutch Release
  3. dumpdecrypted