砸壳
软件脱壳,顾名思义,就是对软件加壳的逆操作,把软件上存在的壳去掉(解密)。
砸壳原理
- 应用加壳(加密)
提交给Appstore发布的App,都经过官方保护而加密,这样可以保证机器上跑的应用是苹果审核过的,也可以管理软件授权。经过App Store加密的应用,我们无法通过Hopper等反编译静态分析,也无法Class-Dump,在逆向分析过程中需要对加密的二进制文件进行解密才可以进行静态分析,这一过程就是大家熟知的砸壳(脱壳)。本质为dump出内存中的二进制文件 - 应用砸壳(解密)
- 静态砸壳
静态砸壳就是在已经掌握和了解到了壳应用的加密算法和逻辑后在不运行壳应用程序的前提下将壳应用程序进行解密处理。静态脱壳的方法难度大,而且加密方发现应用被破解后就可能会改用更加高级和复杂的加密技术
2.动态砸壳
动态砸壳就是从运行在进程内存空间中的可执行程序映像(image)入手,来将内存中的内容进行转储(dump)处理来实现脱壳处理。这种方法实现起来相对简单,且不必关心使用的是何种加密技术。
- iOS应用运行原理
砸壳工具
1、Clutch
Clutch是由KJCracks开发的一款开源砸壳工具。工具支持iPhone、iPod Touch、iPad,该工具需要使用iOS8.0以上的越狱手机应用。
Clutch使用
安装
官网: https://github.com/KJCracks/Clutch
找到发布版本
-
下载最新的
使用
-
映射端口
-
拷贝工具到手机 放在usr/bin
-
列出可以砸壳的应用列表 $Clutch -i
-
砸壳 $Clutch –d 应用ID
2、dumpdecrypted
Github开源工具。 dumpdecrypted这个工具就是通过建立一个名为dumpdecrypted.dylib的动态库,插入目标应用实现脱壳。
安装
官网 :https://github.com/stefanesser/dumpdecrypted 直接Git Clone
-
通过Make 编译生成动态库
Make 编译
-
远程拷贝到手机
通过DYLD_INSERT_LIBRARIES 环境变量插入动态库执行
DYLD_INSERT_LIBRARIES 脱壳得到可行性文件 xxxx.decrypted 文件
DYLD_INSERT_LIBRARIES 使用
查看当前进程
ps -A
插入进程
DYLD_INSERT_LIBRARIES=动态库文件 进程
DYLD_INSERT_LIBRARIES=xxxx.framework/xxxx /var/mobile/Containers/Bundle/Application/XXXXX.app/XXXMacho
![](http://img.e-com-net.com/image/info10/a7b5eac83c8f46aabb613679736f81f4.jpg)
3、frida-ios-dump
该工具基于frida提供的强大功能通过注入js实现内存dump然后通过python自动拷贝到电脑生成ipa文件。
安装frida
Mac电脑安装方式:
查看python版本,Mac都是自带的
查看pip版本
安装frida $sudo pip install frida-tools
*目录不归当前用户所有。请检查该目录的权限和所有者.需要sudo的-H标志。
sudo -H 。set-home 将 HOME 变量设为目标用户的主目录
$sudo-H pip install frida-tools
- Uninstalling a distutils installed project (six) $sudo pip install frida –upgrade –ignore-installed six
iOS安装方式:
1、添加源 https://build.frida.re
2、安装Frid
-
安装完成查看应用
frida-ps -U 查看usb设备应用
附加到进程
frida -U XXX
frida -U 微信 附加到微信进程
- 查看进程对象
$ ObjC
Mac配置ios-dump
下载脚本
$sudo git clone https://github.com/AloneMonkey/frida-ios-dump
dump.py配置登录
vi dump.py
进入目录安装依赖
$sudo pip install -r /opt/dump/frida-ios-dump/requirements.txt –upgrade
有可能报错。
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 版本
卸载
$ sudo pip uninstall prompt-toolkit
安装指定版本
$ sudo pip install prompt-toolkit==1.0.6
dump.py 砸壳
登录后 dump.py砸壳
./dump.py 应用名或者bundle id
./dump.py 微信
查看砸壳的文件
![](http://img.e-com-net.com/image/info10/576976d569294187853f4cff11bae975.jpg)
配置全局运行环境
复制frida文件到LHShell
编辑脚本
vi dumpIPA.sh
使用
sh dumpIPA.sh XXX应用
sh dumpIPA.sh 微信
4 LLDB砸壳 手动砸壳
- 读取Macho信息
otool -l | Wechat | grep cryp
cryptoff 加密开始位置
cryptsize 加密模块
cryptid 1 加密算法 标识
原理:Macho header + lldb解密的Macho加密部分,即为完整的解密的Macho文件
- 连接手机
- 启动debugserver
- 启动lldb
- 连接 debugserver 到服务
- image list 找到Macho首地址
- 读取 --fore以字节读取, --outfile 拷贝, 到./目录下,解密过的二进制文件存储为 decrpyted.bin ,--binary 二进制文件,--count个数(cryptsize),地址macho头地址+ 加密开始地址(cryptoff)
memory read --fore --outfile 目标路劲 --binary --count 数量 开始地址+加密开始偏移地址
memory read --fore --outfile ./decrpyted.bin --binary --count 10000 0x0000011323+1230
![](http://img.e-com-net.com/image/info10/5ef993ccb2cc437cbe90b97abdfd611d.jpg)
完成后,在./目录下,decrpyted.bin文件即为解密后的Macho加密部分文件,
![](http://img.e-com-net.com/image/info10/78adfe52bc634cf789e9bc656fa8050c.jpg)
- 写入文件 dd seek=起始位置 bs=1写入方式,写入大小,1:一个字节一个字节写入, convc:转换配置,notrunc:不截取,只写入指定位置和大小,其余部分不变。if=./decrpyted.bin 要写入的文件.of=./Wechat 被写入输出文件
注意:被写入的文件为原始未解密的Wechat Macho文件,保证文件不会出错
dd seek=起始位置 bs=写入方式 convc=转换配置 if=写入文件 of=被写入输出文件
dd seek=cryptoff bs=1 convc=notrunc if=./decrpyted.bin of=./Wechat
写入后查看macho文件,依然显示加密
此时,实际已经解密了,只是加密标识字段cryptid未变而已,手动改成0即可
注意:macho文件加密后加密前文件一样大,主要因为内核加载位置和加载大小,所以采用的加密方式不会改变文件大小
Cycript使用
解决
.inputrc 文件登录手机后的不能输入中文的问题,运行向终端输入中文
vi .inputrc
拷贝到手机
scp -p port .inputrc [email protected]:~
![](http://img.e-com-net.com/image/info10/59fdd2d11faf4e9fa3b0bfbe6c91f600.jpg)
登录手机使用vim
安装Vi IMproved(vim) 和 adv-cmds(命名行支持工具)插件 以及Cycript(使用Cycript)插件
Cycript 使用
登录 ps -A查看进程,然后用cycript -p 附加到应用进程
cycript -p 微信
![](http://img.e-com-net.com/image/info10/587652598bbf4b7ab762f6305669010a.jpg)
导入cy文件
登录手机后
cd /usr/bin
拷贝cy脚本(封装的cycript命名脚本)到/usr/bin/cycript0.9 目录下
![](http://img.e-com-net.com/image/info10/d99b2429e0ec4bd790601816f6a2a96e.jpg)
然后登录手机 cycript附加应用 引入脚本即可
为了避免命令重复,可以cy脚本放到/usr/bin/cycript0.9.com文件夹下
Theos
Theos,强大越狱开发工具。最初由DHowett进行开发,后面有Adam Demasi 维护并加了很多全新功能。
官网https://github.com/theos/theos
安装方法https://github.com/theos/theos/wiki/Installation-macOS
安装目录 ~/theos 可以自己修改
echo "export THEOS=~/theos" >> ~/.profile
使用
执行
cd 到Theos安装目录下
$ THEOS/bin/nic.pl
配置全局环境变量 配置到PATH中
base_profile中修改
theos创建项目 写插件
- nic.pl
nic.pl
- 选择twaek插件
- 输入包名
-
输入依赖包名
makefile 配置连接ip和端口
在xm文件中写插件实现
make编译 写完make编译
打包make package
安装 make install
或者 make package; make install
总结
011--越狱砸壳
- 应用砸壳:一般在客户端的应用为了防止别人反编译会对可执行文件进行加密保护(加壳),我们的砸壳就是解密的过程
- 静态砸壳
- 知道了应用的加密算法和逻辑。在不需要运行应用的情况下,直接使用工具进行解密。这种方案难度很大,成本高。加密算法一旦改变,解密工具就失效。
- 动态砸壳
- 在应用启动之后,从内存中找到应用的位置,导出内存中的数据。因为应用能够运行就必然被CPU读取。二CPU也只能读取解密之后的可执行文件。所以导出内存中的数据就是解密之后的数据。
- 应用运行原理
- 加密应用从磁盘载入内存的过程中,有内核调用解密程序进行解密。
- 解密之后的可执行文件由DYLD载入内存。
- 静态砸壳
- Clutch(命令行工具)
- Clutch -i 列出可砸应用
- Clutch -d 应用编号、BundleID
- 导出的是ipa包!
- dumpdcrypted(.dylib库)
- 通过 DYLD_INSERT_LIBRARIES环境变量,插入动态库,载入某个应用执行动态库代码进行砸壳。
- 导出的 MachO
- frida-ios-dump(利用frida加载脚本砸壳工具)
- 安装frida。Mac 和 iPhone。
- 下载frida-ios-dump 脚本工具
- 执行dump.py脚本 参数是应用名称 : 导出的是ipa包
- Cycript
- 越狱手机安装Cycript插件,依赖插件 adv-cmds
- 依附程序
- cycript -p 进程ID/名称
- cy文件路径
- /usr/lib/cycript0.9 目录