23-应用砸壳

前言

要想破解别人的App,第一步就是拿到ipa包进行砸壳砸壳也称作软件脱壳,顾名思义,就是对软件加壳的操作,把软件上存在的壳去掉(即解密)。

一、砸壳原理

1.1 应用加壳(加密)

提交给AppStore发布的App,都经过官方保护而加密,这样可以保证机器上跑的应用是苹果审核过的,也可以管理软件授权。

经过AppStore加密的应用,我们无法通过Hopper等反编译静态分析,也无法Class-Dump

在逆向分析过程中,需要对加密的二进制文件进行解密,然后才能进行静态分析,这一过程就是大家熟知的砸壳(脱壳)。

App Store是通过对称加密(AES)加壳的,为了速度和效率。

1.2 应用砸壳(解密)

  • 静态砸壳 👉🏻 在已经掌握和了解到了壳应用的加密算法和逻辑后,在不运行壳应用程序的前提下,将壳应用程序进行解密处理。静态脱壳的方法难度大,而且加密方发现应用被破解后,就可能会改用更加高级和复杂的加密技术。
  • 动态砸壳 👉🏻 从运行在进程内存空间中的可执行程序映像(image)入手,将内存中的内容进行转储(dump)处理来实现脱壳处理。这种方法实现起来相对简单,且不必关心使用的是何种加密技术。

在iOS系统中,应用砸壳所使用的都是动态砸壳技术。

1.3 iOS应用运行原理

  1. 加了壳的程序CPU是读不懂的,只有解密后才能载入内存。
  2. iOS系统内核会对MachO进行脱壳,所以我们只需要将解密后的MachO拷贝出来。
  3. 非越狱手机做不到跨进程访问,越狱后拿到root权限就可以访问了。这就是砸壳的原理。(按页加解密-代码段)

二、Clutch

Clutch是由KJCracks开发的一款开源砸壳工具。工具支持iPhone、iPod Touch、iPad,该工具需要使用iOS8.0以上的越狱手机应用。

⚠️注意:Clutch属于命令行工具,适用于完美越狱的设备。如果是非完美越狱,砸壳时可能会出现问题

2.1 Clutch安装

  1. Clutch官网地址,直接找到Release版本👇🏻
  1. 下载最新的Clutch-2.0.4👇🏻
  1. 使用file命令,查看Clutch所支持的设备有哪些👇🏻
file Clutch-2.0.4
-------------------------
Clutch-2.0.4: Mach-O universal binary with 3 architectures: [arm_v7:Mach-O executable arm_v7] [arm_v7s:Mach-O executable arm_v7s] [arm64:Mach-O 64-bit executable arm64]
Clutch-2.0.4 (for architecture armv7): Mach-O executable arm_v7
Clutch-2.0.4 (for architecture armv7s):    Mach-O executable arm_v7s
Clutch-2.0.4 (for architecture arm64): Mach-O 64-bit executable arm64

可见,Clutch是通用二进制文件,可以支持不同CPU架构的设备。

2.2 Clutch使用

  1. usb端口连接手机,使用usbConnect.shusb-iphone8.sh,具体参考上篇文章
  1. 再新增终端窗口,将Clutch-2.0.4拷贝到手机的/var/root目录下,并且重命名为Clutch
scp -P 12345 ./Clutch-2.0.4 root@127.0.0.1:/var/root/Clutch
  • 使用-P参数,指定USB连接的映射端口,传输速度更快
  • 前面是本地文件路径
  • 后面是手机路径IP地址要和登录时设置的一致
  • 拷贝的同时,可以修改名称
  • 如果拷贝的是文件夹,增加-r参数
  1. Clutch增加可执行权限
chmod +x Clutch
  1. 查看Clutch的用法
./Clutch
-------------------------
Usage: Clutch [OPTIONS]
-b --binary-dump <value> Only dump binary files from specified bundleID
-d --dump <value>        Dump specified bundleID into .ipa file
-i --print-installed     Print installed applications
  --clean               Clean /var/tmp/clutch directory
  --version             Display version and exit
-? --help                Display this help and exit
-n --no-color            Print with colors disabled
  • -b 👉🏻 仅从指定的bundleID转储二进制文件
  • -d 👉🏻 将指定的绑定文件转储到.ipa文件中
  • -i 👉🏻 打印安装的应用程序

例如查看安装的应用程序👇🏻

./Clutch -i
-------------------------
1:   老司机汽车 <com.driver.feng>
2:   爱思加强版 <com.pd.A4Player>
3:   微信 <com.tencent.xin>

⚠️注意:这里列出的软件,都可以进行砸壳

砸壳演示

选择对WeChat进行砸壳👇🏻

./Clutch -d 3
-------------------------
com.tencent.xin contains watchOS 2 compatible application. It's not possible to dump watchOS 2 apps with Clutch 2.0.4 at this moment.
Zipping WeChat.app
ASLR slide: 0x1000b0000
Dumping <WeChatNotificationServiceExtension> (arm64)
Patched cryptid (64bit segment)
Writing new checksum
...
DONE: /private/var/mobile/Documents/Dumped/com.tencent.xin-iOS9.0-(Clutch-2.0.4).ipa
Finished dumping com.tencent.xin in 44.8 seconds

Clutch同样使用的是动态砸壳,所以理论上,砸壳前应该启动WeChat,但是实际上并不需要,因为当Clutch发现目标App未启动,会自动将其启动。

砸壳成功,给出.ipa包的路径👇🏻

Device->private->var->mobileDocuments->Dumped
  1. 将砸壳后的.ipa包,导出到Mac电脑
  • root目录下,连续2次cd ../进入父文件夹,找到Device目录👇🏻

  • 然后执行拷贝微信的.ipa包到Mac电脑

scp -P 12345 root@localhost://Device->private->var->mobileDocuments->Dumped/com.tencent.xin-iOS9.0-(Clutch-2.0.4).ipa
  1. 解压出MachO文件,查看加密状态👇🏻
otool -l WeChat | grep crypt
-------------------------
    cryptoff 16384
   cryptsize 107446272
     cryptid 0

cryptid为0,处于未加密状态,证明WeChat砸壳成功!🍺🍺🍺🍺🍺🍺

三、dumpdecrypted

接着我们看看另一个砸壳工具 👉🏻 dumpdecrypted。它是Github开源工具,通过建立一个名为dumpdecrypted.dylib的动态库,插入目标应用实现脱壳。

Clutch一样,都是砸壳领域的经典插件。它们同样岁月沧桑,适用于完美越狱的设备。如果是非完美越狱,砸壳时可能会出现问题

3.1 插入自定义动态库

在演示dumpdecrypted砸壳之前,我们看看如何在手机中插入一个自定义的动态库

  1. 创建Inject动态库,添加InjectCode类,写入代码👇🏻
#import "InjectCode.h"

@implementation InjectCode

+(void)load {
   NSLog(@"\n\n\n\n\n🍺🍺🍺🍺🍺\n\n\n\n\n");
}

@end
  1. 编译项目,生成Inject.framework
  1. Inject.framework拷贝到手机的/var/root目录下👇🏻
scp -r -P 12345 ./Inject.framework root@127.0.0.1:/var/root

Inject.framework是文件夹,所以需要加上-r参数,拷贝目录下所有文件。

  1. USB连接手机
usb-iphone8.sh
  1. 查看WeCath进程
ps -A | grep WeChat
  1. 使用DYLD_INSERT_LIBRARIES,将Inject.framework插入到WeCath进程
DYLD_INSERT_LIBRARIES=Inject.framework/Inject /var/containers/Bundle/Application/B9046860-DDDA-44B4-AFF5-AF20FFA6FC9D/WeChat.app/WeChat

上图可见,出现了Killed: 9的错误,因为👇🏻

iOS 9.1以上系统,不允许root用户插入动态库.

解决方法 👉🏻 切换成mobile用户,才可执行成功。

su mobile
Arons-iPhone8:~ mobile$ DYLD_INSERT_LIBRARIES=Inject.framework/Inject /var/containers/Bundle/Application/B9046860-DDDA-44B4-AFF5-AF20FFA6FC9D/WeChat.app/WeChat
2021-06-05 18:32:07.606 WeChat[16797:7420505]




🍺🍺🍺🍺🍺




注入的代码在WeChat进程中执行成功!

3.2 dumpdecrypted安装

现在我们来安装下dumpdecrypted 👉🏻 官网链接

  1. 克隆dumpdecrypted
git clone https://github.com/stefanesser/dumpdecrypted.git
  1. 进入dumpdecrypted目录,执行make命令

编译生成动态库dumpdecrypted.dylib👇🏻

3.3 dumpdecrypted砸壳演示

接下来,我们来使用dumpdecrypted.dylib砸壳。

  1. dumpdecrypted.dylib拷贝到手机的/var/root目录下
scp -P 12345 ./dumpdecrypted.dylib root@127.0.0.1:/var/root
  1. 使用DYLD_INSERT_LIBRARIES,将dumpdecrypted.dylib插入到WeCath进程
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/B9046860-DDDA-44B4-AFF5-AF20FFA6FC9D/WeChat.app/WeChat
-------------------------
objc[5571]: Class MarsReachability is implemented in both /private/var/mobile/Containers/Bundle/Application/B1661526-3E43-4397-9E86-A9735DE89AE1/WeChat.app/Frameworks/mars.framework/mars and /private/var/mobile/Containers/Bundle/Application/B1661526-3E43-4397-9E86-A9735DE89AE1/WeChat.app/Frameworks/matrixreport.framework/matrixreport. One of the two will be used. Which one is undefined.
objc[5571]: Class WCLogger is implemented in both /System/Library/Frameworks/WatchConnectivity.framework/WatchConnectivity and /var/containers/Bundle/Application/B9046860-DDDA-44B4-AFF5-AF20FFA6FC9D/WeChat.app/WeChat. One of the two will be used. Which one is undefined.
mach-o decryption dumper
...
[+] Closing original file
[+] Closing dump file

当前目录下,导出WeChat.decrypted文件,是砸壳后的MachO文件。

⚠️注意:需要将dumpdecrypted.dylib拷贝到mobile路径中,为了导出有的权限。dumpdecrypted.dylib会导出和自己同一目录。

  1. WeChat.decrypted文件,导出到Mac电脑,otool查看是否加密👇🏻
otool -l WeChat.decrypted | grep crypt
-------------------------
WeChat.decrypted:
    cryptoff 16384
   cryptsize 107446272
     cryptid 0

cryptid为0,处于未加密状态,证明导出的WeChat.decrypted砸壳成功🍺🍺🍺🍺🍺🍺

版本问题

使用dumpdecrypted工具,要求Xcode SDK与越狱设备iOS SDK版本一致!

例如:对iOS 9.1的设备插入dumpdecrypted.dylib,就要使用老版本Xcodedumpdecrypted进行make。否则在插入dumpdecrypted.dylib时,会出现以下错误👇🏻

DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/B1661526-3E43-4397-9E86-A9735DE89AE1/WeChat.app/WeChat
-------------------------
dyld: Symbol not found: ___chkstk_darwin
 Referenced from: dumpdecrypted.dylib
 Expected in: /usr/lib/libSystem.B.dylib
in dumpdecrypted.dylib
Trace/BPT trap: 5

四、frida-ios-dump

frida-ios-dump工具是基于frida提供的强大功能,通过注入js实现内存dump,然后通过python自动拷贝到电脑生成ipa文件

frida-ios-dump支持众多版本的系统,非完美越狱的环境也可使用,是目前最常用、最稳定的砸壳工具!

4.1环境配置

4.1.1 pip安装

pip的安装和python版本有关👇🏻

  • python安装使用pip
  • python3安装使用pip3
  1. 查看python版本
python --version
-------------------------
Python 2.7.16

查看python3版本

python3 --version
-------------------------
Python 3.8.2

查看pip版本

pip -V

查看pip3版本

pip3 -V
  1. 使用easy_install命令,安装pip
sudo easy_install pip

使用easy_install的方式,我没有安装成功。pip和pip3都尝试过,安装后一直提示版本问题,无法使用。

  1. 使用get-pip安装
git clone https://github.com/pypa/get-pip.git

指令执行完成后,我们来到public目录下查看👇🏻

  1. 使用python3执行get-pip.py脚本,安装pip3
python3 get-pip.py

4.1.2 frida安装

  • iOS手机端👇🏻
  1. 打开Cydia,添加源:https://build.frida.re

  2. 安装Frida

  • Mac电脑
sudo pip3 install frida-tools

⚠️注意:可能会出现警告you may want sudo's -H flag

上图意思是目录不归当前用户所有。请检查该目录的权限和所有者,需要sudo的-H标志。

sudo -H 👉🏻 set-home 👉🏻 将HOME变量设为目标用户的主目录

sudo -H pip3 install frida-tools

⚠️注意:出现Uninstalling a distutils installed project (six)提示,执行以下命令👇🏻

sudo pip3 install frida --upgrade --ignore-installed six

4.1.3 frida使用

  • 查看Mac电脑的进程👇🏻
frida-ps
  • USB连接设备,查看手机上的进程👇🏻
frida-ps -U

⚠️注意:如果执行frida-ps -U指令后没反应 👇🏻
进入frida-ios-dump目录,然后执行sudo pip3 install -r requirements.txt --upgrade即可!

  • 进入WeChat进程
frida -U 微信
  • 输出WeChat内存中的对象
ObjC
frida优缺点
  • frida擅长将js和python脚本,注入到目标程序并执行,它并不适合作为动态分析的工具使用。
  • frida-ios-dump就是将dump.py,通过frida注入目标程序,从而实现应用砸壳。

4.2 frida-ios-dump的使用

  1. 在Mac电脑,配置frida-ios-dump 右边官网链接

  2. 克隆frida-ios-dump

sudo git clone https://github.com/AloneMonkey/frida-ios-dump

查看frida-ios-dump目录

  1. 安装依赖
sudo pip3 install -r requirements.txt --upgrade

4.2.1出现的错误

  • prompt-toolkit版本不兼容问题
frida-tools 1.2.2 has requirement prompt-toolkit<2.0.0,>=0.57, but you'll have prompt-toolkit 2.0.7 which is incompatible.

解决 👉🏻 需要降低prompt-toolkit版本👇🏻

  1. 卸载prompt-toolkit
sudo pip uninstall prompt-toolkit
  1. 安装指定版本
sudo pip install prompt-toolkit==1.0.6
  • -H警告,同样使用sudo -H解决
sudo -H pip3 install -r requirements.txt --upgrade

4.2.2 frida-ios-dump砸壳演示

  1. 进入frida-ios-dump目录,执行dump.py脚本
./dump.py 微信
-------------------------
Traceback (most recent call last):
 File "./dump.py", line 11, in <module>
   import frida
ImportError: No module named frida

遇到上述问题,先检查frida-ios-dump目录的读写权限,没有则加一个👇🏻

  1. 打开dump.py文件,需要将python修改为python3👇🏻
  1. 再执行
./dump.py 微信
-------------------------
[Errno None] Unable to connect to port 2222 on 127.0.0.1, ::1 or fe80::1
Try specifying -H/--hostname and/or -p/--port

还是执行失败了,因为在dump的时候,会将ipa包导出到Mac电脑,此时需要USB连接设备。所以在dump之前,应该先执行usbConnect.sh脚本

  1. 检查dump.py文件中的User、Password、Host、Port,是否和usbConnect.sh脚本中的配置一致, 修改Port,将2222修改为12345👇🏻
  1. 再次执行dump.py脚本
./dump.py 微信
-------------------------
Start the target app 微信
Dumping 微信 to /var/folders/jl/d06jlfkj2ws74_5g45kms07m0000gn/T
[frida-ios-dump]: ilink_network.framework has been loaded.
...
Generating "微信.ipa"

执行成功后,会在frida-ios-dump目录下,成功导出微信.ipa👇🏻

可以将其配置为环境变量,方便使用!

五、iOS终端支持中文

iOS终端默认是不支持中文的。解决方案👇🏻

  1. 创建.inputrc隐藏文件,写入以下代码👇🏻
set convert-meta off
set output-meta on
set meta-flag on
set input-meta on
  1. .inputrc文件,拷贝到手机的/var/root目录下
scp -P 12345 .inputrc root@localhost:/var/root
  1. iOS终端输入中文验证👇🏻

总结

  1. 砸壳原理
    • 应用加壳 👉🏻 一般应用为了防止反编译分享,会对应用进行加密(加壳)
    • 应用砸壳 👉🏻 砸壳(脱壳)就是解密的过程
      静态砸壳 👉🏻 已经知道了解密方式,不需要运行应用的情况下,直接解密
      动态砸壳 👉🏻 在应用启动后,从内存中找到应用的位置,dump(内存中导出)数据
  2. Clutch
    • 是一个命令行工具
    • Clutch -i 👉🏻 查看安装的应用程序
    • Clutch -d 应用编号 👉🏻 导出ipa包
  3. dumpdecrypted
    • 是一个动态库,不能独立运行
    • 通过DYLD_INSERT_LIBRARIES环境变量,插入动态库,载入某个进程
    • DYLD_INSERT_LIBRARIES = 库路径(库的可执行文件) MachO路径
    • iOS 9.1以上系统,不允许root用户使用DYLD_INSERT_LIBRARIER方式插入动态库,需要su mobile切换成mobile用户
  4. frida-ios-dump
    • 利用frida加载脚本砸壳
    • MaciPhone都需要安装frida
    • 下载frida-ios-dump脚本工具
    • 执行dump.py,参数是应用名称BundleID
  5. iOS终端支持中文
    • 创建.inputrc隐藏文件,写入代码
    • 拷贝到手机的/var/root目录下
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容

  • 软件脱壳,顾名思义,就是对软件加壳的逆操作,把软件上存在的壳去掉(解密)。 砸壳原理 应用加壳(加密)提交给App...
    帅驼驼阅读 4,709评论 2 5
  • 下载的非越狱应用都是经过加密的,加密后可以保证一定的安全性,但是对于逆向开发的人来说,加密应用无法进行静态分析,也...
    绿叶竹林阅读 1,141评论 0 2
  • 概述 软件脱壳,顾名思义,就是对软件加壳的逆操作,把软件上存在的壳去掉(解密)。 砸壳原理 应用加壳(加密)提交给...
    没八阿哥的程序阅读 6,912评论 0 2
  • 一、砸壳 软件脱壳,顾名思义,就是对软件加壳的逆操作,把软件上存在的壳去掉(解密)。 1.1 砸壳原理 1.1.1...
    HotPotCat阅读 9,118评论 0 2
  • 砸壳 提交给Appstore发布的App,都经过官方保护而加密,这样可以保证机器上跑的应用是苹果审核过的,也可以管...
    king_jensen阅读 1,299评论 0 1