[原创]iOS 11上的破解入门教程
前言
我是个新手,接触iOS逆向破解没几个月,网上教程资料看了很多,知识点比较零散,使用的工具大都是针对iOS 10之前的,在iOS 11上基本无法使用,弯路走了不少,经过多次试验,最终摸索出了自己的破解思路和风格。
网上已经有很多基于CydiaSubstrate的越狱开发教程,使用theos、MonkeyDev进行开发非常方便、高效,而本文则是脱离CydiaSubstrate,以非Unity游戏《干掉月亮》(Shoot The Moon)为例,纯手工打造动态库,注入到游戏中实现破解,虽说效率不比使用CydiaSubstrate来的高,但是能学到很多基本的知识,非常适合新手入门。
准备工作
设备
- 一部越狱的iPhone手机(iOS 11.0~11.1.2)
- 一台Mac机
macOS上的工具
- Xcode
- Terminal
- Console
- ssh
- scp
- Homebrew
- usbmuxd
- macho_edit
- Hopper Disassembler
- Impactor
iOS上的工具
- bfinject
- applst
App
- 《干掉月亮》(Shoot The Moon)
下载安装
Xcode
从App Store下载,或者从苹果开发者页面下载都可以,下载最新版即可。
Terminal
macOS自带。许多命令需要在终端上执行。
Console
macOS自带。查看手机日志。
ssh
macOS自带。通过电脑登录手机。
scp
macOS自带。在手机和电脑间互传文件。
Homebrew
从Homebrew官网(brew.sh)下载安装。
用于安装各种命令行工具。
usbmuxd
打开Terminal,使用Homebrew安装。
$ brew install usbmuxd # 或者 $ brew install libidevicemobile
将iPhone上的端口通过usb线映射到电脑上的端口。
macho_edit
从https://github.com/Tyilo/macho_edit下载源码。
编译后可以得到macho_edit可执行文件。
用于编辑App的可执行文件。
Hopper Disassembler
请自行搜索下载安装。
用于反编译App。
Impactor
从Cydia Impactor官网(www.cydiaimpactor.com)下载。
用于安装ipa到手机。
bfinject
从https://github.com/BishopFox/bfinject下载。
根据说明文档,将bfinject放到iPhone中。
用来砸壳、动态库注入等。
applst
从https://github.com/DeviLeo/AppList下载。
根据说明文档,将命令行版的applst放到iPhone中。
用于列出手机上安装的App及文档目录。
《干掉月亮》(Shoot The Moon)
从App Store下载。
这是一款有趣好玩的游戏。
破解
开局一台机,过程全靠猜。
下面正式进入破解阶段,我会非常啰嗦地写下所有的步骤。
如果您有一定地开发经验,尽情跳过所有已会的步骤。
砸壳
从App Store下载下来的App都是加密的,直接复制出来是无法使用Hopper Disassembler看到任何代码的,所以我们需要砸壳解密。
使用usbmuxd
如果你的Wifi环境不是很理想,可以使用usbmuxd映射端口走usb线。
此处我们映射iPhone上的ssh端口22到macOS上的2222端口,输入以下命令。
$ iproxy 2222 22
ssh登录iPhone
默认密码是 alpine。
# -p 后面跟端口,默认是22 $ ssh root@localhost -p 2222 root@localhost's password: # 输入密码,默认密码是alpine
查询名称及进程ID
启动《干掉月亮》,查询App名称和进程ID。
因为《干掉月亮》的英文名是《Shoot The Moon》,所以我们在搜索进程的时候使用grep来筛选出带有moon的输出行。
$ ps -e | grep moon 1975 ?? 0:59.42 /var/containers/Bundle/Application/24546F40-53DA-4C49-81C0-DED0C13DB814/shootthemoon.app/shootthemoon
砸壳
有了App名称和进程ID,我们就可以使用bfinject来砸壳了。
# 以下两条命令二选一,推荐使用App名称 # 使用App名称 $ bash bfinject -P shootthemoon -L decrypt # 使用进程ID $ bash bfinject -p 1975 -L decrypt # 输出结果 [+] Liberios detected [+] Injecting into '/var/containers/Bundle/Application/24546F40-53DA-4C49-81C0-DED0C13DB814/shootthemoon.app/shootthemoon' [+] Getting Team ID from target application... [+] Thinning dylib into non-fat arm64 image [+] Signing injectable .dylib with Team ID A6DVR4V967 and platform entitlements... [bfinject4realz] Calling task_for_pid() for PID 1975. [bfinject4realz] Calling thread_create() on PID 1975 [bfinject4realz] Looking for ROP gadget... found at 0x1826574e0 [bfinject4realz] Fake stack frame at 0x10b624000 [bfinject4realz] Calling _pthread_set_self() at 0x182897804... [bfinject4realz] Returned from '_pthread_set_self' [bfinject4realz] Calling dlopen() at 0x182657460... [bfinject4realz] Returned from 'dlopen' [bfinject4realz] Success! Library was loaded at 0x1c41e2d00 [+] So long and thanks for all the fish.
命令执行完成并不表示砸壳已经完成,需要以App界面的提示为准。
下图为砸壳中,务必保持屏幕常亮。
注意:上传附件及图片大小不得大于30M。
⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。
