iOS逆向之IPA脱壳

作者: 张芳涛 | 来源:发表于2016-08-05 00:49 被阅读1880次

    来自:https://www.ianisme.com/ios/2326.html

    一、前言:

    从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砸壳

    地址:传送门->https://github.com/ianisme/IANDecryptiOSApp/tree/master/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:

    传送门->https://github.com/ianisme/IANDecryptiOSApp/tree/master/getAppBundle

    找到对应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了。

    四、总结:

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

    相关文章

      网友评论

      • 日拱一卒wu:从App Store下载到手机里面的IPA目录在哪里?

      本文标题:iOS逆向之IPA脱壳

      本文链接:https://www.haomeiwen.com/subject/jerhsttx.html