IOS逆向学习-加壳脱壳

Posted GY-93

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOS逆向学习-加壳脱壳相关的知识,希望对你有一定的参考价值。

1. 加壳和脱壳

从appStroe上下载的app都是加壳(对可执行文件进行过加密)的文件,你直接使用class-dump、hopper工具 是解析不出来的,但是某些app通过其他工具安装,比如PP助手安装是可以直接解析的

流程: IPA文件 —上传–> AppStore(对其上传的可执行文件进行了加壳操作) -----下载—> iphone手机上

1.1 加壳的原理

  • 什么是加壳?

    • 利用特殊的算法,对可执行文件的编码进行改变(比如压缩、加密),已达到保护程序代码的目的
  • 加壳的过程:在这里插入图片描述

1.2 脱壳

  • 什么是脱壳?

    • 摘掉壳程序,讲未加密的可执行文件还原出来(有些人也成为“砸壳”)
  • 脱壳主要有两种方法: 硬脱壳、动态脱壳在这里插入图片描述

  • IOS上一般是采用硬脱壳的方式,直接脱壳

1.3 APP的可执行文件是否加壳

  • 通过iFunBox知道手机上安装app的路径,然后把可执行的Mach-o文件拷贝到电脑上,通过以下几种方式查看app是否加壳:
    • 在手机上运行软件,然后再终端,登录手机,执行指令ps -A打印出app的路径:在这里插入图片描述

    • 通过iFunBox找到手机上的这个路径,并把可执行文件拷贝到电脑上:在这里插入图片描述

    • 可以通过class-dump指令来看看能否导出头文件,如果是加密的文件导出来头文件上这样的,只有一个文件,而正常的是多个头文件:在这里插入图片描述

    • 通过命令行otool指令(otool -l 可执行文件路径 | grep crypt)打印Load command去查看Mach-O文件是否加壳:在这里插入图片描述

    • 使用MachOView 产看 Load commands 中的 LC_ENCRYPTION_INFO 属性中 Crypt的值 如果是非0的数值 就表示加壳(加密)过, 如果是0则表示没有加密 , arm64 架构的话LC_ENCRYPTION_INFO_64 会在后面加上64 arm7则不需要
      在这里插入图片描述

1.4 IOS中的脱壳工具

1.4.1 Clutch

  • 下载最新的Release版:https://github.com/KJCracks/Clutch/releases
  • 下载下来之后,建议改名称,去掉版本号,改名为Clutch
  • 将Clutch文件拷贝到iPhone的/usr/bin目录下
  • 如果在iPhone上执行Clutch指令,权限不够,赋予可执行权限chmod +x /usr/bin/Clutch

1.4.2 Clutch的使用

  • 列出已安装的APP:在这里插入图片描述

  • 输出APP序号或则Bundle Id进行脱壳操作:Clutch -d APP序号或BundleId,脱壳过程报错Error: Failed to dump <xxxx> with arch arm64

  • 注意: Clutch工具经过本人验证在IOS12的系统上已经失效了,无法脱壳,(本人也查找了下网上相关资料,大部分网友表示该工具在IOS12上失效,已无法使用)
    在这里插入图片描述

1.4.3 dumpdecrypted

  • 下载源代码,然后再源码目录中执行make指令进行编译,获取dylib动态库文件

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

    • 将终端进入dylib所在的目录
    • 使用环境变量DYLD_INSERT_LIBRARIESdylib注入到需要脱壳的可执行文件(可执行文件路径可以通过ps -A查看获取)
      在这里插入图片描述
  • 指令示例:DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/ABFAC835-3195-4C85-9384-E25454911641/Reading.app/Reading 然后执行

  • 砸壳成功:在这里插入图片描述

在这里插入图片描述

也可以通过iFunBox来查看:在这里插入图片描述

  • 查看文件的属性:在这里插入图片描述

1.4.4 dumpdecrypted过程中遇到问题

  • IOS12以上系统报一下错误,说明缺少签名:
dyld: warning: could not load inserted library 'dumpdecrypted.dylib' into hardened process because no suitable image found.  Did find:
	dumpdecrypted.dylib: code signature in (dumpdecrypted.dylib) not valid for use in process using Library Validation: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed.

解决办法: 使用 ldid 工具执行下面的代码ldid -S dumpdecrypted.dylib命令给 dumpdecrypted.dylib直接签名就可以

  • 遇到XcodeSDK版本和越狱手机的SDK版本不匹配,我的Xocde 版本11.2.1 ,越狱手机版本12.5.1
dyld: Symbol not found: ___chkstk_darwin
  Referenced from: dumpdecrypted.dylib (which was built for iOS 13.2)
  Expected in: /usr/lib/libSystem.B.dylib
 in dumpdecrypted.dylib
Abort trap: 6

解决办法:需要下载一个对应SDK版本低 Xcode,重新编译动态库,然后再脱壳,如果你已经安装了高版本的Xocde,例如12.3 ,在打开Xcode10.3的过程中报错:在这里插入图片描述

  • 解决办法:

    1. 根据上面PlugIn Pathcd: /Applications/Xcode10.3.app/Contents/Developer/usr/lib
    2. 找到libMainThreadChecker.dylib插件
    3. 修改其名称:mv libMainThreadChecker.dylib libMainThreadChecker.dylib.00
    4. 然后再打开Xcode10.3 就不会报错了
  • 如遇一下错误:在这里插入图片描述

  • 原因:对dyld所在的文件夹权限不够

  • 解决方案:将dyld放在用户所在的文件夹。比如:

    • 如果是root用户,请将dyld放在/var/root目录
    • 如果是moblie用户,请将dyld放在/var/moblie目录

1.4.5 class-dump脱壳后的文件问题

脱壳成功后,使用class-dump指令,导出头文件,但是报如下错误:在这里插入图片描述

经过查找,可能是swift和OC混编导致,无法dump出头文件, 目前没有找到有效的方法

1.4.6 实战-theos工具

思路: 首先通过Reveal工具找到广告页面(UIView),然后找到其对应的init方法,我们需要hook初始化方法。达到我们去掉广告的页面的目的,实质:hook代码----> 生成.deb插件,在安装到手机上(.deb安装包: 一些越狱插件)

1.4.6.1 安装theos工具

  • 安装签名工具brew install ldid (直接通过Homebrew工具直接安装软件)
  • 修改环境变量
vim ~/.bash_profile
export THEOS=~/theos 
export PATH=$THEOS/bin:$PATH
  • 注意:

    • 只要配置到PATH这个环境变量中, 这样你就可以通过终端不管是在那个路径下都可以方法这个指令,相当于我们直接方法/usr/bin 、/usr/local/bin 下面指令一样
    • 引用环境变量是$环境变脸名 例如:$PATH
    • :的作用是 把当前配置的环境变量和以前的环境变量加起来,都可以起作用,不然就是直接覆盖掉系统配置好的环境变量了
    • 打印环境变量的值:echo 环境变量,例如:echo $PATH在这里插入图片描述
    • .bash_profile : 用来编辑电脑当前用户的环境变量,如果你发现编辑这个文件配置好环境变量,但是打印环境变量的值是空,这是因为文件还没有生效,需要执行下文件source .bash_profile 让文件的内容马上生效。(所以建议大家以后修改了 export 这种环境变量以后,执行一个source操作,这样环境变量才回生效)
  • 下载theos:git clone --recursive https://github.com/theos/theos.git $THEOS

1.4.6.2 theos创建项目

配置上述环境变量之后,并且下载theos成功之后,那么我们可以使用theos来创建项目,编写插件代码。

  • 验证theos是否安装成功(在终端输入指令nic.pl):在这里插入图片描述
    弹出如图所示界面,表示theos安装成功, 我们创建项目选择15(iphone/tweak)

  • 创建项目步骤:在这里插入图片描述

  • 创建好的项目结构目录:在这里插入图片描述

接下来我们可以把项目拖拽到SubLime Text工具中编辑,开始编写文件

  • 配置环境变量:在这里插入图片描述

  • 编写hook代码:

    • 首先可以把SubLime Text的调整为Objective-C++模式可以编辑 在这里插入图片描述
  • 编写好的hook类:在这里插入图片描述

  • 编译、打包, 然后直接安装到手机上(make install
    在这里插入图片描述

  • 如何卸载这个插件,在手机上利用iFunBox删除文件:在这里插入图片描述

以上是关于IOS逆向学习-加壳脱壳的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向APK 加壳脱壳现状 | 判断 APK 是否加壳 | APK 逆向流程

逆向基础:软件手动脱壳技术入门

iOS逆向工程之给App脱壳

逆向工程之App脱壳

Android 逆向脱壳解决方案 ( DEX 整体加壳 | 函数抽取加壳 | VMP 加壳 | Dex2C 加壳 | Android 应用加固防护级别 )

安卓 dex 通用脱壳技术研究