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中的脱壳工具
- IOS中有很多好用的脱壳工具
Cluth:https://github.com/KJCracks/Clutchdumpdecrypted:https://github.com/stefanesser/dumpdecrypted/AppCracker、Crackulous
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_LIBRARIES将dylib注入到需要脱壳的可执行文件(可执行文件路径可以通过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的过程中报错:
-
解决办法:
- 根据上面PlugIn Pathcd:
/Applications/Xcode10.3.app/Contents/Developer/usr/lib - 找到
libMainThreadChecker.dylib插件 - 修改其名称:
mv libMainThreadChecker.dylib libMainThreadChecker.dylib.00 - 然后再打开Xcode10.3 就不会报错了
- 根据上面PlugIn Pathcd:
-
如遇一下错误:

-
原因:对dyld所在的文件夹权限不够
-
解决方案:将dyld放在用户所在的文件夹。比如:
- 如果是root用户,请将dyld放在
/var/root目录 - 如果是moblie用户,请将dyld放在
/var/moblie目录
- 如果是root用户,请将dyld放在
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删除文件:
1万+





