This post was updated 3078 days ago and some of the ideas may be out of date.

一、前言:

从APPStore上面下载下来的程序都有壳,我们不能对他进行任何操作,iOS逆向的第一步就是脱壳。下面跟我一起实战一下。

二、工具:

1.一步越狱手机(建议选4s)

2.dumpdecrypted

三、步骤:

3.1 下载对应的程序包

首先我使用我已经越狱的iPhone4s从Appstore下载APP,此处我以某程序为例。并使用PP助手等工具导入到电脑里。

3.2 查看是否加密

解压ipa文件,拿到里面的主文件,对其进行架构查询

file 主文件名

如图:

tuoke0

此APP支持两种架构,我们查询下它的加密情况


otool -l 主文件名 | grep crypt

如图:

tuoke1

cryptid 1代表加密,cryptid 0代表未加密。两个分别对应着armv7和arm64,也就是它们都有加密。

3.3 使用dumpdecrypted砸壳

地址:传送门->点我

3.3.1 编译dumpdecrypted.dylib文件

首先我们需要编译我们的dumpdecrypted.dylib文件,越狱手机的iOS的版本要和SDK的版本相同。我手机是iOS8.1.3,因此我选用了8.1的SDK,在Xcode6.1中可以找到。
打开终端我们输入一下命令查找下我需要的SDK地址:

find / -name iPhoneOS8*

我这里的得到的地址为:

/Applications/Xcode6.1.1/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk

我们需要修改Makefile文件中的

SDK=`xcrun --sdk iphoneos --show-sdk-path`

改为:

SDK=/Applications/Xcode6.1.1/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.1.sdk

如果是的sdk是7.0的,需要继续去掉arm64的内容。8.0以上版本请略过
我们需要将Makefile文件中的

GCC_UNIVERSAL=$(GCC_BASE) -arch armv7 -arch armv7s -arch arm64

改为

GCC_UNIVERSAL=$(GCC_BASE) -arch armv7 -arch armv7s

我们再将dumpdecrypted.c文件中的

    if (lc->cmd == LC_ENCRYPTION_INFO || lc->cmd == LC_ENCRYPTION_INFO_64)

改为:

if (lc->cmd == LC_ENCRYPTION_INFO)

下面进入到dumpdecrypted根目录,make进行编译,获得dumpdecrypted.dylib

3.3.2 定位二进制文件地址

我们在电脑上解压缩那个ipa包,取到里面的Info.plist文件,获取里面的Bundle identifier,例如:com.ianisme.xxxxx

如图:

tuoke3

在手机上跑我提供的这个Demo:

传送门->点我下载

找到对应Bundle identifier的对应的resourcesDirectoryURL和dataContainerURL

如图:

tuoke2

3.3.3 进行脱壳处理

得到地址后我们将编译好的dumpdecrypted.dylib传输到dataContainerURL的tmp目录下

如图:

tuoke4

然后切换到dataContainerURL的tmp目录执行如下代码:

DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/FEA0A0C0-EF52-4D76-8EEC-422D5D8331D4/XXXX.app/XXXX

进行脱壳

如图:

tuoke5

在tmp目录下生成了一个XXXX.decrypted这就是脱壳后的主文件

我们把文件用scp命令导出

如图:

tuoke6

3.4 armv7抽取处理

此时我们把XXXX.decrypted的扩展名去掉,使用otool查看脱壳情况

tuoke7

我们发现64位的壳没有脱掉,因为我用的是iPhone4s,处理器架构是armv7,只能脱这部分的壳。
我们将app的armv7抽取出来,就可以保证app只以armv7模式运行,指令集向下兼容,也就是4s以上的机型都可以运行的。不得不说现在4s依然威武,到处都少不了他。

运行如下代码:

lipo XXXX -thin armv7 -output XXXX_armv7

XXXX_armv7就是最终的无壳主文件,将ipa包里面的替换掉,这就是一个无壳的APP了。

四、总结:

逆向是把双刃剑,有利于提高我们的技术,也有可能为不怀好意的人提供了捷径,以上内容仅供学习参考,请勿用于非法用途,谢谢。

本文参考文献以及文章:
iOS-私有API与runtime
用dumpdecrypted给App砸壳
《iOS应用逆向工程》学习笔记(六)使用dumpdecrypted砸壳
iOS之lipo
lipo命令合并和拆分IOS静态库