前前言
Lanotalium(Lanota可视化制谱器)的开发基本上也算完成了,闲的没事,把前些天尝试破解Cytus2谱面校验的过程记录下来,免得以后要用的时候自己都不知道搞过逆向(x
前言
Cytus2 iOS版发布了,立刻拿出来研究一番,il2CppDumper,启动!IDA,启动!
一看Dumper还有了新功能生成DummyDll,dnSpy,启动!
看起来比台湾诺西高到不知道哪里去了,直接加密了谱面,而不是采用校验的方式
一路查找KeyStore来历
查KeyStoreFactory.Create
其中反序列化了一段二进制文件,调用了IKeyStoreExtension.Init,跳转
发现了和string ”ASSET“ 比较了一番
初始化了一个Aes加密和另一个啥玩意,不过不重要,注意到解密谱面的时候
用的就是ASSET这个来寻找加密器,接下来就分析AesEncryptor
构造函数和一个静态解密方法中传递了Key数组,我们寻找一下这个静态函数的调用
发现接口函数实际上也调用了他,所以分析此静态函数就好
猜想解密的时候会调用此函数,我也打算学习一个动态调试,破解由此展开
环境
Windows:
- VMWare Workstation 12
- macOS 10.13 High Sierra 镜像
- 能玩Cytus2的越狱iOS设备
配置
- 按这篇文章装好macOS虚拟机与VMWare Tools
- 在macOS上下载并安装xcode
- 在macOS里去iFunbox官网下载iFunbox
- 打开xcode,把你的iOS设备与电脑连接
- xcode中 Window-Devices and Simulators 添加你的iOS设备
准备
以下步骤均在macOS中操作
1.usbmuxd
- 点击下载
- 打开命令行窗口
A
(窗口比较多,做个记号)切换到/usbmuxd-1.0.8/python-client
- 接着
sudo python ./tcprelay.py -t 22:2222
这个窗口就可以放着不动了
2.debugserver
- 打开iFunbox,点击Raw File System
- 去
/Developer/usr/bin
下,把debugserver拖出来 - 开启新命令行窗口
B
,切换到debugserver目录
lipo -thin arm64 debugserver -output debugserver
(若你是iPhone5/5c等32位设备请把arm64换为armv7s) - 新建一个文件,贴入以下文本,命名为
ent.xml
,放到debugserver旁边
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<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
,没错,-Sent.xml
没有空格,没有ldid
就brew install ldid
一下,没有brew
自己百度装brew
(x - 再次打开iFunbox,把debugserver复制到iOS设备中的
/usr/bin
中
3.连接
- 在命令行窗口
B
,切换到/usbmuxd-1.0.8/python-client
输入sudo python ./tcprelay.py -t 12345:12345
,也可以放着不动了 - 开启新命令行窗口
C
,输入ssh root@localhost -p 2222
,SSH连接到iOS设备,密码一般是alpine - 输入
ps -ef | grep "cytus2"
记下cytus2的pid
- 输入
debugserver *:12345 --attach pid
,此处为1650 - 你会发现cytus2中断运行了,命令行窗口
C
也可放着不管了
破解
- 打开命令行窗口
D
,敲lldb
,回车,发现C
,D
同时走字,即连接iOS设备上的debugserver成功 - 打开IDA,运行il2CppDumper提供的导入符号py脚本,定位至
AesEncryptor$$_Decrypt
- 记录下地址
0x00000001000C5D74
- 回到命令行窗口
D
,键入process connect connect://127.0.0.1:12345
,等待连接
- 显示如图则连接完成
- 键入
image list -o -f
,拖到[1]项
- 记录下模块地址
0x00000000000b4000
- 则实际代码地址为
0x00000000000b4000 + 0x00000001000C5D74 = 0x0000000100179D74
- 在命令行
D
输入br s -a 0x0000000100179D74
下断点 - 输入
c
继续cytus2运行,随便进首歌
- 断点命中!再看看函数形参列表
- key位于第四项,输入
p $x4
输出他的地址
- 并不知道byte[]这个类的结构,先看内存为敬
- 发现这个16很可疑,因为密钥长度可以为16
- 再次dump后面的内存
- 则密钥已呈现在眼前
- Aes还需要一个IV向量才能解密,返回IDA
- 经过我对注释位置下断点并单步调试得出设置IV向量的位置
- 类似方法得到IV向量,发现竟然就是谱面文件5-20字节,这也和调用解密函数的第二个参数offset相吻合,为20
总结
- 至此Cytus2破解工作已经结束
- 解密只需用得到的Key,提取谱面5-20字节部分作IV向量,解密21字节及以后的部分,并用UTF8编码读出即可
- 加密随机得到IV向量,先写入c2cd前缀,再写入IV向量,再写入加密数据即可
声明
- 破解仅为学习使用,不会用于盗版或商用,用途包含自制导入,谢谢