iOS逆向学习之五(加壳?脱壳?)

加壳

一般咱们从App Store下载的应用,拿到安装包以后,经过class-dump导出头文件的时候,会发现没法导出头文件,缘由就是App Store对咱们上传的App进行了加壳操做。git

什么是加壳?

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

  • 未加壳,咱们App的可执行文件一旦执行,那么可执行文件中的代码会被装载到内存中
  • 加壳后,可执行文件中的全部代码被加密以后就没法使用ldyd进行加载了,因此在可执行文件外部包了一层壳程序,壳程序能够直接运行。壳程序的做用就是使用解密算法对咱们的可执行文件进行解密操做,解密完成以后就会去执行文件,将代码装载进内存中。

如何判断程序被加壳(加密)?

  • 使用MachOView加载可执行文件,查看Load Commands -> LC_ENCRYPTION_INFO -> Crypt ID,0表示未加密,>=1表示已加密

这里的Crypt ID表示加密工具类型,若是为1,表示使用编号为1的加密工具进行加密算法

  • 使用otool命令行也能够查看Load Commands
otool -l 可执行文件路径 | grep crypt
复制代码

因为Load Commands内容较多,因此经过crypt关键字进行检索bash

脱壳

既然没法经过加壳后的程序导出咱们所须要的头文件信息,那么咱们就须要对程序进行脱壳操做工具

什么是脱壳?

摘掉壳程序,将未加密的可执行文件还原出来编码

怎么进行脱壳?

脱壳方式有两种,硬脱壳和动态脱壳。加密

  • 硬脱壳就是直接将壳程序经过执行解密算法获得咱们所须要的可执行文件,在iOS中,通常使用硬脱壳。
  • 动态脱壳是指将程序运行以后,直接从内存中导出咱们所须要的可执行文件

脱壳工具

iOS中经常使用的脱壳工具备Clutchdumpdecryptedspa

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
复制代码

  • 脱壳成功以后,在/private/var/mobile/Documents/Dumped/路径下就能找到脱壳成功后的ipa文件

路径当中的/private/var是iPhone中的真实路径,iPhone的/var是/private/var的替身code

  • 将脱壳后的ipa包导入到Mac上,找到其中的Mach-O文件,使用otool命令查看Load Commands能够发现Crypt ID为0

dumpdecrypted

dumpdecrypted配置

点击下载dumpdecrypted工具

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

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

dumpdecrypted使用

  • 终端进入dylib所在位置,使用环境变量DYLD_INSERT_LIBRARIES将dylib注入到须要脱壳的可执行文件
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib 可执行文件路径
复制代码

能够经过ps -A查看可执行文件的完整路径

  • 执行完成以后,在/var/root目录下会生成.decrypted文件,这就是脱壳以后的可执行文件。如今使用otool命令查看Load Commands能够发现Crypt ID为0。

  • 最后使用class-dump就能够导出可执行文件中的全部头文件了。

相关文章
相关标签/搜索