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 主文件名
如图:
此APP支持两种架构,我们查询下它的加密情况
otool -l 主文件名 | grep crypt
如图:
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
如图:
在手机上跑我提供的这个Demo:
传送门->点我下载
找到对应Bundle identifier的对应的resourcesDirectoryURL和dataContainerURL
如图:
3.3.3 进行脱壳处理
得到地址后我们将编译好的dumpdecrypted.dylib传输到dataContainerURL的tmp目录下
如图:
然后切换到dataContainerURL的tmp目录执行如下代码:
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/FEA0A0C0-EF52-4D76-8EEC-422D5D8331D4/XXXX.app/XXXX
进行脱壳
如图:
在tmp目录下生成了一个XXXX.decrypted这就是脱壳后的主文件
我们把文件用scp命令导出
如图:
3.4 armv7抽取处理
此时我们把XXXX.decrypted的扩展名去掉,使用otool查看脱壳情况
我们发现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静态库
参与讨论