登陆越狱iphone砸壳简单记录

1,099 阅读4分钟

密码登陆

通过插件使用Wifi连接手机:ssh 用户名@手机IP地址,端口默认22

$ ssh root@192.168.1.112

默认密码:alpine

无密码登陆

客户端在~/.ssh/目录下生成公钥

$ ssh-keygen

拷贝公钥给SSH服务器

$ ssh-copy-id 用户名@服务器IP

注意:如果配置了之后,还需要输入密码. 需要给 authorized_keys 上一个 644 或者 777 权限

删掉保存的服务器地址的key

$ ssh-keygen –R 服务器IP地址(当SSH登录手机,手机就是服务器)

know_hosts文件:用于保存SSH登录服务器所接受的key

在系统~/.ssh 目录中保存

ssh_host_rsa_key.pub文件:作为SSH服务器发送给连接者的key

在系统/etc/ssh 目录中保存

别名登陆(方便多台手机登陆)

配置Config文件,在~/.ssh 目录下创建一个config文件。内部可以配置ssh登录的别名。

Host 别名
Hostname IP地址
User 用户名
Port  端口号

USB登陆

Python脚本端口映射

$ python tcprelay.py -t 22:12345 

将本地的12345端口映射到设备的TCP端口22(默认22).这样就可以通过本地的12345端口建立连接了。

通过USB进行SSH连接

$ ssh -p 12345 root@127.0.0.1

ssh连接本地的12345,由于做了端口映射,所以会通过usb连接对面设备的22端口。

Iproxy端口映射

homebrew安装libimobiledevice工具

$ brew install libimobiledevice

映射端口命令

$ iproxy 12345 22

ipa瘦身

当我们下载下来的ipa包为fat类型时,可以先瘦身:解压ipa包->在payload里替换macho->再重新打包

//瘦身命令
$ lipo WeChat -thin arm64 -output arm64_wechat
//顺便导出头文件
$ class-dump -H arm64_wechat -o ./Headers/
//打包命令
$ zip -ry WeChat.ipa Payload

砸壳

目前基本全部为动态砸壳,就是从运行在进程内存空间中的可执行程序映像(image)入手,来将内存中的内容进行转储(dump)处理来实现脱壳处理。

动态砸壳须满足的条件

  1. 正在运行(iOS的应用目前均为动态砸壳)
  2. 依赖库必须加载完毕(全部功能完全使用过)
//查看macho文件是否加密,id为1即为加壳
$ otool -l WeChat | grep cry

1.Clutch

iOS8.0以上可用,GitHub上可下载。

使用方式

  1. 先将Clutch执行文件(MachO)拷贝到手机上
$ scp -P 12345 Clutch root@localhost:/usr/bin
  1. 列出可以砸壳的应用
# Clutch -i
  1. 砸壳,3为列举出来的应用ID
# Clutch -d 3

2. dumpdecrypted

dumpdecrypted是通过越狱注入实现的。GitHub上可下载

越狱注入

越狱手机通过修改DYLD加载流程中_main函数的环境变量DYLD_INSERT_LIBRARIES来达到加载注入动态库的目的

//查看进程,方便查看app路径
# ps -A
//注入命令,只会执行一次,杀掉进程再打开就不会注入了,系统层级不会污染源程序,源程序“本地”防护无效
# DYLD_INSERT_LIBRARIES=注入库的路径 主程序的路径

dumpdecrypted砸壳流程

GitHub下载,通过make来编译砸壳工具,生成动态库dumpdecrypted.dylib->拷贝到手机->然后砸壳

# DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib 主程序的路径

砸壳后生成 主程序.decrypted 的MachO文件,把后缀去掉就是砸壳后的MachO文件

3. frida(主要使用,非完美越狱可以安装)

该工具基于frida提供的强大功能通过注入js实现内存dump然后通过python自动拷贝到电脑生成ipa文件。 其实frida是通过连接手机和手机通讯(OpenSSH),然后使用砸壳工具砸壳,拷贝到电脑上,打包等一系列操作,使用python封装起来的一个工具。

frida相对前两种简单方便,Mac和手机均要安装,Mac安装步骤如下:

//查看python版本,因为frida需要使用python脚本
$ python -V
//查看pip版本,pip
$ pip -V
//安装pip,是方便安装和管理python包的工具
$sudo easy_install pip
//安装frida,会自动帮你安装frida
$ sudo pip install frida-tools

如果报错提示:目录不归当前用户所有。请检查该目录的权限和所有者.需要sudo的-H标志,sudo -H意思是 set-home 将 HOME 变量设为目标用户的主目录,加上即可

$ sudo -H pip install frida-tools

Mac配置ios-dump

尽管monkeydev写了frida-ios-dump,但是它并没有依赖frida-ios-dump进去。 首先下载脚本

$ sudo mkdir /opt/dump
$ cd /opt/dump
$ sudo git clone https://github.com/AloneMonkey/frida-ios-dump

安装依赖

$ sudo pip install -r /opt/dump/frida-ios-dump/requirements.txt --upgrade

有可能报版本问题错误。 解决方式: 安装要求版本

$ sudo pip uninstall prompt-toolkit
$ sudo pip install prompt-toolkit==版本号

修改dump.py参数:

vim /opt/dump/frida-ios-dump/dump.py

User ='root'

Password ='alpine'

Host ='localhost'

Port = 1234

手机可添加源 build.frida.re 安装frida,砸壳出来的是ipa包。

dump.py依赖于电脑的frida。可以配置frida砸壳命令成脚本,frida-ios-dump项目文件夹放到脚本同一目录,方便以后调用。

/Users/Jimmy/DJShell/frida-ios-dump/dump.py $1 

当连接手机后终端显示不了中文,可以将.inputrc文件设置一下,然后拷贝到手机的home目录下。

frida简单使用

//列举电脑应用进程
$ frida-ps
//列举手机应用进程
$ frida-ps -U
//使用规则(./dump.py 应用名称/Bundle identifier)
$ ./dump.py 微信

其他实用工具:

  1. adv_cmds是手机的命令工具的一个补充(理解为相对于/usr/bin)
  2. Vi IMproved 工具想在手机用可以在源里面搜索插件
  3. Cycript非完美越狱貌似安装不了,非越狱cycript只能附加到一个应用上,越狱环境可以附加多个,包括系统进程

手机上越狱环境使用cycript

//附加命令
# cycript -p WeChat
# cycript -p 进程ID

cycript使用自定义 .cy文件,需要把文件拷贝到 /usr/lib/cycript/中.比较好的做法是参考作者的cy文件,com/saurik/substrate/MS.cy,MS.cy是作者写的好用调试工具。在com文件夹里创建自己的文件夹,有点类似于bundleID的命名规则(唯一性),作用显而易见.使用diyCycript.cy时要加上路径:

@import com.killtime.diyCycript

LLDB手动砸壳(砸壳的原理)

加密后的macho文件大小是不会变的。 其实过程就是:利用otool查看macho加密偏移和加密大小,当app的macho文件加载到内存后(打开app),读取一段内存(offset + cryptsize)覆盖原来加密的macho的内存段,通过machoview等修改crypyid为0(标志为解密)。

//先断住
(lldb) process interrupt
//lldb拷贝指令,./decrypted.bin是拷贝路径(当前电脑路径),--binary二进制形式读取,--count拷贝的大小,0x00000010000d300+16384是image list后主程序在内存上的地址+偏移量
(lldb) memory read --force --outfile ./decrypted.bin --binary --count 1232425 0x00000010000d300+13935
//合并文件,终端的dd命令,意思是指定一个大小的文件写入另外一个文件
//seek是偏移值,bs是一次读多少个字节,conv是用指定的参数转换文件,notrunc是不截取的意思(没有覆盖的地方不截断),if输入文件,of输出文件(这里就是覆盖文件,即未砸壳的macho文件),100M的文件大概10分钟左右。
$ dd seek=13935 bs=1 conv=notrunc if=./decrypted.bin of=./WeChat