目前针对iOS14,checkra1n能做到最简洁的一键不完美越狱。
ios手机端配置
- 手机端cydia 添加源:
https://build.frida.re
- 搜索Frida,进行安装
- 安装成功验证
iPhone:~ root# ps -ax | grep frida
409 ?? 0:00.89 /usr/sbin/frida-server
2050 ttys000 0:00.01 grep frida
ps -ax | grep frida 为执行命令,看到如上打印即可
Mac端
我们需要安装python ,pip ,frida ,frida-tools。由于Mac自带的Python版本为2.7.x.不建议使用了,因此安装了Python3.7.7版本。如下:
- brew install wget //安装wget
- wget https://bootstrap.pypa.io/get-pip.py
- sudo python3 get-pip.py
- sudo pip3 install frida //安装frida
- sudo pip3 install frida-tools //安装frida
配置frida-ios-dump环境
- 从github下载代码命令: sudo mkdir /opt/dump && cd /opt/dump && sudo git clone https://github.com/AloneMonkey/frida-ios-dump
- 根据插件文档equirements.txt安装依赖 :sudo pip3 install -r /opt/dump/frida-ios-dump/requirements.txt --upgrade
- dump.py 中默认参数第35行的User,Password,Host,Port可按需进行修改
连接iPhone设备
brew安装usbmuxd,usbmuxd自带工具iproxy,iproxy可以快捷连接iPhone操作
iproxy 2222 22 //执行如下命令把当前连接设备的22端口(SSH端口)映射到电脑的2222端口,那么想和设备22端口通信,直接和本地的2222端口通信就可以
Cydia 安装 openSSH,另开终端进程
ssh -p 2222 root@127.0.0.1
砸壳
python3 dump.py -l //查看所有app获取对应bundleID
python3 dump.py bundleID //执行完成在当前目录生成ipa
otool -l XXX | grep crypt //查看是否脱壳,该信息在LC_ENCRYPTION_INFO_64 Segment中
class-dump
- 下载对应版本:http://stevenygard.com/projects/class-dump/
-
open /usr/local/bin
打开终端,将class-dump文件复制到/usr/local/bin - 更改权限
sudo chmod 777 /usr/local/bin/class-dump
- 使用:
class-dump -H app文件路径 -o 头文件保存路径
- 只能针对纯OC,对于Swift 混编代码则会提示:
Error: Cannot find offset for address XXX in stringAtAddress:
Reveal
- Cydia安装Reveal2Loader
- 在设置中允许需要调试的App
- Mac端安装Reveal
- 在Help-Show Reveal Library in Finder中找到对应版本的RevealServer,复制到设备中:
scp -r /Users/XXX/RevealServer.xcframework/ios-arm64_i386_x86_64-simulator/RevealServer.framework root@127.0.0.1:/Library/Frameworks
或者通过其他助手复制到Library/Frameworks中都是可以的
动态调试
手机端App通过debugserver与Mac端的LLDB经过USB进行数据传输
这里有两种方式:一种是用Xcode来进行调试,因为Xcode只能调试开发者自己证书的应用,所以需要重签名App;另一种是命令行调用lldb来调试,需要对 debugserver 赋予更高的权限,因为默认的 debugserver 也只能调试自己证书的App
通过Xcode:
- 打开 Xcode ,新建一个 demo, 并插上真机,完成 demo 在真机的调试
-
ls ~/Library/MobileDevice/Provisioning\ Profiles
找到demo的描述文件 - 下载重签名软件 iReSign
- 重签名,分别填入砸壳后的ipa,demo的描述文件,demo的BundleID,勾选修改ID,对应的证书
- 原路径下生成重签包,如果包含appex,需要针对每一个ID进行修改;或者暴力一点直接删除 Plugins 文件夹和 Watch文件夹
- 把重签名的App安装到手机上并运行
- Xcode - Debug - Attach to Process by PID or Name 输入进程ID或者名称即可进入调试
通过debugserver + lldb:
使用iproxy将接设备的端口(SSH)映射到电脑端口
iproxy 2222 22
SSH到USB设备
ssh -p 2222 root@127.0.0.1
将设备的debugserver拷贝到电脑端
scp -P2222 root@127.0.0.1:/Developer/usr/bin/debugserver ~/Desktop
安装ldid
brew install ldid
-
拷贝如下代码,保存成ent.xml,放到同一级目录下,该xml实际上就是给debugserver添加了task_for_pid权限
<plist version="1.0"> <dict> <key>com.apple.springboard.debugapplications</key> <true/> <key>get-task-allow</key> <true/> <key>task_for_pid-allow</key> <true/> <key>run-unsigned-code</key> <true/> </dict> </plist>
执行
ldid -Sent.xml debugserver
进行签名将增加权限的debugserver拷贝回设备
scp -P2222 ~/debugserver root@127.0.0.1:/usr/bin/debugserver
ps -ef
查看当前的进程列表执行
debugserver *:1234 -a prossesname/pid
将debugserver附加到进程,并开启1234端口,等待来自IP的LLDB接入在Mac系统执行
iproxy 1234 1234
将本地端口映射到手机端口在Mac系统启动lldb然后执行
process connect connect://localhost:1234
image list -o -f
找到对应进程的基地址,再配合静态分析获取到的偏移地址就可以动态调试了如遇到error: rejecting incoming connection from ::ffff:127.0.0.1 (expecting ::1)报错,则可将第9步改为debugserver 127.0.0.1:1234 XXX
如遇到error: failed to get reply to handshake packet 报错,则可将第9步把debugserver启动试设置的监听 *:1234 改成 localhost:1234
另附上 设备文件结构
-
./Applications
:存放系统默认预装的应用,不包括从App Store下载安装的应用 -
./Developer
:存放与开发调试相关的文件和工具二进制文件,当设备连接Xcode时选择了“Use for Development”才会被创建 -
./Library
:存放系统应用数据、帮助文件、文档等-
./Library/Keychains
:设备系统级密码等存放目录 -
./Library/Logs
:系统日志存放目录,./var/logs
也指向此目录 -
./Library/Logs/CrashReporter
:系统进程崩溃日志目录
-
-
./System
:只包含一个名为Library的目录,这个子目录中存放了系统的绝大部分组件,如各种framework,内核模块,字体文件等-
./System/Library/LaunchDaemon
:系统启动进程plist文件存放目录,若想不启动某进程,删除该目录下对应的plist的文件(操作需慎重,删除之前先备份) -
./System/Library/Frameworks
:公有框架(开发者可使用)存放目录 -
./System/Library/PrivateFrameworks
:私有框架(开发者不可使用)存放目录 -
./System/Library/CoreServices/SpringBoard.app
:桌面管理器应用,用户与系统交互的中介
-
-
./User
:用户目录,存放用户的个人资料和配置,iOS中实际指向/var/mobile -
./bin
:“binary”的简称,存放传统Unix命令(用户级基础功能二进制文件) -
./boot
:存放能使系统成功启动的所有文件,iOS中此目录为空 -
./cores
:内核转储文件存放目录,当一个进程崩溃时,如果系统允许则会产生转储文件 -
./dev
:“device”的简称,存放BSD设备文件。每个文件代表系统的一个块设备或字符设备 -
./etc
:“Et Cetera”的简称,存放系统脚本及配置文件,如passwd、hosts等。iOS/OS X中/etc实际指向./private/etc
-
./lib
:存放系统库文件、内核模块及设备驱动等,iOS中此目录为空 -
./mnt
:“mount”的简称,存放临时文件系统挂载点,iOS中此目录为空 -
./private
:存放/etc、/var,/sustem_data,/xarts四个链接目录的目标目录 -
./sbin
:“system binaries”的简称,存放Unix管理类命令(系统级基础功能的二进制文件),如netstat、reboot、fdisk、ifconfig等 -
./tmp
:存放临时文件目录,其权限为所有人任意读写,在OS X中实际指向./private/tmp
-
./usr
:存放大量工具和程序,第三方程序安装目录,其中./usr/lib
中存放了动态链接库 -
./var
:“variable”的简写,存放一些经常更改的文件,如日志、用户数据、临时文件等,iOS/OS X中./var
实际指向./private/var
。某些文件在./Library
和./var
都存在,比如Keychains数据、系统日志等-
./var/wireless/Library/CallHistory
:存放通话记录,网络流量,使用时间等记录 -
./var/mobile/Containers
:存放App Store应用相关文件,其中,子目录/Bundle
存放应用可执行文件,子目录/Data
存放应用数据 -
./var/mobile/Library/AddressBook
:存放联系人数据 -
./var/mobile/Library/Calendar
:存放日历及提醒事项记录文件 -
./var/mobile/Library/SMS
:存放短信 -
./var/mobile/Library/Safari
:存放Safari保存的书签等 -
./var/mobile/Media/PhotoStreamsData
:存放照片流
-