IOS逆向学习-加壳脱壳
Posted GY-93
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IOS逆向学习-加壳脱壳相关的知识,希望对你有一定的参考价值。
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
删除文件:
以上是关于IOS逆向学习-加壳脱壳的主要内容,如果未能解决你的问题,请参考以下文章
Android 逆向APK 加壳脱壳现状 | 判断 APK 是否加壳 | APK 逆向流程
Android 逆向脱壳解决方案 ( DEX 整体加壳 | 函数抽取加壳 | VMP 加壳 | Dex2C 加壳 | Android 应用加固防护级别 )