iOS逆向与安全8.1:砸壳、初识Theos

砸壳

软件脱壳,顾名思义,就是对软件加壳的逆操作,把软件上存在的壳去掉(解密)。

砸壳原理

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

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

  • iOS应用运行原理
iOS逆向与安全8.1:砸壳、初识Theos_第1张图片
应用运行原理

砸壳工具

1、Clutch

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

Clutch使用

安装

  • 官网: https://github.com/KJCracks/Clutch

  • 找到发布版本

  • 下载最新的


    iOS逆向与安全8.1:砸壳、初识Theos_第2张图片
    image.png

使用

  • 映射端口


    image.png
  • 拷贝工具到手机 放在usr/bin


    拷贝工具到手机
  • 列出可以砸壳的应用列表 $Clutch -i


    image.png
  • 砸壳 $Clutch –d 应用ID


    砸壳
iOS逆向与安全8.1:砸壳、初识Theos_第3张图片
完成

2、dumpdecrypted

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

安装

  • 官网 :https://github.com/stefanesser/dumpdecrypted 直接Git Clone

  • 通过Make 编译生成动态库


    Make 编译
iOS逆向与安全8.1:砸壳、初识Theos_第4张图片
生成动态库
  • 远程拷贝到手机


    image.png
  • 通过DYLD_INSERT_LIBRARIES 环境变量插入动态库执行

iOS逆向与安全8.1:砸壳、初识Theos_第5张图片
DYLD_INSERT_LIBRARIES脱壳

DYLD_INSERT_LIBRARIES 脱壳得到可行性文件 xxxx.decrypted 文件

DYLD_INSERT_LIBRARIES 使用
查看当前进程

ps -A
iOS逆向与安全8.1:砸壳、初识Theos_第6张图片
image.png

插入进程
DYLD_INSERT_LIBRARIES=动态库文件 进程

DYLD_INSERT_LIBRARIES=xxxx.framework/xxxx /var/mobile/Containers/Bundle/Application/XXXXX.app/XXXMacho
进入执行

3、frida-ios-dump

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

安装frida

Mac电脑安装方式:

查看python版本,Mac都是自带的


image.png

查看pip版本


image.png

安装frida $sudo pip install frida-tools


iOS逆向与安全8.1:砸壳、初识Theos_第7张图片
image.png

*目录不归当前用户所有。请检查该目录的权限和所有者.需要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逆向与安全8.1:砸壳、初识Theos_第8张图片
安装完成查看应用

iOS安装方式:
1、添加源 https://build.frida.re

2、安装Frid

iOS逆向与安全8.1:砸壳、初识Theos_第9张图片
image.png
  • 安装完成查看应用
    frida-ps -U 查看usb设备应用


    iOS逆向与安全8.1:砸壳、初识Theos_第10张图片
    image.png
  • 附加到进程

frida -U XXX
frida -U 微信 附加到微信进程

iOS逆向与安全8.1:砸壳、初识Theos_第11张图片
image.png
  • 查看进程对象
$ ObjC 
image.png
iOS逆向与安全8.1:砸壳、初识Theos_第12张图片
image.png

Mac配置ios-dump
下载脚本
$sudo git clone https://github.com/AloneMonkey/frida-ios-dump
dump.py配置登录

vi dump.py
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 微信

查看砸壳的文件


image.png

配置全局运行环境
复制frida文件到LHShell

编辑脚本

vi dumpIPA.sh 

使用
sh dumpIPA.sh XXX应用

sh  dumpIPA.sh 微信
image.png
iOS逆向与安全8.1:砸壳、初识Theos_第13张图片
image.png

4 LLDB砸壳 手动砸壳

  • 读取Macho信息
otool -l | Wechat | grep cryp

cryptoff 加密开始位置
cryptsize 加密模块
cryptid 1 加密算法 标识
Macho加密信息

原理: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
解密开始

iOS逆向与安全8.1:砸壳、初识Theos_第14张图片
解密完成

完成后,在./目录下,decrpyted.bin文件即为解密后的Macho加密部分文件,


完成目录
  • 写入文件 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文件,依然显示加密


写入完成查看macho文件

此时,实际已经解密了,只是加密标识字段cryptid未变而已,手动改成0即可


iOS逆向与安全8.1:砸壳、初识Theos_第15张图片
image.png

注意:macho文件加密后加密前文件一样大,主要因为内核加载位置和加载大小,所以采用的加密方式不会改变文件大小

Cycript使用

解决
.inputrc 文件登录手机后的不能输入中文的问题,运行向终端输入中文

vi .inputrc

拷贝到手机

scp -p port .inputrc [email protected]:~

登录手机使用vim
安装Vi IMproved(vim) 和 adv-cmds(命名行支持工具)插件 以及Cycript(使用Cycript)插件

Cycript 使用

登录 ps -A查看进程,然后用cycript -p 附加到应用进程

cycript -p 微信
cycript附加成功

导入cy文件
登录手机后

cd /usr/bin

拷贝cy脚本(封装的cycript命名脚本)到/usr/bin/cycript0.9 目录下


image.png

然后登录手机 cycript附加应用 引入脚本即可


iOS逆向与安全8.1:砸壳、初识Theos_第16张图片
image.png

为了避免命令重复,可以cy脚本放到/usr/bin/cycript0.9.com文件夹下


iOS逆向与安全8.1:砸壳、初识Theos_第17张图片
image.png

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 
iOS逆向与安全8.1:砸壳、初识Theos_第18张图片
image.png

配置全局环境变量 配置到PATH中
base_profile中修改


iOS逆向与安全8.1:砸壳、初识Theos_第19张图片
image.png

theos创建项目 写插件

  • nic.pl
nic.pl

  • 选择twaek插件
  • 输入包名
  • 输入依赖包名


    iOS逆向与安全8.1:砸壳、初识Theos_第20张图片
    创建twaek工程

makefile 配置连接ip和端口

iOS逆向与安全8.1:砸壳、初识Theos_第21张图片
makefile 配置连接ip和端口

在xm文件中写插件实现

make编译 写完make编译


iOS逆向与安全8.1:砸壳、初识Theos_第22张图片
image.png

打包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 目录

你可能感兴趣的:(iOS逆向与安全8.1:砸壳、初识Theos)