iOS-逆向22-砸壳

《iOS底层原理文章汇总》
上一篇文章《iOS-逆向21-越狱&OpenSSH》介绍了越狱&OpenSSH,本文介绍砸壳。

图片.png

1.iOS9的系统完美越狱恢复,拷贝unjailbreak.sh到越狱手机根目录下,只是sh unjailbreak.sh手机重启后,恢复为非越狱环境

图片.png

2.砸壳原理

应用加壳(加密)
提交给Appstore发布的App,都经过官方保护而加密,这样可以保证机器上跑的应用是苹果审核过的,也可以管理软件授权。经过App Store加密的应用,我们无法通过Hopper等反编译静态分析,也无法Class-Dump,在逆向分析过程中需要对加密的二进制文件进行解密才可以进行静态分析,这一过程就是大家熟知的砸壳(脱壳)
应用砸壳(解密)
静态砸壳
静态砸壳就是在已经掌握和了解到了壳应用的加密算法和逻辑后在不运行壳应用程序的前提下将壳应用程序进行解密处理。静态脱壳的方法难度大,而且加密方发现应用被破解后就可能会改用更加高级和复杂的加密技术

动态砸壳
动态砸壳就是从运行在进程内存空间中的可执行程序映像(image)入手,来将内存中的内容进行转储(dump)处理来实现脱壳处理。这种方法实现起来相对简单,且不必关心使用的是何种加密技术。

图片.png

越狱的手机能访问进程,从而能获取到进程中的MachO文件,进程中的MachO是没有加密的
图片.png

3.Clutch

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

I.安装,下载Clutch 2.0.4版本,是通用二进制文件
官网

图片.png

II.拷贝Clutch 2.0.4文件到手机中scp -P 12345 ./Clutch-2.0.4 [email protected]:/var/root/Clutch,拷贝的同时改Clutch 2.0.4文件为Clutch
图片.png

III.给Clutch文件增加可执行权限chmod +x Clutch
图片.png

./Clutch -i查看安装的软件
image

IV.砸壳./Clutch -d 2,砸壳抖音
./Clutch -d 4,砸壳QQ,在手机/private/var/mobile/Documents/Dumped路径下有砸壳好的ipa包,很明显如下砸壳失败了
图片.png

V.从越狱手机中拷贝QQ的MachO文件到Mac中

scp -P 12345 [email protected]:/var/mobile/Containers/Bundle/Application/2018C47F-40F6-4FC3-B121-68472B7897EE/QQ.app/QQ ./QQ
image

image

otool -l QQ,查看可执行文件QQ结构


image

越狱插入,不污染三方应用的插件
非越狱的注入

4.在越狱手机中手动插入动态库

I.新建工程,里面注入Inject动态库,拷贝出Inject.framework到新建的工程目录下,再拷贝到手机中

图片.png

image

image

抖音路径:/var/mobile/Containers/Bundle/Application/21CF3978-5308-4420-A7AA-615089512B70/Aweme.app/Aweme
QQ路径:/var/mobile/Containers/Bundle/Application/2018C47F-40F6-4FC3-B121-68472B7897EE/QQ.app/QQ
微信路径:/var/mobile/Containers/Bundle/Application/C4C23D7D-6554-4C76-BE88-D01FECE8B873/WeChat.app/WeChat
抖音极速版路径:/var/mobile/Containers/Bundle/Application/A0CAA998-D2FC-4D91-9A83-384E9ED235C3/AwemeLite.app/AwemeLite
II.注入Inject动态库到目标应用(抖音),在iOS9.3以后插入到哪一个进程都会出现kill 9,要切换成mobile用户
我的iPhone6是iOS9.2.1的系统,root和mobile用户权限都能注入成功!!
DYLD_INSERT_LIBRARIES=Inject.framework/Inject /var/mobile/Containers/Bundle/Application/21CF3978-5308-4420-A7AA-615089512B70/Aweme.app/Aweme
image

image

注入QQ也可以,但会报一个错,注入重签的微信也会报一个错。
DYLD_INSERT_LIBRARIES=Inject.framework/Inject /var/mobile/Containers/Bundle/Application/2018C47F-40F6-4FC3-B121-68472B7897EE/QQ.app/QQ
图片.png

image

换手机试下iPhone 8p,
微信路径:/var/containers/Bundle/Application/65FADAD7-34CF-4EE9-B548-6403C1D757CF/WeChat.app/WeChat
支付宝路径:/var/containers/Bundle/Application/C1ECB91B-F3A7-4C5E-BBE6-4F9A82F83126/AlipayWallet.app/AlipayWallet
InjectDemo路径:/var/containers/Bundle/Application/50A02104-6D24-4B28-BE7D-218EC5E25914/InjectDemo.app/InjectDemo
scp -r -P 12345 Inject.framework root@localhost:/var/root
image

此时注入DYLD_INSERT_LIBRARIES=Inject.framework/Inject /var/containers/Bundle/Application/65FADAD7-34CF-4EE9-B548-6403C1D757CF/WeChat.app/WeChat会报错kill 9错误,因为iPhone 8p是iOS11.0的系统,切换mobile用户su mobile
iOS 9.3以后报错killed:9,切换mobile用户,注入微信还报错,注入支付宝也报错,注入自己的进程InjectDemo成功
图片.png

DYLD_INSERT_LIBRARIES=Inject.framework/Inject /var/containers/Bundle/Application/50A02104-6D24-4B28-BE7D-218EC5E25914/InjectDemo.app/InjectDemo
image

III.越狱设备中,其他进程要插入插件、动态库,需利用环境变量DYLD_INSERT_LIBRARIES,任何一个进程只要DYLD_INSERT_LIBRARIES中有东西会立刻马上去加载执行了,若想插入自己写的代码,可以封装成插件

5.dumpdecrypted

Github开源工具。 dumpdecrypted这个工具就是通过建立一个名为dumpdecrypted.dylib的动态库,插入目标应用实现脱壳。

I.make编译生成dumpdecrypted.dylib和dumpdecrypted.o两个文件

image

II.拷贝dumpdecrypted.dylib到iPhone6越狱机根目录下scp -P 12345 dumpdecrypted.dylib [email protected]:/var/root
移动到手机/var/mobile目录下,因为mobile用户执行dump命令时要有写的权限,而mobile用户在/var/root目录下是没有写的权限的,所以要拷贝到mobile用户有写的权限的目录下/var/mobile执行命令,才能成功dump出来
mv dumpdecrypted.dylib /var/mobile/,切换为mobile用户
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/21CF3978-5308-4420-A7AA-615089512B70/Aweme.app/Awemedump成功抖音Aweme.decrypted
image

将砸壳后的抖音Aweme.decrypted拷贝到Mac桌面
scp -P 12345 [email protected]:/var/mobile/Aweme.decrypted ~/Desktop/
image

图片.png

6.frida-ios-dump

A.Mac安装方式

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

I.查看python版本python -V
II.查看pip版本 pip -V
安装pip:sudo easy_install pip,若安装pip3遇到如下报错 sudo easy_install pip3

Password:
Searching for pip3
Reading https://pypi.org/simple/pip3/
Couldn't find index page for 'pip3' (maybe misspelled?)
Scanning index of all packages (this may take a while)
Reading https://pypi.org/simple/
No local packages or working download links found for pip3
error: Could not find suitable distribution for Requirement.parse('pip3')

解决办法

curl -O https://bootstrap.pypa.io/get-pip.py
sudo python3 get-pip.py
image

遇到警告,sudo后面加-H

WARNING: The directory '/Users/cloud/Library/Caches/pip' or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you should use sudo's -H flag.
图片.png

III.sudo pip install frida-tools\sudo pip3 install frida-tools
若报警告WARNING: The directory '/Users/cloud/Library/Caches/pip' or its parent directory is not owned or is not writable by the current user. The cache has been disabled. Check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.前面加sudo -H pip3 install frida-tools

image

B.iOS安装方式

I.添加源https://build.frida.re,安装frida

图片.png

进入/opt/MonkeyDev/bin目录执行frida-ps列出所有进程


image

frida-ps -U此时列出USB连接的进程

image

frida的作用:
/opt/MonkeyDev/bin下直接进入具体应用
frida -U 微信
报错是因为我的手机里面安装了一个正版微信,一个砸壳微信

Failed to spawn: ambiguous name; it matches: 微信 (pid: 5952), 微信 (pid: 3456)

frida -U 支付宝,前提是支付宝在前台运行,可正常进入,并能执行frida语句,语法见官网doc

图片.png

执行ObjC的打印
图片.png

C.dump-ios-ipa,以微信为例,dump出微信.ipa包

I.Install frida on device,添加源,在越狱iOS设备中安装frida,如上问B.iOS安装方式
II.sudo pip3 install -r requirements.txt --upgrade


图片.png

III.开启端口映射,执行sh usbConnect.sh或iproxy 12345 22,为什么要有这一步,试想,因为最终要从越狱iPhone设备上拷贝出砸壳后的.ipa包出来,必定要操作手机,需要连接Mac到iPhone,需要端口号映射


图片.png

IV.执行./dump.py 微信,若遇到
Traceback(most recent call last):
File "./dump.py",line 11,in 
import frida
ImportError:No module named frida

解决办法是将dump.py中的python改为python3,python版本是2改为python2,是python3就改为python3,通过python --version查看当前版本


图片.png

V.若遇到端口报错,要先开启端口映射执行sh usbConnect.sh或iproxy 12345 22,同时要求改dump.py文件中的User(用户名)、Password(密码)、Host(主机名)和Port(端口号)。

[Error None] Unable to connect to port 2222 on 127.0.0.1or ::1
Try specifying -H/--hostname and/or -p/--port
图片.png

VI.执行./dump.py 微信,dump成功微信.ipa包在dump.py同级目录下


图片.png

图片.png
图片.png

VII.若想全局使用dump.py则将dump.py和dump.js两个文件拷贝到Monkey目录下,并在.zshrc文件中将Monkey目录配置环境变量,通过which dump.py命令可查看dump.py是/opt/MonkeyDev/bin/dump.py目录中的dump.py


图片.png

图片.png

图片.png

D.默认越狱手机中不支持中文输入,拷贝.inputrc到手机中

scp -P 12345 .inputrc root@localhost:/var/root/

图片.png

set convert-meta off
set output-meta on   允许向终端输出中文
set meta-flag on
set input-meta on   允许向终端输入中文
图片.png

你可能感兴趣的:(iOS-逆向22-砸壳)