ios 逆向-越狱与砸壳

2,093 阅读6分钟

前言

玩逆向能让你站在高处认识应用的安全性,提高你编写应用的防护能力。下面就几种常用越狱方法和砸壳工具分享一下,毕竟想要站在高处玩逆向,不越狱获取Root权限玩个蛇。

1.0 越狱

简单来讲,越狱的工作原理就是攻击iOS系统安全启动链。所有的越狱工具的作者都需要找到这一信任链上的漏洞,从而禁止掉信任链中负责验证的组件,拿到iOS系统最大权限ROOT权限。完美越狱,所谓完美越狱就是破解iOS系统漏洞之后,每次系统重启都能自动调用注入的恶意代码,达到破坏安全验证,再次获得ROOT权限,ios10以下的系统才可以完美越狱非完美越狱,所谓非完美越狱是指,越狱系统后,并没有完全破解安全链,有部分信息或功能应用不佳;比如;关机以后必须去连接越狱软件来引导开机;或者重启会导致越狱的失效;这样的越狱称为“不完美越狱”,ios10以上的系统目前公开的工具只能实现非完美越狱。

1.1 越狱工具

  • uncOverunc0ver.dev/,这是目前使用频率最高的越狱工具,而且越狱后应用商店是熟悉的cydia,最最方便的是可以很方便的恢复苹果原系统,所以下面就用这个工具为例,说一下越狱步骤和注意点。
  • Odysseytheodyssey.dev/,这个工具感兴趣的可以玩一玩,注意越狱的时候先断开网络

1.2越狱步骤

  • 下载uncOver越狱工具ipa包。 image.png
  • 重签名uncOver包安装进手机(注意这里不需要砸壳,只有appstore里的应用才需要砸壳)。安装uncOver进手机,可以使用uncOver网站上的方法,也可以使用这里提供的appSign.sh脚本进行重签名。新建一个空工程demo,把appSign.sh拖进工程,同时新建一个APP空文件夹,把uncOver.ipa放进此文件夹。如图所示 image.png 首先xcode运行demo,目的是先把描述文件安装进手机,重签名就是用这个描述文件对uncOver重签名,所以这个描述文件在手机里必须先存在。然后xcode添加Run Script,把appSign.sh添加进去,xcode运行demo,此时就把uncOver安装进手机了。 image.png appSign.sh脚本如下
# ${SRCROOT} 它是工程文件所在的目录
TEMP_PATH="${SRCROOT}/Temp"
#资源文件夹,我们提前在工程目录下新建一个APP文件夹,里面放ipa包
ASSETS_PATH="${SRCROOT}/APP"
#目标ipa包路径
TARGET_IPA_PATH="${ASSETS_PATH}/*.ipa"
#清空Temp文件夹
rm -rf "${SRCROOT}/Temp"
mkdir -p "${SRCROOT}/Temp"
#----------------------------------------
# 1. 解压IPATemp下
unzip -oqq "$TARGET_IPA_PATH" -d "$TEMP_PATH"
# 拿到解压的临时的APP的路径
TEMP_APP_PATH=$(set -- "$TEMP_PATH/Payload/"*.app;echo "$1")
# echo "路径是:$TEMP_APP_PATH"
#----------------------------------------
# 2. 将解压出来的.app拷贝进入工程下
# BUILT_PRODUCTS_DIR 工程生成的APP包的路径
# TARGET_NAME target名称
TARGET_APP_PATH="$BUILT_PRODUCTS_DIR/$TARGET_NAME.app"
echo "app路径:$TARGET_APP_PATH"
rm -rf "$TARGET_APP_PATH"
mkdir -p "$TARGET_APP_PATH"
cp -rf "$TEMP_APP_PATH/" "$TARGET_APP_PATH"
#----------------------------------------
# 3. 删除extension和WatchAPP.个人证书没法签名Extention
rm -rf "$TARGET_APP_PATH/PlugIns"
rm -rf "$TARGET_APP_PATH/Watch"
#----------------------------------------
# 4. 更新info.plist文件 CFBundleIdentifier
#  设置:"Set : KEY Value" "目标文件路径"
/usr/libexec/PlistBuddy -c "Set :CFBundleIdentifier $PRODUCT_BUNDLE_IDENTIFIER" "$TARGET_APP_PATH/Info.plist"
#----------------------------------------
# 5.MachO文件上执行权限
# 拿到MachO文件的路径
APP_BINARY=`plutil -convert xml1 -o - $TARGET_APP_PATH/Info.plist|grep -A1 Exec|tail -n1|cut -f2 -d\>|cut -f1 -d\<`
#上可执行权限
chmod +x "$TARGET_APP_PATH/$APP_BINARY"
#----------------------------------------
# 6. 重签名第三方 FrameWorks
TARGET_APP_FRAMEWORKS_PATH="$TARGET_APP_PATH/Frameworks"
if [ -d "$TARGET_APP_FRAMEWORKS_PATH" ];
then
for FRAMEWORK in "$TARGET_APP_FRAMEWORKS_PATH/"*
do
#签名
/usr/bin/codesign --force --sign "$EXPANDED_CODE_SIGN_IDENTITY" "$FRAMEWORK"
done
fi
#注入 这里如果需要注入自己的破解库,可以放开,重签名不需要
#yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/wgyHook.framework/wgyHook"
#yololib "$TARGET_APP_PATH/$APP_BINARY" "Frameworks/libwgy.dylib"
  • 断开xcode,重新运行uncOver,设置中勾选安装openssh插件(openssh插件可以在越狱后安装也可以在这里勾选,不安装该插件没法连接越狱手机),点击越狱按钮开始越狱,越狱过程会重启设备,越狱成功后看手机里是否有Cydia商店,打开该商店不崩溃的话就越狱成功了。注意:uncOver7.0.2的版本总提示安装一个Unveil Security App,不安装就越不了,换成6.0.2的就成功了,有知道的朋友留言。

提示:提供几个安装插件的源

  • 蜜蜂源:apt.cydiami.com
  • 雷锋源:atp.abcydia.com
  • Bingner:atp.bingner.com

1.3 openSSH

越狱成功之后,我们需要安装openssh插件跟手机通讯,可以在越狱的时候勾选安装,也可以在Cydia中安装该插件。OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现。 SSH协议可以用来进行远程控制,或在计算机之间传送文件。

1.3.1 通过wifi连接手机

image.png ssh通过wifi登录手机过程如上图所示,第一次请求连接手机时,手机端将公钥发送给mac端,mac端拿着公钥加密密码,手机端用私钥解密密码校验权限。只有理解其原理,才不是一个代码搬运工。

  • ssh 用户名@手机IP地址。如$ssh root@192.168.31.231。注意手机和mac电脑必须是同一个网段。通过wifi连接手机,其实默认连接的是手机上的22端口,等价于 ssh -p 22 root@192.168.31.231。
  • 默认密码:alpine image.png 注意手机下有两个用户
  • Root 用户:最高权限用户,可以访问任意文件,我们自己一般使用root用户。
  • Mobile用户:普通用户,只能访问该用户目录下文件/var/Mobile

mac端保存着手机端的公钥,如下图.ssh目录下known_hosts文件就记录了每台手机ip地址对应的公钥。 image.png ssh连接手机,进入/etc/ssh目录,有个ssh_host_rsa_key.pub文件,如下图所示,该公钥就是发送给Mac端的公钥。 image.png

快捷指令

每次登录连接都要指定ip地址和用户名太麻烦。在家目录里隐藏文件夹.ssh目录下新建config文件,比如我这里有两台越狱设备,一台6是完美越狱的,一台6s是非完美越狱的,可以配置如下。 image.png 如果ip地址变了可以修改config文件,ssh登录的时候直接输入Host别名就行了。

1.3.2 通过usb连接手机

ssh通过usb连接手机校验登录权限的原理跟wifi是一样的,但是需要开启一个本地端口跟手机的22端口建立映射关系的服务,那么访问本地端口就是访问手机的22端口。我们可以使用libimobiledevice工具或者使用Mac端自带的usbmuxd服务开启端口映射服务,这里以libimobiledevice和本地端口12345为例。

  • 安装libimobiledevice工具,$ brew install libimobiledevice
  • 映射端口,iproxy 12345 22
  • ssh -p 12345 root@127.0.0.1。ssh连接本地的12345,由于做了端口映射,所以会通过usb连接对面设备的22端口。

快捷指令

大多数时候我们是使用USB连接的,毕竟调试的时候会更顺畅一点,wifi在很多时候会卡,所以我们必须搞一个USB快捷登录指令。我们可以在家目录下新建一个文件夹,比如wgyShell,在该文件夹下新建几个shell脚本,比如usbConnect.sh(开启端口映射),6.sh(连接iphone6设备),6s.sh(连接iphone6s设备),如下图所示。当需要连接iphone6设备时,先sh usbConnect.sh,然后再运行sh 6.sh

image.png

1.3.3 免密登录

image.png ssh每次连接手机都需要设置密码太麻烦,可以设置免密登录。免密登录的原理和wifi以及usb不一样,它是把Mac端公钥存在手机里,登录时手机发送一个随机字符串给Mac,Mac用本地的私钥加密后发送给手机端,手机端用公钥解密。免密登录指令如下。

  • $ssh-copy-id 用户名 @服务器IP

2.0 砸壳

提交给Appstore发布的App,都经过官方保护而加密,这样可以保证机器上跑的应用是苹果审核过的,也可以管理软件授权。经过App Store加密的应用,我们无法通过Hopper等反编译静态分析,也无法Class-Dump,在逆向分析过程中需要对加密的二进制文件进行解密才可以进行静态分析,这一过程就是大家熟知的砸壳(脱壳),注意只有从Appstore下载的应用才是加壳的,其他例如企业证书打包的应用是不需要砸壳就直接可以重签名的image.png ios应用运行原理如上图,APP加载进内存之前系统就把应用给脱壳了,所以我们一般讲的砸壳都是动态砸壳,就是从运行在进程内存空间中的可执行程序映像(image)入手。目前一般使用三种工具砸壳Clutch、dumpdecrypted、frida-ios-dump,下面分别玩一下。

2.1 Clutch

Clutch这个砸壳工具已经停更很久了,貌似只能在ios10以下的完美越狱的手机上使用,由于这个工具太经典了,所以还是试着玩一下。步骤如下

  • 官网: github.com/KJCracks/Cl…
  • 下载最新的发布版本进Mac电脑,目前是Clutch 2.0.4
  • scp -P 12345 ./Clutch-2.0.4 root@127.0.0.1:/usr/root/Clutch。开启usb端口映射,ssh拷贝Clutch进手机root目录下,注意这里的P是大写。
  • chmod +x Clutch,给Clutch添加可执行权限
  • ./Clutch -i
  • ./Clutch -d 应用id
  • scp -P 12345 root@127.0.0.1:砸壳后的路径 本地mac路径。砸壳成功后从手机上拷贝进电脑。 image.png 这里以砸微信壳为例,砸壳成功会出现以下提示,根据砸壳路径拷贝进电脑,也可以使用ifunbox拷贝进电脑。 image.png otool -l macho文件 | grep crypt;命令查看是否砸壳成功,cryptid=0表示砸壳成功image.png

2.2 dumpdecrypted

dumpdecrypted的使用频率也比较高,完美非完美越狱手机上都可以使用,它的原理是修改环境变量DYLD_INSERT_LIBRARIES实现砸壳,好像ios9.0以后的系统必须切换到mobile用户,并且给dumpdecrypted添加可执行权限,这里以iphone6s ios14.2系统为例还是砸壳微信,步骤如下。

  • 官网 :github.com/stefanesser… 直接Git Clone
  • dumpdecrypted文件夹下终端运行make,编译生成动态库dumpdecrypted.dylib
  • scp -P 12345 ./dumpdecrypted.dylib mobile@localhost:/var/mobile/dumpdecrypted.dylib。开启usb端口映射,ssh拷贝dumpdecrypted.dylib进手机mobile目录下,注意这里的P是大写。
  • ps -A;查看正在运行的进程,寻找需要砸壳的应用,可以用ps -A | grep Wechat筛选快速查找
  • DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib 沙盒路径

但是很遗憾一直砸不成功,网上找了很多方法都不行,有知道了网游可以给我留言。 image.png

3.3 frida-ios-dump

frida-ios-dump感觉是目前最好用的砸壳工具,完美越狱和非完美越狱都可以使用,既快捷又简单,详细步骤如下。

Mac端

  • python安装,Mac自带python2,也可以自己安装python3,我是安装的python3,brew install python3
  • pip安装,sudo easy_install pip,python3的话可以安装pip3
  • sudo pip install frida-tools。安装frida-tools工具,如果提示目录权限错误可以使用sudo-H pip install frida-tools命令安装
  • sudo git clone github.com/AloneMonkey…。下载frida-ios-dump脚本文件,也可以去github上下载。
  • 终端进入刚刚下载好的frida-ios-dump文件夹下执行命令sudo pip install -r requirements.txt –upgrade,成功后mac端frida环境就构建好了

手机端

  • 添加源 build.frida.re
  • 安装Frida,如果安装失败就重新安装直到成功

使用

  • 开启usb端口映射
  • 进入frida-ios-dump文件夹下打开dump.py文件,修改usb连接设备的端口、Host等信息,特别注意如果使用pip3安装frida-tools工具的话,也需要修改dump.py里对应的python版本,例如下面所示 image.png
  • 手机端打开APP,进入frida-ios-dump目录下,终端运行 ./dump.py 应用displayname/应用bundleid就可以砸壳了,注意必须是应用的displayname或者bundleid才可以砸壳,例如砸壳微信“./dump.py 微信”,如下所示,砸壳成功之后会把砸完壳的包放进frida-ios-dump文件夹下 image.png

image.png

常用命令

  • scp:拷贝命令,如果是拷贝mac文件进手机,如“scp -P 12345 mac文件路径 root@127.0.0.1:/var/root”;如果是拷贝手机文件进mac,如“scp -P 12345 root@127.0.0.1:手机文件路径 电脑文件路径”;如果拷贝的是文件夹 scp -r -P
  • ps -A:正在运行的进程 “ps -A | grep 进程名”可以筛选,我一般使用这个命令查看应用沙盒路径
  • otool -l 可执行文件 | grep crypt:mac端可以使用这个命令查看Macho是否已经脱壳
  • ls -l:查看文件权限
  • frida-ps -U:Mac端查看连接USB手机里正在运行的进程
  • frida-ps -Uai:Mac端查看连接USB手机里所有安装的应用,我一般使用这个命令获取应用的displayname或者bundleid进行砸壳

控制台中文乱码

ssh连接上手机后,终端是不可以输入中文的,如下输入中文会乱码 image.png 新建一个.inputrc文件,内容如下

set convert-meta off
set output-meta on
set meta-flag on
set input-meta on

scp拷贝文件进/var/root目录,然后终端就可以输入中文了 image.png

3.0 Class-dump

可以将Objective-C编写的二进制文件反编出头文件,需要是已砸壳的二进制文件,导出头文件就可以静态分析应用,class-dump网上教程多的很,这里简单说下步骤

  • 官网下载class-dump并解压 stevenygard.com/projects/cl…
  • ./class-dump -H Macho文件 -o 需要导出的头文件。可以把class-dump路径配置在环境变量里,这样就可以直接使用class-dump,而不需要像我这样需要进入class-dump所在目录

image.png