软件脱壳,顾名思义,就是对软件加壳的逆操作,把软件上存在的壳去掉(解密)。
1、砸壳原理
1.1、应用加壳(加密)
提交给 Appstore
发布的 App
,都经过官方保护而加密,这样可以保证机器上跑的应用是苹果审核过的,也可以管理软件授权。经过 App Store
加密的应用,我们无法通过 Hopper
等反编译静态分析,也无法 Class-Dump
,在逆向分析过程中需要对加密的二进制文件进行解密才可以进行静态分析,这一过程就是大家熟知的砸壳(脱壳)
1.2、应用砸壳(解密)
1.2.1、静态砸壳
静态砸壳就是在已经掌握和了解到了壳应用的加密算法和逻辑后在不运行壳应用程序的前提下将壳应用程序进行解密处理。静态脱壳的方法难度大,而且加密方发现应用被破解后就可能会改用更加高级和复杂的加密技术
1.2.2、动态砸壳
动态砸壳就是从运行在进程内存空间中的可执行程序映像(image)入手,来将内存中的内容进行转储(dump)处理来实现脱壳处理。这种方法实现起来相对简单,且不必关心使用的是何种加密技术。
2、砸壳
2.1、Clutch
Clutch
是由 KJCracks
开发的一款开源砸壳工具。工具支持iPhone
、iPod Touch
、iPad
,该工具需要使用 iOS8.0
以上的越狱手机应用。
1、将 Clutch
拷贝到手机目录下
scp -P 12345 ./Clutch-2.0.4 root@localhost:/usr/bin/Clutch
Enter passphrase for key '/Users/shiji/.ssh/id_rsa':
Clutch-2.0.4 100% 1204KB 30.8MB/s 00:00
2、进入手机目录 /usr/bin
下
chmod +x Clutch
3、终端输入 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
4、查看需要砸壳的 App
的 bundleID
Clutch -i
...
7: 微信 <com.tencent.xin>
···
5、对 WeChat
进行砸壳
Clutch -d 7
6、将 WeChat
拷贝到电脑
scp -P 12345 root@localhost:/var/containers/Bundle/Application/85591C5D-5029-414F-9DC4-79C0DACF8518/WeChat.app/WeChat ./WeChat
2.2、dumpdecrypted
2.2.1、DYLD_INSERT_LIBRARIES
注入
1、新建 Inject.framework
编译生成
Inject.framework
2、在当前目录拷贝
Inject.framework
到 /var/root
scp -r -P 12345 Insert.framework root@localhost:/var/root
Enter passphrase for key '/Users/shiji/.ssh/id_rsa':
Insert 100% 66KB 10.5MB/s 00:00
Insert.h 100% 425 282.0KB/s 00:00
module.modulemap 100% 93 72.0KB/s 00:00
Info.plist 100% 784 531.7KB/s 00:00
3、usb
端口连接手机
ssh -p 12345 root@localhost
4、切换 mobile
用户
su mobile
5、查看当前 InjectDemo
的文件路径
ps -A | grep InjectDemo
9561 ?? 0:00.16 /var/containers/Bundle/Application/48514F00-4EA0-4D27-B007-AB0D52B9FEEB/InjectDemo.app/InjectDemo
9563 ttys000 0:00.01 grep InjectDemo
6、注入动态库
DYLD_INSERT_LIBRARIES=Insert.framework/Insert /var/containers/Bundle/Application/48514F00-4EA0-4D27-B007-AB0D52B9FEEB/InjectDemo.app/InjectDemo
13:29:05.033 InjectDemo[9564:1084251] 注入成功--------------------------------------
备注:
InjectDemo
是自己编译运行的Demo
,Clutch
微信和抖音都没有成功,据说只支持iOS12
以下的版本
2.2.2、dumpdecrypted
1、在 Cydia
应用中搜索 Cycript
安装
2、ssh
登录手机
ssh -p 12345 root@localhost
3、切换 mobile
用户
su mobile
4、查看砸壳APP路径
ps -e | grep WeChat
9363 ?? 372:47.00 /var/containers/Bundle/Application/85591C5D-5029-414F-9DC4-79C0DACF8518/WeChat.app/WeChat
10861 ?? 0:03.62 /var/containers/Bundle/Application/85591C5D-5029-414F-9DC4-79C0DACF8518/WeChat.app/WeChat
10884 ttys000 0:00.01 grep WeChat
5、看 APP
的 Documents
路径:先用 cycript -p AppName
钩住 APP
① cycript -p WeChat
② NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
["/var/mobile/Containers/Data/Application/0015C950-12C5-40B6-8F6D-E816C43F24E0/Documents"]
6、将 dumpdecrypted.dylib
拷贝到手机 app
目录下
scp -P 12345 dumpdecrypted.dylib mobile@localhost:/var/mobile/Containers/Data/Application/0015C950-12C5-40B6-8F6D-E816C43F24E0/Documents/
执行到此处失败了,没查明原因,可能也是手机版本过高的原因
最终会在 /var/mobile/
下面生成脱壳App
2.2.3、frida-ios-dump
该工具基于 frida
提供的强大功能通过注入js
实现内存 dump
然后通过 python
自动拷贝到电脑生成 ipa
文件。
1、安装 frida
工具
sudo pip3 install frida-tools
安装过程可能会遇到以下情况:
- 目录不归当前用户所有。请检查该目录的权限和所有者.需要
sudo
的-H
标志 -
set-home
将HOME
变量设为目标用户的主目录
2、添加源,打开 Cydia
选择软件源,点击编辑-添加
https://build.frida.re
选择变更,点击 Frida
安装
3、电脑终端,查看进程
frida-ps
进入到USB
进程
frida-ps -U
...
9363 微信
10861 微信
11916 抖音
12361 百度网盘
进入到微信,可以打印出当前进程的所有对象
frida -U 微信
4、安装 frida-ios-dump
相关内容
sudo pip3 install -r requirements.txt --upgrade
如果在安装的过程中出现错误
ERROR: Could not build wheels for cryptography which use PEP 517 and cannot be installed directly
需要升级一下 pip3
curl https://bootstrap.pypa.io/get-pip.py | python3
5、./dump.py 微信
在当前目录下回生成 微信.ipa
6、查看 ipa
包
解压 微信.ipa
cd
到当前目录 WeChat.app
otool -l WeChat | grep cryptid
cryptid 0
7、让手机支持中文,将 .inputrc
文件拷贝到手机中
set convert-meta off
set output-meta on
set meta-flag on
set input-meta on
scp -P 12345 .inputrc root@localhost:/var/root/