ios(加壳,脱壳)

1,413 阅读3分钟

什么是加壳?

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

  • 未加壳,我们App的可执行文件一旦执行,那么可执行文件中的代码会被装载到内存中
  • 加壳后,可执行文件中的所有代码被加密之后就无法使用dyld进行加载了,所以在可执行文件外部包了一层壳程序,壳程序可以直接运行。壳程序的作用就是使用解密 算法对我们的可执行文件进行解密操作,解密完成之后就会去执行文件,将代码装载 进内存中。

通常我们从App Store下载的应用都是加壳的,是App Store对我们上传的App进行了加壳操作。

如何判断一个Mach-O文件是否是加壳的?

  • 使用otool命令行查看Load Commands
otool -l 文件路径 | grep cript
  • 使用MachOView加载文件,查看Load Commands -> LC_ENCRYPTION_INFO -> Crypt ID,0表示未加密,>=1表示已加密.

什么是脱壳?

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

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

  • 硬脱壳:就是直接将壳程序通过执行解密算法得到我们所需要的可执行文件,在iOS中,一般使用硬脱壳。
  • 动态脱壳:是指将程序运行之后,直接从内存中导出我们所需要的可执行文件。

iOS中常用的脱壳工具有Clutch和dumpdecrypted

Clutch

下载地址:github.com/KJCracks/Cl…

  • 下载最新的Release版本,将下载好的文件改名为Clutch
  • 使用以下命令将Clutch文件拷贝到iPhone上的/usr/bin目录,当然,也可以使用ifunBox直接拖拽
scp Clutch文件路径 root@手机地址:/usr/bin

复制代码 如果在iPhone上执行Clutch命令提示无权限,则需要为Clutch增加执行权限

chmod +x /usr/bin/Clutch

Clutch使用

远程连接iPhone后,通过以下指令列出当前已安装的可以进行脱壳的App

Clutch -i

通过App序号或者bundle ID进行脱壳操作

Clutch -d 序号 or Clutch -d bundle ID

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

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

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

dumpdecrypted

下载地址:github.com/stefanesser…

  • 下载好源代码后,在源代码目录执行make指令进行编译,获得dylib动态库文件
  • 将dylib文件拷贝到iPhone上(如果是root用户,建议放在/var/root目录)

dumpdecrypted使用

  • 终端进入dylib所在位置,使用环境变量DYLD_INSERT_LIBRARIES将dylib注入到需要脱壳的可执行文件
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib 可执行文件路径
  • 可以通过ps -A查看正在iphone运行的可执行文件的完整路径
  • 执行完成之后,在/var/root目录下会生成对应的.decrypted文件,这就是脱壳之后的可执行文件。现在使用otool命令查看Load Commands可以发现Crypt ID为0。
  • 最后使用class-dump等工具可以导出可执行文件中的所有头文件了。